diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-06-04 15:38:12 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-06-04 15:38:12 -0700 |
commit | e620d1e39aa33b43bed96aa7f2ebbc88914aed58 (patch) | |
tree | 0e8a0c36430f10c1e490464f1d6524ce5612f614 /drivers/media/video/ivtv/ivtv-streams.c | |
parent | d2dd328b7f7bc6cebe167648289337755944ad2a (diff) | |
parent | 666092c679f7d9eb9f5230087f960a487fda721c (diff) |
Merge branch 'v4l_for_2.6.35' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6
* 'v4l_for_2.6.35' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6: (87 commits)
V4L/DVB: ivtv: Timing tweaks and code re-order to try and improve stability
V4L/DVB: ivtv: Avoid accidental video standard change
V4L/DVB: ivtvfb : Module load / unload fixes
V4L/DVB: cx2341x: Report correct temporal setting for log-status
V4L/DVB: cx18, cx23885, v4l2 doc, MAINTAINERS: Update Andy Walls' email address
V4L/DVB: drivers/media: Eliminate a NULL pointer dereference
V4L/DVB: dvb-core: Fix ULE decapsulation bug
V4L/DVB: Bug fix: make IR work again for dm1105
V4L/DVB: media/IR: nec-decoder needs to select BITREV
V4L/DVB: video/saa7134: change dprintk() to i2cdprintk()
V4L/DVB: video/saa7134: remove duplicate break
V4L/DVB: IR/imon: add auto-config for 0xffdc rf device
V4L/DVB: IR/imon: clean up usage of bools
V4L/DVB: em28xx: remove unneeded null checks
V4L/DVB: ngene: remove unused #include <linux/version.h>
V4L/DVB: ak881x needs slab.h
V4L/DVB: FusionHDTV: Use quick reads for I2C IR device probing
V4L/DVB: Technotrend S2-3200 ships with a TT 1500 remote
V4L/DVB: drivers/media: Use kzalloc
V4L/DVB: m920x: Select simple tuner
...
Diffstat (limited to 'drivers/media/video/ivtv/ivtv-streams.c')
-rw-r--r-- | drivers/media/video/ivtv/ivtv-streams.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/drivers/media/video/ivtv/ivtv-streams.c b/drivers/media/video/ivtv/ivtv-streams.c index de4288cc188..9ecacab4b89 100644 --- a/drivers/media/video/ivtv/ivtv-streams.c +++ b/drivers/media/video/ivtv/ivtv-streams.c @@ -618,12 +618,17 @@ static int ivtv_setup_v4l2_decode_stream(struct ivtv_stream *s) struct ivtv *itv = s->itv; struct cx2341x_mpeg_params *p = &itv->params; int datatype; + u16 width; + u16 height; if (s->vdev == NULL) return -EINVAL; IVTV_DEBUG_INFO("Setting some initial decoder settings\n"); + width = p->width; + height = p->height; + /* set audio mode to left/stereo for dual/stereo mode. */ ivtv_vapi(itv, CX2341X_DEC_SET_AUDIO_MODE, 2, itv->audio_bilingual_mode, itv->audio_stereo_mode); @@ -646,7 +651,14 @@ static int ivtv_setup_v4l2_decode_stream(struct ivtv_stream *s) 2 = yuv_from_host */ switch (s->type) { case IVTV_DEC_STREAM_TYPE_YUV: - datatype = itv->output_mode == OUT_PASSTHROUGH ? 1 : 2; + if (itv->output_mode == OUT_PASSTHROUGH) { + datatype = 1; + } else { + /* Fake size to avoid switching video standard */ + datatype = 2; + width = 720; + height = itv->is_out_50hz ? 576 : 480; + } IVTV_DEBUG_INFO("Setup DEC YUV Stream data[0] = %d\n", datatype); break; case IVTV_DEC_STREAM_TYPE_MPG: @@ -655,9 +667,13 @@ static int ivtv_setup_v4l2_decode_stream(struct ivtv_stream *s) break; } if (ivtv_vapi(itv, CX2341X_DEC_SET_DECODER_SOURCE, 4, datatype, - p->width, p->height, p->audio_properties)) { + width, height, p->audio_properties)) { IVTV_DEBUG_WARN("Couldn't initialize decoder source\n"); } + + /* Decoder sometimes dies here, so wait a moment */ + ivtv_msleep_timeout(10, 0); + return 0; } @@ -697,6 +713,9 @@ int ivtv_start_v4l2_decode_stream(struct ivtv_stream *s, int gop_offset) /* start playback */ ivtv_vapi(itv, CX2341X_DEC_START_PLAYBACK, 2, gop_offset, 0); + /* Let things settle before we actually start */ + ivtv_msleep_timeout(10, 0); + /* Clear the following Interrupt mask bits for decoding */ ivtv_clear_irq_mask(itv, IVTV_IRQ_MASK_DECODE); IVTV_DEBUG_IRQ("IRQ Mask is now: 0x%08x\n", itv->irqmask); |