diff options
Diffstat (limited to 'linux/drivers/media/video/pvrusb2/pvrusb2-encoder.c')
-rw-r--r-- | linux/drivers/media/video/pvrusb2/pvrusb2-encoder.c | 51 |
1 files changed, 32 insertions, 19 deletions
diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-encoder.c b/linux/drivers/media/video/pvrusb2/pvrusb2-encoder.c index 2a93bcc96..6c66e258f 100644 --- a/linux/drivers/media/video/pvrusb2/pvrusb2-encoder.c +++ b/linux/drivers/media/video/pvrusb2/pvrusb2-encoder.c @@ -268,10 +268,10 @@ static int pvr2_write_encoder_vcmd (struct pvr2_hdw *hdw, u8 cmd, int pvr2_encoder_configure(struct pvr2_hdw *hdw) { int ret = 0, audio, i; - int vd_std = hdw->controls[PVR2_CID_STDCUR].value; - int height = hdw->controls[PVR2_CID_VRES].value; - int width = hdw->controls[PVR2_CID_HRES].value; - int height_full = !hdw->controls[PVR2_CID_INTERLACE].value; + v4l2_std_id vd_std = hdw->std_mask_cur; + int height = hdw->res_ver_val; + int width = hdw->res_hor_val; + int height_full = !hdw->interlace_val; int is_30fps, is_ntsc; @@ -288,9 +288,24 @@ int pvr2_encoder_configure(struct pvr2_hdw *hdw) pvr2_trace(PVR2_TRACE_ENCODER,"pvr2_encoder_configure"); - /* set stream output port. */ + /* set stream output port. Some notes here: The ivtv-derived + encoder documentation says that this command only gets a + single argument. However the Windows driver for the model + 29xxx series hardware has been sending 0x01 as a second + argument, while the Windows driver for the model 24xxx + series hardware has been sending 0x02 as a second argument. + Confusing matters further are the observations that 0x01 + for that second argument simply won't work on the 24xxx + hardware, while 0x02 will work on the 29xxx - except that + when we use 0x02 then xawtv breaks due to a loss of + synchronization with the mpeg packet headers. While xawtv + should be fixed to let it resync better (I did try to + contact Gerd about this but he has not answered), it has + also been determined that sending 0x00 as this mystery + second argument seems to work on both hardware models AND + xawtv works again. So we're going to send 0x00. */ ret |= pvr2_write_encoder_vcmd(hdw, CX2341X_ENC_SET_OUTPUT_PORT, 2, - 0x01, 0x02); + 0x01, 0x00); /* set the Program Index Information. We want I,P,B frames (max 400) */ ret |= pvr2_write_encoder_vcmd(hdw, CX2341X_ENC_SET_PGM_INDEX_INFO, 2, @@ -370,9 +385,9 @@ int pvr2_encoder_configure(struct pvr2_hdw *hdw) /* set video bitrate */ ret |= pvr2_write_encoder_vcmd( hdw, CX2341X_ENC_SET_BIT_RATE, 3, - (hdw->controls[PVR2_CID_VBR].value ? 1 : 0), - hdw->controls[PVR2_CID_AVERAGEVIDEOBITRATE].value, - (u32) (hdw->controls[PVR2_CID_PEAKVIDEOBITRATE].value) / 400); + (hdw->vbr_val ? 1 : 0), + hdw->videobitrate_val, + hdw->videopeak_val / 400); /* setup GOP structure (GOP size = 0f or 0c, 3-1 = 2 B-frames) */ ret |= pvr2_write_encoder_vcmd(hdw, CX2341X_ENC_SET_GOP_PROPERTIES, 2, is_30fps ? 0x0f : 0x0c, 0x03); @@ -384,13 +399,11 @@ int pvr2_encoder_configure(struct pvr2_hdw *hdw) ret |= pvr2_write_encoder_vcmd(hdw,CX2341X_ENC_SET_GOP_CLOSURE,1,0); /* set audio stream properties 0x40b9? 0100 0000 1011 1001 */ - audio = (pvr_tbl_audiobitrate[hdw->controls[ - PVR2_CID_AUDIOBITRATE].value] | - pvr_tbl_srate[hdw->controls[PVR2_CID_SRATE].value] | - hdw->controls[PVR2_CID_AUDIOLAYER].value << 2 | - (hdw->controls[PVR2_CID_AUDIOCRC].value ? 1 << 14 : 0) | - pvr_tbl_emphasis[hdw->controls[ - PVR2_CID_AUDIOEMPHASIS].value]); + audio = (pvr_tbl_audiobitrate[hdw->audiobitrate_val] | + pvr_tbl_srate[hdw->srate_val] | + hdw->audiolayer_val << 2 | + (hdw->audiocrc_val ? 1 << 14 : 0) | + pvr_tbl_emphasis[hdw->audioemphasis_val]); ret |= pvr2_write_encoder_vcmd(hdw,CX2341X_ENC_SET_AUDIO_PROPERTIES,1, audio); @@ -416,7 +429,7 @@ int pvr2_encoder_configure(struct pvr2_hdw *hdw) ret |= pvr2_write_encoder_vcmd(hdw, CX2341X_ENC_INITIALIZE_INPUT, 0); if (!ret) { - hdw->subsys_enabled_mask |= PVR2_SUBSYS_ENC_CFG; + hdw->subsys_enabled_mask |= (1<<PVR2_SUBSYS_B_ENC_CFG); } return ret; @@ -444,7 +457,7 @@ int pvr2_encoder_start(struct pvr2_hdw *hdw) 0,0x13); } if (!status) { - hdw->subsys_enabled_mask |= PVR2_SUBSYS_ENC_RUN; + hdw->subsys_enabled_mask |= (1<<PVR2_SUBSYS_B_ENC_RUN); } return status; } @@ -474,7 +487,7 @@ int pvr2_encoder_stop(struct pvr2_hdw *hdw) pvr2_hdw_gpio_chg_out(hdw,0xffffffff,0x00000000); if (!status) { - hdw->subsys_enabled_mask &= ~PVR2_SUBSYS_ENC_RUN; + hdw->subsys_enabled_mask &= ~(1<<PVR2_SUBSYS_B_ENC_RUN); } return status; } |