[media] saa7164: add support for encoder CBR and VBR optionally
authorSteven Toth <stoth@kernellabs.com>
Sat, 31 Jul 2010 17:51:30 +0000 (14:51 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Thu, 21 Oct 2010 09:54:43 +0000 (07:54 -0200)
Signed-off-by: Steven Toth <stoth@kernellabs.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/saa7164/saa7164-api.c
drivers/media/video/saa7164/saa7164-encoder.c
drivers/media/video/saa7164/saa7164-types.h
drivers/media/video/saa7164/saa7164.h

index 5dcdf7bb12cdb2dd39fe12d3312111a90018bb4c..fec5138737e0563ff4ebe944a390c4b0dcbcadba 100644 (file)
@@ -59,7 +59,10 @@ int saa7164_api_set_encoder(struct saa7164_port *port)
                printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
 
        /* Establish video bitrates */
-       vb.ucVideoBitRateMode = 0;
+       if (port->encoder_params.bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_CBR)
+               vb.ucVideoBitRateMode = EU_VIDEO_BIT_RATE_MODE_CONSTANT;
+       else
+               vb.ucVideoBitRateMode = EU_VIDEO_BIT_RATE_MODE_VARIABLE_PEAK;
        vb.dwVideoBitRate = port->encoder_params.bitrate;
        vb.dwVideoBitRatePeak = vb.dwVideoBitRate;
        ret = saa7164_cmd_send(port->dev, port->hwcfg.sourceid, SET_CUR,
index 74aec26dbb254470fc5d8b83804a1498767a1178..d7d2fe009ff97e380301cff531e9c6a7d2f2919d 100644 (file)
@@ -45,6 +45,7 @@ static const u32 saa7164_v4l2_ctrls[] = {
        V4L2_CID_MPEG_VIDEO_ASPECT,
        V4L2_CID_MPEG_STREAM_TYPE,
        V4L2_CID_MPEG_AUDIO_MUTE,
+       V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
        V4L2_CID_MPEG_VIDEO_BITRATE,
        0
 };
@@ -379,6 +380,9 @@ static int saa7164_get_ctrl(struct saa7164_port *port,
        case V4L2_CID_MPEG_VIDEO_ASPECT:
                ctrl->value = params->ctl_aspect;
                break;
+       case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
+               ctrl->value = params->bitrate_mode;
+               break;
        default:
                return -EINVAL;
        }
@@ -438,6 +442,11 @@ static int saa7164_try_ctrl(struct v4l2_ext_control *ctrl, int ac3)
                        (ctrl->value <= 255))
                        ret = 0;
                break;
+       case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
+               if ((ctrl->value == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR) ||
+                       (ctrl->value == V4L2_MPEG_VIDEO_BITRATE_MODE_CBR))
+                       ret = 0;
+               break;
        default:
                ret = -EINVAL;
        }
@@ -497,6 +506,9 @@ static int saa7164_set_ctrl(struct saa7164_port *port,
                        ret = -EIO;
                }
                break;
+       case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
+               params->bitrate_mode = ctrl->value;
+               break;
        default:
                return -EINVAL;
        }
@@ -667,6 +679,10 @@ static int fill_queryctrl(struct saa7164_encoder_params *params,
                        1, V4L2_MPEG_VIDEO_ASPECT_4x3);
        case V4L2_CID_MPEG_VIDEO_GOP_SIZE:
                return v4l2_ctrl_query_fill(c, 1, 255, 1, 15);
+       case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
+               return v4l2_ctrl_query_fill(c,
+                       V4L2_MPEG_VIDEO_BITRATE_MODE_VBR, V4L2_MPEG_VIDEO_BITRATE_MODE_CBR,
+                       1, V4L2_MPEG_VIDEO_BITRATE_MODE_VBR);
        default:
                return -EINVAL;
        }
@@ -1287,6 +1303,7 @@ int saa7164_encoder_register(struct saa7164_port *port)
        port->ctl_saturation = 62;
        port->ctl_sharpness = 8;
        port->encoder_params.bitrate = ENCODER_DEF_BITRATE;
+       port->encoder_params.bitrate_mode = V4L2_MPEG_VIDEO_BITRATE_MODE_VBR;
        port->encoder_params.stream_type = V4L2_MPEG_STREAM_TYPE_MPEG2_PS;
        port->encoder_params.ctl_mute = 0;
        port->encoder_params.ctl_aspect = V4L2_MPEG_VIDEO_ASPECT_4x3;
index 7c2788d9a6479e32d5ce539920bad39e14344406..dacd9ce1d41986e39c484724a91bf46a902aaaf8 100644 (file)
@@ -311,6 +311,9 @@ typedef struct
 } __attribute__((packed)) tmComResProcDescrHeader_t;
 
 /* Video bitrate control message */
+#define EU_VIDEO_BIT_RATE_MODE_CONSTANT                (0)
+#define EU_VIDEO_BIT_RATE_MODE_VARIABLE_AVERAGE (1)
+#define EU_VIDEO_BIT_RATE_MODE_VARIABLE_PEAK   (2)
 typedef struct
 {
        u8      ucVideoBitRateMode;
index a262875a39e3fa0401ff5738b2d4d80e1363c113..712f762d9f733d254a301323018a749e1f5def3c 100644 (file)
@@ -255,6 +255,7 @@ struct saa7164_encoder_params {
        u32 width;
        u32 is_50hz;
        u32 bitrate; /* bps */
+       u32 bitrate_mode;
        u32 stream_type; /* V4L2_MPEG_STREAM_TYPE_MPEG2_TS */
 
        u32 audio_sampling_freq;