From 2b5e7c1f0f6207ade511f46aecd2a9792febacfe Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 3 Oct 2011 14:25:00 -0300 Subject: [PATCH] codecparsers: VC1: compute MB height and width Add them to GstVC1SequenceHdr --- gst-libs/gst/codecparsers/gstvc1parser.c | 19 ++++++++++++++----- gst-libs/gst/codecparsers/gstvc1parser.h | 2 ++ tests/check/libs/vc1parser.c | 15 +++++++++------ 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/gst-libs/gst/codecparsers/gstvc1parser.c b/gst-libs/gst/codecparsers/gstvc1parser.c index 263d992f85..ad726bd56b 100644 --- a/gst-libs/gst/codecparsers/gstvc1parser.c +++ b/gst-libs/gst/codecparsers/gstvc1parser.c @@ -649,6 +649,8 @@ parse_sequence_header_advanced (GstVC1SeqHdr * seqhdr, GstBitReader * br) gst_bit_reader_get_bits_uint16_unchecked (br, 12); advanced->max_coded_width = (advanced->max_coded_width + 1) << 1; advanced->max_coded_height = (advanced->max_coded_height + 1) << 1; + seqhdr->mb_height = (advanced->max_coded_height + 15) >> 4; + seqhdr->mb_width = (advanced->max_coded_width + 15) >> 4; advanced->pulldown = gst_bit_reader_get_bits_uint8_unchecked (br, 1); advanced->interlace = gst_bit_reader_get_bits_uint8_unchecked (br, 1); advanced->tfcntrflag = gst_bit_reader_get_bits_uint8_unchecked (br, 1); @@ -724,8 +726,8 @@ parse_frame_header_advanced (GstBitReader * br, GstVC1FrameHdr * framehdr, GstVC1PicAdvanced *pic = &framehdr->pic.advanced; GstVC1EntryPointHdr *entrypthdr = &advhdr->entrypoint; guint8 mvmodeidx; - guint width = (entrypthdr->coded_width + 15) >> 4; - guint height = (entrypthdr->coded_height + 15) >> 4; + guint width = seqhdr->mb_width; + guint height = seqhdr->mb_height; GST_DEBUG ("Parsing Frame header advanced %u", advhdr->interlace); @@ -982,8 +984,8 @@ parse_frame_header (GstBitReader * br, GstVC1FrameHdr * framehdr, guint8 mvmodeidx; GstVC1PicSimpleMain *pic = &framehdr->pic.simple; GstVC1SimpleMainSeqHdr *simplehdr = &seqhdr->profile.simplemain; - guint width = (simplehdr->coded_width + 15) >> 4; - guint height = (simplehdr->coded_height + 15) >> 4; + guint width = seqhdr->mb_width; + guint height = seqhdr->mb_height; GST_DEBUG ("Parsing frame header in simple or main mode"); @@ -1204,7 +1206,8 @@ gst_vc1_identify_next_bdu (const guint8 * data, gsize size, GstVC1BDU * bdu) ensure_debug_category (); if (size < 4) { - GST_DEBUG ("Can't parse, buffer has too small size %" G_GSSIZE_FORMAT, size); + GST_DEBUG ("Can't parse, buffer has too small size %" G_GSSIZE_FORMAT, + size); return GST_VC1_PARSER_ERROR; } @@ -1339,6 +1342,10 @@ gst_vc1_parse_sequence_header (const guint8 * data, gsize size, simplehdr->slice_code); } + /* compute height and width */ + seqhdr->mb_height = (simplehdr->coded_height + 15) >> 4; + seqhdr->mb_width = (simplehdr->coded_width + 15) >> 4; + return GST_VC1_PARSER_OK; failed: @@ -1399,6 +1406,8 @@ gst_vc1_parse_entry_point_header (const guint8 * data, gsize size, READ_UINT16 (&br, entrypoint->coded_height, 12); entrypoint->coded_height = (entrypoint->coded_height + 1) << 1; entrypoint->coded_width = (entrypoint->coded_width + 1) << 1; + seqhdr->mb_height = (entrypoint->coded_height + 15) >> 4; + seqhdr->mb_width = (entrypoint->coded_width + 15) >> 4; } if (entrypoint->extended_mv) diff --git a/gst-libs/gst/codecparsers/gstvc1parser.h b/gst-libs/gst/codecparsers/gstvc1parser.h index 60344a0699..aad83fa557 100644 --- a/gst-libs/gst/codecparsers/gstvc1parser.h +++ b/gst-libs/gst/codecparsers/gstvc1parser.h @@ -268,6 +268,8 @@ struct _GstVC1SeqHdr /* calculated */ guint framerate; /* Around in fps, 0 if unknown*/ guint bitrate; /* Around in kpbs, 0 if unknown*/ + guint mb_height; + guint mb_width; union { GstVC1AdvancedSeqHdr advanced; diff --git a/tests/check/libs/vc1parser.c b/tests/check/libs/vc1parser.c index d7e5395487..1fd9e39a65 100644 --- a/tests/check/libs/vc1parser.c +++ b/tests/check/libs/vc1parser.c @@ -825,14 +825,14 @@ GST_START_TEST (test_vc1_parse_p_frame_header_main) GstVC1SimpleMainSeqHdr *simplehdr = &seqhdr.profile.simplemain; GstVC1PicSimpleMain *pic = &framehdr.pic.simple; + simplehdr->coded_height = 240; + simplehdr->coded_width = 320; + assert_equals_int (gst_vc1_parse_sequence_header (pframe_header_main, sizeof (pframe_header_main), &seqhdr), GST_VC1_PARSER_OK); assert_equals_int (seqhdr.profiletype, GST_VC1_PROFILE_MAIN); - simplehdr->coded_height = 240; - simplehdr->coded_width = 320; - assert_equals_int (seqhdr.frmrtq_postproc, 7); assert_equals_int (seqhdr.bitrtq_postproc, 2); assert_equals_int (simplehdr->loop_filter, 1); @@ -869,13 +869,15 @@ GST_START_TEST (test_vc1_parse_b_frame_header_main) GstVC1SimpleMainSeqHdr *simplehdr = &seqhdr.profile.simplemain; GstVC1PicSimpleMain *pic = &framehdr.pic.simple; + simplehdr->coded_height = 240; + simplehdr->coded_width = 320; + assert_equals_int (gst_vc1_parse_sequence_header (bframe_header_main, sizeof (bframe_header_main), &seqhdr), GST_VC1_PARSER_OK); assert_equals_int (seqhdr.profiletype, GST_VC1_PROFILE_MAIN); - - simplehdr->coded_height = 240; - simplehdr->coded_width = 320; + assert_equals_int (seqhdr.mb_height, 15); + assert_equals_int (seqhdr.mb_width, 20); assert_equals_int (seqhdr.frmrtq_postproc, 7); assert_equals_int (seqhdr.bitrtq_postproc, 3); @@ -915,6 +917,7 @@ GST_START_TEST (test_vc1_parse_bi_frame_header_main) GstVC1SimpleMainSeqHdr *simplehdr = &seqhdr.profile.simplemain; GstVC1PicSimpleMain *pic = &framehdr.pic.simple; + simplehdr->coded_height = 240; simplehdr->coded_width = 320;