Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- From d88acac0c1cd91aaf7d894dff4176f7d32d36b45 Mon Sep 17 00:00:00 2001
- From: Mashiat Sarker <shahriman_ams@yahoo.com>
- Date: Sun, 26 Jun 2011 21:20:27 +0600
- Subject: [PATCH] Field picture header parsing 01
- ---
- libavcodec/vc1.c | 81 ++++++++++++++++++++++++++++++++++++---------------
- libavcodec/vc1.h | 3 ++
- libavcodec/vc1dec.c | 4 ++
- 3 files changed, 64 insertions(+), 24 deletions(-)
- diff --git a/libavcodec/vc1.c b/libavcodec/vc1.c
- index 0884428..c37e431 100644
- --- a/libavcodec/vc1.c
- +++ b/libavcodec/vc1.c
- @@ -452,6 +452,7 @@ static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb)
- v->s.avctx->height = v->s.avctx->coded_height;
- v->broadcast = get_bits1(gb);
- v->interlace = get_bits1(gb);
- + if (v->interlace) v->second_field = 0;
- v->tfcntrflag = get_bits1(gb);
- v->finterpflag = get_bits1(gb);
- skip_bits1(gb); // reserved
- @@ -797,6 +798,13 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
- int mbmodetab, imvtab, icbptab, twomvbptab, fourmvbptab; /* useful only for debugging */
- v->p_frame_skipped = 0;
- + if (v->second_field) {
- + v->s.pict_type = (v->fptype & 1) ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
- + if (v->fptype & 4)
- + v->s.pict_type = (v->fptype & 1) ? AV_PICTURE_TYPE_BI : AV_PICTURE_TYPE_B;
- + av_log(s->avctx, AV_LOG_DEBUG, "Field 2: AV_PICTURE_TYPE_* = %d\n", v->s.pict_type);
- + goto parse_field;
- + }
- if(v->interlace){
- v->fcm = decode012(gb);
- @@ -806,30 +814,37 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
- }
- }
- - switch(get_unary(gb, 0, 4)) {
- - case 0:
- - v->s.pict_type = AV_PICTURE_TYPE_P;
- - av_log(v->s.avctx, AV_LOG_DEBUG, "AV_PICTURE_TYPE_P\n");
- - break;
- - case 1:
- - v->s.pict_type = AV_PICTURE_TYPE_B;
- - av_log(v->s.avctx, AV_LOG_DEBUG, "AV_PICTURE_TYPE_B\n");
- - break;
- - case 2:
- - v->s.pict_type = AV_PICTURE_TYPE_I;
- - av_log(v->s.avctx, AV_LOG_DEBUG, "AV_PICTURE_TYPE_I\n");
- - break;
- - case 3:
- - v->s.pict_type = AV_PICTURE_TYPE_BI;
- - av_log(v->s.avctx, AV_LOG_DEBUG, "AV_PICTURE_TYPE_BI\n");
- - break;
- - case 4:
- - v->s.pict_type = AV_PICTURE_TYPE_P; // skipped pic
- - v->p_frame_skipped = 1;
- - av_log(v->s.avctx, AV_LOG_DEBUG, "Skipped Picture\n");
- - return 0;
- + if (v->fcm == 2) {
- + v->fptype = get_bits(gb, 3);
- + av_log(s->avctx, AV_LOG_DEBUG, "FPTYPE: %d\n", v->fptype);
- + v->s.pict_type = (v->fptype & 2) ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
- + if (v->fptype & 4) // B-picture
- + v->s.pict_type = (v->fptype & 2) ? AV_PICTURE_TYPE_BI : AV_PICTURE_TYPE_B;
- + } else {
- + switch(get_unary(gb, 0, 4)) {
- + case 0:
- + v->s.pict_type = AV_PICTURE_TYPE_P;
- + av_log(v->s.avctx, AV_LOG_DEBUG, "AV_PICTURE_TYPE_P\n");
- + break;
- + case 1:
- + v->s.pict_type = AV_PICTURE_TYPE_B;
- + av_log(v->s.avctx, AV_LOG_DEBUG, "AV_PICTURE_TYPE_B\n");
- + break;
- + case 2:
- + v->s.pict_type = AV_PICTURE_TYPE_I;
- + av_log(v->s.avctx, AV_LOG_DEBUG, "AV_PICTURE_TYPE_I\n");
- + break;
- + case 3:
- + v->s.pict_type = AV_PICTURE_TYPE_BI;
- + av_log(v->s.avctx, AV_LOG_DEBUG, "AV_PICTURE_TYPE_BI\n");
- + break;
- + case 4:
- + v->s.pict_type = AV_PICTURE_TYPE_P; // skipped pic
- + v->p_frame_skipped = 1;
- + av_log(v->s.avctx, AV_LOG_DEBUG, "Skipped Picture\n");
- + return 0;
- + }
- }
- -
- if(v->tfcntrflag)
- skip_bits(gb, 8);
- if(v->broadcast) {
- @@ -847,6 +862,22 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
- v->rnd = get_bits1(gb);
- if(v->interlace)
- v->uvsamp = get_bits1(gb);
- + if (v->fcm == 2) {
- + if (!v->refdist_flag) v->refdist = 0;
- + else {
- + if ((v->s.pict_type != AV_PICTURE_TYPE_B)
- + && (v->s.pict_type != AV_PICTURE_TYPE_BI)) {
- + v->refdist = get_bits(gb, 2);
- + if (val == 3) v->refdist += get_unary(gb, 0, 16);
- + av_log(s->avctx, AV_LOG_DEBUG, "REFDIST: %d\n", v->refdist);
- + } else {
- + v->bfraction_lut_index = get_vlc2(gb, ff_vc1_bfraction_vlc.table, VC1_BFRACTION_VLC_BITS, 1);
- + v->bfraction = ff_vc1_bfraction_lut[v->bfraction_lut_index];
- + av_log(s->avctx, AV_LOG_DEBUG, "BFRACTION: %d\n", v->bfraction);
- + }
- + }
- + goto parse_field;
- + }
- if(v->finterpflag) v->interpfrm = get_bits1(gb);
- if(v->s.pict_type == AV_PICTURE_TYPE_B) {
- v->bfraction_lut_index = get_vlc2(gb, ff_vc1_bfraction_vlc.table, VC1_BFRACTION_VLC_BITS, 1);
- @@ -855,6 +886,8 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
- v->s.pict_type = AV_PICTURE_TYPE_BI; /* XXX: should not happen here */
- }
- }
- +
- + parse_field:
- pqindex = get_bits(gb, 5);
- if(!pqindex) return -1;
- v->pqindex = pqindex;
- @@ -890,7 +923,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
- if (status < 0) return -1;
- av_log(v->s.avctx, AV_LOG_DEBUG, "FIELDTX plane encoding: "
- "Imode: %i, Invert: %i\n", status>>1, status&1);
- - }
- + }
- status = bitplane_decoding(v->acpred_plane, &v->acpred_is_raw, v);
- if (status < 0) return -1;
- av_log(v->s.avctx, AV_LOG_DEBUG, "ACPRED plane encoding: "
- diff --git a/libavcodec/vc1.h b/libavcodec/vc1.h
- index 1b34f63..001eae8 100644
- --- a/libavcodec/vc1.h
- +++ b/libavcodec/vc1.h
- @@ -336,6 +336,9 @@ typedef struct VC1Context{
- int8_t zzi_8x8[64];
- uint8_t *blk_mv_type_base, *blk_mv_type; ///< 0: frame MV, 1: field MV
- int frame_num; // keeps count of frame (debugging)
- + int fptype;
- + int second_field;
- + int refdist; ///< distance of the current picture from reference
- /** Frame decoding info for sprite modes */
- //@{
- diff --git a/libavcodec/vc1dec.c b/libavcodec/vc1dec.c
- index 28b0c49..4964ef7 100644
- --- a/libavcodec/vc1dec.c
- +++ b/libavcodec/vc1dec.c
- @@ -4293,6 +4293,10 @@ static int vc1_decode_frame(AVCodecContext *avctx,
- buf_start = start;
- buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
- break;
- + case VC1_CODE_FIELD:
- + buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
- + v->second_field = 1;
- + break;
- case VC1_CODE_ENTRYPOINT: /* it should be before frame data */
- buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
- init_get_bits(&s->gb, buf2, buf_size2*8);
- --
- 1.7.4.1
Add Comment
Please, Sign In to add comment