summaryrefslogtreecommitdiff
path: root/gst-libs
diff options
context:
space:
mode:
authorGwenole Beauchesne <gwenole.beauchesne@intel.com>2012-03-02 11:45:41 +0100
committerTim-Philipp Müller <tim.muller@collabora.co.uk>2012-03-03 15:53:46 +0000
commit5c9f7900759d3ea2ae740e4dd04079381678fed8 (patch)
tree42b23cf2d429ef3b10cff42fcf2a83c93ddc55bb /gst-libs
parent0bb5a01639079e30f7236b932ad11d4a48cda47c (diff)
downloadgstreamer-plugins-bad-5c9f7900759d3ea2ae740e4dd04079381678fed8.tar.gz
codecparsers: h264: record number of emulation prevention bytes in slice_header().
Some hardware video decode acceleration API (VA-API, DXVA) require a bit count to the first macroblock, minus the number of emulation prevention bytes. So, instead of having the consumer of the library scan the slice_header() again, just record that number while parsing. Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> https://bugzilla.gnome.org/show_bug.cgi?id=671203
Diffstat (limited to 'gst-libs')
-rw-r--r--gst-libs/gst/codecparsers/gsth264parser.c10
-rw-r--r--gst-libs/gst/codecparsers/gsth264parser.h3
2 files changed, 13 insertions, 0 deletions
diff --git a/gst-libs/gst/codecparsers/gsth264parser.c b/gst-libs/gst/codecparsers/gsth264parser.c
index 572a28ded..efb4c739d 100644
--- a/gst-libs/gst/codecparsers/gsth264parser.c
+++ b/gst-libs/gst/codecparsers/gsth264parser.c
@@ -167,6 +167,7 @@ typedef struct
const guint8 *data;
guint size;
+ guint n_epb; /* Number of emulation prevention bytes */
guint byte; /* Byte position */
guint bits_in_cache; /* bitpos in the cache of next bit */
guint8 first_byte;
@@ -178,6 +179,7 @@ nal_reader_init (NalReader * nr, const guint8 * data, guint size)
{
nr->data = data;
nr->size = size;
+ nr->n_epb = 0;
nr->byte = 0;
nr->bits_in_cache = 0;
@@ -211,6 +213,7 @@ nal_reader_read (NalReader * nr, guint nbits)
((nr->cache & 0xff) == 0)) {
/* next byte goes unconditionally to the cache, even if it's 0x03 */
check_three_byte = FALSE;
+ nr->n_epb++;
goto next_byte;
}
nr->cache = (nr->cache << 8) | nr->first_byte;
@@ -263,6 +266,12 @@ nal_reader_get_remaining (const NalReader * nr)
return (nr->size - nr->byte) * 8 + nr->bits_in_cache;
}
+static inline guint
+nal_reader_get_epb_count (const NalReader * nr)
+{
+ return nr->n_epb;
+}
+
#define GST_NAL_READER_READ_BITS(bits) \
static gboolean \
nal_reader_get_bits_uint##bits (NalReader *nr, guint##bits *val, guint nbits) \
@@ -1882,6 +1891,7 @@ gst_h264_parser_parse_slice_hdr (GstH264NalParser * nalparser,
}
slice->header_size = nal_reader_get_pos (&nr);
+ slice->n_emulation_prevention_bytes = nal_reader_get_epb_count (&nr);
return GST_H264_PARSER_OK;
diff --git a/gst-libs/gst/codecparsers/gsth264parser.h b/gst-libs/gst/codecparsers/gsth264parser.h
index 3c221560e..2e570c8a9 100644
--- a/gst-libs/gst/codecparsers/gsth264parser.h
+++ b/gst-libs/gst/codecparsers/gsth264parser.h
@@ -599,6 +599,9 @@ struct _GstH264SliceHdr
/* Size of the slice_header() in bits */
guint header_size;
+
+ /* Number of emulation prevention bytes (EPB) in this slice_header() */
+ guint n_emulation_prevention_bytes;
};