summaryrefslogtreecommitdiff
path: root/gst-libs
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2012-01-10 15:50:37 +0100
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2012-01-10 15:50:37 +0100
commita01a4ea2d3e98c7ffcedf67d48a167e5dfdd1c07 (patch)
tree62de4d4a57689565d72c5c707f74db1a7d5a9108 /gst-libs
parentc849631686baf0012ca89d9f64cc8665277cbcba (diff)
parent1f543ec0ada7849a25a6451679eeb3cd3f605c1f (diff)
Merge branch 'master' into 0.11
Conflicts: gst/mpegtsdemux/tsdemux.c gst/videoparsers/gsth264parse.c tests/check/elements/camerabin2.c
Diffstat (limited to 'gst-libs')
-rw-r--r--gst-libs/gst/codecparsers/gstmpeg4parser.c45
-rw-r--r--gst-libs/gst/video/gstbasevideocodec.h4
-rw-r--r--gst-libs/gst/video/gstbasevideodecoder.c7
3 files changed, 28 insertions, 28 deletions
diff --git a/gst-libs/gst/codecparsers/gstmpeg4parser.c b/gst-libs/gst/codecparsers/gstmpeg4parser.c
index 302219fc1..4b0acb6b5 100644
--- a/gst-libs/gst/codecparsers/gstmpeg4parser.c
+++ b/gst-libs/gst/codecparsers/gstmpeg4parser.c
@@ -273,7 +273,7 @@ find_psc (GstByteReader * br)
/* Scan for the picture start code (22 bits - 0x0020) */
while ((gst_byte_reader_get_remaining (br) >= 3)) {
if (gst_byte_reader_peek_uint24_be (br, &psc) &&
- ((psc & 0xffffc0) == 0x000080)) {
+ ((psc & 0xfffffc) == 0x000080)) {
psc_pos = gst_byte_reader_get_pos (br);
break;
} else
@@ -473,8 +473,7 @@ gst_mpeg4_parse (GstMpeg4Packet * packet, gboolean skip_user_data,
if (skip_user_data && data[off1 + 3] == GST_MPEG4_USER_DATA)
/* If we are here, we know no resync code has been found the first time, so we
* don't look for it this time */
- return gst_mpeg4_parse (packet, skip_user_data, NULL, data, off1 + 3,
- size - off1 - 3);
+ return gst_mpeg4_parse (packet, skip_user_data, NULL, data, off1 + 3, size);
packet->offset = off1 + 3;
packet->data = data;
@@ -524,7 +523,7 @@ gst_h263_parse (GstMpeg4Packet * packet,
gint off1, off2;
GstByteReader br;
- gst_byte_reader_init (&br, data, size);
+ gst_byte_reader_init (&br, data + offset, size - offset);
g_return_val_if_fail (packet != NULL, GST_MPEG4_PARSER_ERROR);
@@ -541,9 +540,10 @@ gst_h263_parse (GstMpeg4Packet * packet,
return GST_MPEG4_PARSER_NO_PACKET;
}
- packet->offset = off1;
+ packet->offset = off1 + offset;
packet->data = data;
+ gst_byte_reader_skip (&br, 3);
off2 = find_psc (&br);
if (off2 == -1) {
@@ -1490,18 +1490,24 @@ gst_mpeg4_parse_video_plane_short_header (GstMpeg4VideoPlaneShortHdr *
shorthdr, const guint8 * data, gsize size)
{
guint8 zero_bits;
- guint32 gob_resync;
GstBitReader br = GST_BIT_READER_INIT (data, size);
g_return_val_if_fail (shorthdr != NULL, GST_MPEG4_PARSER_ERROR);
- if (gst_bit_reader_get_remaining (&br) < 26)
+ if (gst_bit_reader_get_remaining (&br) < 48)
+ goto failed;
+
+ if (gst_bit_reader_get_bits_uint32_unchecked (&br, 22) != 0x20)
goto failed;
shorthdr->temporal_reference =
gst_bit_reader_get_bits_uint8_unchecked (&br, 8);
CHECK_MARKER (&br);
+ zero_bits = gst_bit_reader_get_bits_uint8_unchecked (&br, 1);
+ if (zero_bits != 0x00)
+ goto failed;
+
shorthdr->split_screen_indicator =
gst_bit_reader_get_bits_uint8_unchecked (&br, 1);
shorthdr->document_camera_indicator =
@@ -1517,26 +1523,31 @@ gst_mpeg4_parse_video_plane_short_header (GstMpeg4VideoPlaneShortHdr *
shorthdr->vop_height = 96;
shorthdr->num_macroblocks_in_gob = 8;
shorthdr->num_gobs_in_vop = 6;
+ break;
case 0x02:
shorthdr->vop_width = 176;
shorthdr->vop_height = 144;
shorthdr->num_macroblocks_in_gob = 11;
shorthdr->num_gobs_in_vop = 9;
+ break;
case 0x03:
shorthdr->vop_width = 352;
shorthdr->vop_height = 288;
shorthdr->num_macroblocks_in_gob = 22;
shorthdr->num_gobs_in_vop = 18;
+ break;
case 0x04:
shorthdr->vop_width = 704;
shorthdr->vop_height = 576;
shorthdr->num_macroblocks_in_gob = 88;
shorthdr->num_gobs_in_vop = 18;
+ break;
case 0x05:
shorthdr->vop_width = 1408;
shorthdr->vop_height = 1152;
shorthdr->num_macroblocks_in_gob = 352;
shorthdr->num_gobs_in_vop = 18;
+ break;
default:
shorthdr->vop_width = 0;
shorthdr->vop_height = 0;
@@ -1565,26 +1576,6 @@ gst_mpeg4_parse_video_plane_short_header (GstMpeg4VideoPlaneShortHdr *
} while (shorthdr->pei == 1);
- if (!gst_bit_reader_peek_bits_uint32 (&br, &gob_resync, 17))
- goto failed;
-
- /* gob_layer() */
-
- /* Setting default values */
- shorthdr->gob_header_empty = 1;
- shorthdr->gob_number = 0;
- shorthdr->gob_frame_id = 0;
- shorthdr->quant_scale = 0;
-
- if (gob_resync == 0x01) {
- shorthdr->gob_header_empty = 0;
-
- gst_bit_reader_skip_unchecked (&br, 17);
- READ_UINT8 (&br, shorthdr->gob_number, 5);
- READ_UINT8 (&br, shorthdr->gob_frame_id, 2);
- READ_UINT8 (&br, shorthdr->quant_scale, 5);
- }
-
shorthdr->size = gst_bit_reader_get_pos (&br);
return GST_MPEG4_PARSER_OK;
diff --git a/gst-libs/gst/video/gstbasevideocodec.h b/gst-libs/gst/video/gstbasevideocodec.h
index fb4ee7fec..dafd995da 100644
--- a/gst-libs/gst/video/gstbasevideocodec.h
+++ b/gst-libs/gst/video/gstbasevideocodec.h
@@ -126,6 +126,10 @@ struct _GstVideoFrameState
gboolean is_sync_point;
gboolean is_eos;
+ /* Frames that should not be pushed downstream and are
+ * not meant for display */
+ gboolean decode_only;
+
GstBuffer *sink_buffer;
GstBuffer *src_buffer;
diff --git a/gst-libs/gst/video/gstbasevideodecoder.c b/gst-libs/gst/video/gstbasevideodecoder.c
index 5a7519cb6..8b0ad8eed 100644
--- a/gst-libs/gst/video/gstbasevideodecoder.c
+++ b/gst-libs/gst/video/gstbasevideodecoder.c
@@ -1397,6 +1397,11 @@ gst_base_video_decoder_prepare_finish_frame (GstBaseVideoDecoder *
}
g_list_free (events);
+ /* Check if the data should not be displayed. For example altref/invisible
+ * frame in vp8. In this case we should not update the timestamps. */
+ if (frame->decode_only)
+ return;
+
if (GST_CLOCK_TIME_IS_VALID (frame->presentation_timestamp)) {
if (frame->presentation_timestamp != base_video_decoder->timestamp_offset) {
GST_DEBUG_OBJECT (base_video_decoder,
@@ -1552,7 +1557,7 @@ gst_base_video_decoder_finish_frame (GstBaseVideoDecoder * base_video_decoder,
base_video_decoder->processed++;
/* no buffer data means this frame is skipped */
- if (!frame->src_buffer) {
+ if (!frame->src_buffer || frame->decode_only) {
GST_DEBUG_OBJECT (base_video_decoder, "skipping frame %" GST_TIME_FORMAT,
GST_TIME_ARGS (frame->presentation_timestamp));
goto done;