mix-vbp: refine the parser of h263 to support PLUSPTYPE
BZ: 79135
Change-Id: I15e578c2bf6019feaa0762340831cf8a35d1ebdc
Signed-off-by: Dan Liang <dan.liang@intel.com>
Reviewed-on: http://android.intel.com:8080/86484
Reviewed-by: Feng, Wei <wei.feng@intel.com>
Reviewed-by: Chen, Tianmi <tianmi.chen@intel.com>
Reviewed-by: Shi, PingX <pingx.shi@intel.com>
Tested-by: Shi, PingX <pingx.shi@intel.com>
Reviewed-by: cactus <cactus@intel.com>
Tested-by: cactus <cactus@intel.com>
diff --git a/mix_vbp/viddec_fw/fw/codecs/mp4/parser/viddec_mp4_shortheader.c b/mix_vbp/viddec_fw/fw/codecs/mp4/parser/viddec_mp4_shortheader.c
index 4125a6c..513c0f1 100644
--- a/mix_vbp/viddec_fw/fw/codecs/mp4/parser/viddec_mp4_shortheader.c
+++ b/mix_vbp/viddec_fw/fw/codecs/mp4/parser/viddec_mp4_shortheader.c
@@ -81,7 +81,7 @@
getbits = viddec_pm_get_bits(parent, &data, 5);
BREAK_GETBITS_REQD_MISSING(getbits, ret);
svh->vop_quant = (data & 0x1f);
- //zero bit
+ //cpm
getbits = viddec_pm_get_bits(parent, &data, 1);
BREAK_GETBITS_REQD_MISSING(getbits, ret);
if ( 0 != (data & 0x1))
@@ -96,32 +96,86 @@
getbits = viddec_pm_get_bits(parent, &data, 3);
BREAK_GETBITS_REQD_MISSING(getbits, ret);
svh->ufep = (data & 0x7); //ufep
- if (svh->ufep == 0x0)
+ if (svh->ufep == 1 || svh->ufep == 0)
{
- DEB("Info: don't support to handle the 0x000 case of Update Full Extended PTYPE\n");
- ret = MP4_STATUS_NOTSUPPORT;
- break;
- }
- else if (svh->ufep == 0x1)
- {
- //source format
+ //OPPTYPE
+ if (svh->ufep == 1)
+ {
+ //source format
+ getbits = viddec_pm_get_bits(parent, &data, 3);
+ BREAK_GETBITS_REQD_MISSING(getbits, ret);
+ svh->source_format = (data & 0x7);
+ if (svh->source_format < 1 || svh->source_format > 6)
+ {
+ DEB("Error: bad value of source_format\n");
+ ret = MP4_STATUS_PARSE_ERROR;
+ break;
+ }
+ //optional indicators
+ getbits = viddec_pm_get_bits(parent, &data, 8);
+ BREAK_GETBITS_REQD_MISSING(getbits, ret);
+ optional_indicators_8bits = data;
+ //reserved zero bits
+ getbits = viddec_pm_get_bits(parent, &data, 3);
+ BREAK_GETBITS_REQD_MISSING(getbits, ret);
+ if ( 0 != (data & 0x7))
+ {
+ ret = MP4_STATUS_PARSE_ERROR;
+ break;
+ }
+ //marker bit
+ getbits = viddec_pm_get_bits(parent, &data, 1);
+ BREAK_GETBITS_REQD_MISSING(getbits, ret);
+ if ( 1 != (data & 0x1))
+ {
+ ret = MP4_STATUS_PARSE_ERROR;
+ break;
+ }
+ //reserved zero bits
+ getbits = viddec_pm_get_bits(parent, &data, 3);
+ BREAK_GETBITS_REQD_MISSING(getbits, ret);
+ if ( 0 != (data & 0x7))
+ {
+ ret = MP4_STATUS_PARSE_ERROR;
+ break;
+ }
+ }
+
+ //MPPTYPE
+ //picture coding type
getbits = viddec_pm_get_bits(parent, &data, 3);
BREAK_GETBITS_REQD_MISSING(getbits, ret);
- svh->source_format = (data & 0x7);
- if (svh->source_format < 1 || svh->source_format > 6)
+ svh->picture_coding_type = (data & 0x7);
+ if (svh->picture_coding_type > 1)
{
- DEB("Error: bad value of source_format\n");
+ DEB("Info: only support I and P frames\n");
+ ret = MP4_STATUS_NOTSUPPORT;
+ break;
+ }
+ //optional RPR mode
+ getbits = viddec_pm_get_bits(parent, &data, 1);
+ BREAK_GETBITS_REQD_MISSING(getbits, ret);
+ if ( 0 != (data & 0x1))
+ {
ret = MP4_STATUS_PARSE_ERROR;
break;
}
- //optional indicators
- getbits = viddec_pm_get_bits(parent, &data, 8);
+ //optional PRU mode
+ getbits = viddec_pm_get_bits(parent, &data, 1);
BREAK_GETBITS_REQD_MISSING(getbits, ret);
- optional_indicators_8bits = data;
+ if ( 0 != (data & 0x1))
+ {
+ ret = MP4_STATUS_PARSE_ERROR;
+ break;
+ }
+ //vop rounding type
+ getbits = viddec_pm_get_bits(parent, &data, 1);
+ BREAK_GETBITS_REQD_MISSING(getbits, ret);
+ svh->vop_rounding_type = (data & 0x1);
//reserved zero bits
- getbits = viddec_pm_get_bits(parent, &data, 3);
+ getbits = viddec_pm_get_bits(parent, &data, 2);
BREAK_GETBITS_REQD_MISSING(getbits, ret);
- if ( 0 != (data & 0x7))
+ if ( 0 != (data & 0x3))
{
ret = MP4_STATUS_PARSE_ERROR;
break;
@@ -134,14 +188,6 @@
ret = MP4_STATUS_PARSE_ERROR;
break;
}
- //reserved zero bits
- getbits = viddec_pm_get_bits(parent, &data, 3);
- BREAK_GETBITS_REQD_MISSING(getbits, ret);
- if ( 0 != (data & 0x7))
- {
- ret = MP4_STATUS_PARSE_ERROR;
- break;
- }
}
else
{
@@ -149,62 +195,23 @@
ret = MP4_STATUS_NOTSUPPORT;
break;
}
- //MPPTYPE
- //picture coding type
- getbits = viddec_pm_get_bits(parent, &data, 3);
- BREAK_GETBITS_REQD_MISSING(getbits, ret);
- svh->picture_coding_type = (data & 0x7);
- if (svh->picture_coding_type > 1)
- {
- DEB("Info: only support I and P frames\n");
- ret = MP4_STATUS_NOTSUPPORT;
- break;
- }
- //optional RPR mode
- getbits = viddec_pm_get_bits(parent, &data, 1);
- BREAK_GETBITS_REQD_MISSING(getbits, ret);
- if ( 0 != (data & 0x1))
- {
- ret = MP4_STATUS_PARSE_ERROR;
- break;
- }
- //optional PRU mode
- getbits = viddec_pm_get_bits(parent, &data, 1);
- BREAK_GETBITS_REQD_MISSING(getbits, ret);
- if ( 0 != (data & 0x1))
- {
- ret = MP4_STATUS_PARSE_ERROR;
- break;
- }
- //vop rounding type
- getbits = viddec_pm_get_bits(parent, &data, 1);
- BREAK_GETBITS_REQD_MISSING(getbits, ret);
- svh->vop_rounding_type = (data & 0x1);
- //reserved zero bits
- getbits = viddec_pm_get_bits(parent, &data, 2);
- BREAK_GETBITS_REQD_MISSING(getbits, ret);
- if ( 0 != (data & 0x3))
- {
- ret = MP4_STATUS_PARSE_ERROR;
- break;
- }
- //marker bit
- getbits = viddec_pm_get_bits(parent, &data, 1);
- BREAK_GETBITS_REQD_MISSING(getbits, ret);
- if ( 1 != (data & 0x1))
- {
- ret = MP4_STATUS_PARSE_ERROR;
- break;
- }
+
//cpm
getbits = viddec_pm_get_bits(parent, &data, 1);
BREAK_GETBITS_REQD_MISSING(getbits, ret);
+ if ( 0 != (data & 0x1))
+ {
+ ret = MP4_STATUS_NOTSUPPORT;
+ break;
+ }
+
+ //CPFMT
if (svh->ufep == 1 && svh->source_format == 6)
- { //CPFMT
+ { //Pixel Aspect Ratio
getbits = viddec_pm_get_bits(parent, &data, 4);
BREAK_GETBITS_REQD_MISSING(getbits, ret);
svh->pixel_aspect_ratio_code = (data & 0xf);
- //
+ //Picture Width Indication
getbits = viddec_pm_get_bits(parent, &data, 9);
BREAK_GETBITS_REQD_MISSING(getbits, ret);
svh->picture_width_indication = (data & 0x1ff);
@@ -216,12 +223,19 @@
ret = MP4_STATUS_PARSE_ERROR;
break;
}
- //
+ //Picture Height Indication
getbits = viddec_pm_get_bits(parent, &data, 9);
BREAK_GETBITS_REQD_MISSING(getbits, ret);
svh->picture_height_indication = (data & 0x1ff);
+
+ if (svh->pixel_aspect_ratio_code == 0xf)
+ {
+ //EPAR
+ viddec_pm_get_bits(parent, &data, 16);
+ }
}
+ //custom PCF
if (optional_indicators_8bits & 0x80) {
viddec_pm_get_bits(parent, &data, 8);
viddec_pm_get_bits(parent, &data, 2);