From 5c9f7900759d3ea2ae740e4dd04079381678fed8 Mon Sep 17 00:00:00 2001 From: Gwenole Beauchesne Date: Fri, 2 Mar 2012 11:45:41 +0100 Subject: [PATCH] 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 https://bugzilla.gnome.org/show_bug.cgi?id=671203 --- gst-libs/gst/codecparsers/gsth264parser.c | 10 ++++++++++ gst-libs/gst/codecparsers/gsth264parser.h | 3 +++ 2 files changed, 13 insertions(+) diff --git a/gst-libs/gst/codecparsers/gsth264parser.c b/gst-libs/gst/codecparsers/gsth264parser.c index 572a28dedf..efb4c739db 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 3c221560e8..2e570c8a98 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; };