[vlc-commits] videotoolbox: use generic AnnexB to xVC converter
Francois Cartegnie
git at videolan.org
Tue Dec 22 13:25:16 CET 2015
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Mon Dec 21 21:18:14 2015 +0100| [aeb68de168925e376b5fb7470de9b81f93daf765] | committer: Francois Cartegnie
videotoolbox: use generic AnnexB to xVC converter
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=aeb68de168925e376b5fb7470de9b81f93daf765
---
modules/codec/Makefile.am | 4 +-
modules/codec/videotoolbox.m | 2 +-
modules/packetizer/h264_nal.c | 165 -----------------------------------------
modules/packetizer/h264_nal.h | 6 --
modules/packetizer/hxxx_nal.c | 2 +-
5 files changed, 5 insertions(+), 174 deletions(-)
diff --git a/modules/codec/Makefile.am b/modules/codec/Makefile.am
index 37881df..4a134a4 100644
--- a/modules/codec/Makefile.am
+++ b/modules/codec/Makefile.am
@@ -285,7 +285,9 @@ libvorbis_plugin_la_LIBADD = $(VORBIS_LIBS)
EXTRA_LTLIBRARIES += libvorbis_plugin.la
codec_LTLIBRARIES += $(LTLIBvorbis)
-libvideotoolbox_plugin_la_SOURCES = video_chroma/copy.c video_chroma/copy.h packetizer/h264_nal.c packetizer/h264_nal.h codec/videotoolbox.m
+libvideotoolbox_plugin_la_SOURCES = video_chroma/copy.c video_chroma/copy.h codec/videotoolbox.m \
+ packetizer/h264_nal.c packetizer/h264_nal.h \
+ packetizer/hxxx_nal.c packetizer/hxxx_nal.h
libvideotoolbox_plugin_la_CFLAGS = $(AM_CFLAGS) -fobjc-arc
libvideotoolbox_plugin_la_LDFLAGS = $(AM_LDFLAGS) -rpath '$(codecdir)' -Wl,-framework,Foundation -Wl,-framework,VideoToolbox -Wl,-framework,CoreMedia -Wl,-framework,CoreVideo
EXTRA_LTLIBRARIES += libvideotoolbox_plugin.la
diff --git a/modules/codec/videotoolbox.m b/modules/codec/videotoolbox.m
index 580e7eb..9afabe5 100644
--- a/modules/codec/videotoolbox.m
+++ b/modules/codec/videotoolbox.m
@@ -886,7 +886,7 @@ static block_t *H264ProcessBlock(decoder_t *p_dec, block_t *p_block)
}
}
- return (p_block) ? h264_AnnexB_to_AVC(p_block, p_sys->i_nal_length_size) : NULL;
+ return (p_block) ? hxxx_AnnexB_to_xVC(p_block, p_sys->i_nal_length_size) : NULL;
}
static CMSampleBufferRef VTSampleBufferCreate(decoder_t *p_dec,
diff --git a/modules/packetizer/h264_nal.c b/modules/packetizer/h264_nal.c
index 70808dc..cc22eb3 100644
--- a/modules/packetizer/h264_nal.c
+++ b/modules/packetizer/h264_nal.c
@@ -154,171 +154,6 @@ void h264_AVC_to_AnnexB( uint8_t *p_buf, uint32_t i_len,
}
}
-static block_t *h264_increase_startcode_size( block_t *p_block,
- size_t i_start_ofs )
-{
- block_t *p_new;
- uint32_t i_buf = p_block->i_buffer - i_start_ofs;
- uint8_t *p_buf = p_block->p_buffer;
- uint8_t *p_new_buf;
- size_t i_ofs = i_start_ofs;
- size_t i_grow = 0;
- size_t i_new_ofs;
-
- /* Search all startcode of size 3 */
- unsigned i_bitflow = 0;
- unsigned i_nalcount = 0;
- while( i_buf-- )
- {
- i_bitflow <<= 1;
- if( *(p_buf++) != 0x01 )
- {
- i_bitflow |= 1;
- }
- else if( (i_bitflow & 0x06) == 0x06 ) /* two zero prefixed 1 */
- {
- i_nalcount++;
- if( !(i_bitflow & 0x08) ) /* max two zero prefixed 1 */
- i_grow++;
- }
- }
-
- if( i_grow == 0 )
- return p_block;
-
-
-
- /* Alloc a bigger buffer */
- p_new = block_Alloc( p_block->i_buffer + i_grow );
- if( !p_new )
- return NULL;
- i_buf = p_block->i_buffer - i_start_ofs;
- p_buf = p_block->p_buffer;
- p_new_buf = p_new->p_buffer;
- i_new_ofs = i_ofs = i_start_ofs;
-
- /* Copy the beginning of the buffer (same data) */
- if( i_start_ofs )
- memcpy( p_new_buf, p_buf, i_start_ofs );
-
- /* Copy the rest of the buffer and append a 0 before each 000001 */
- while( i_buf > 0 )
- {
- if( i_buf > 3 && memcmp( &p_buf[i_ofs], annexb_startcode3, 3 ) == 0 )
- {
- if( i_ofs == 0 || p_buf[i_ofs - 1] != 0 )
- p_new_buf[i_new_ofs++] = 0;
- for( int i = 0; i < 3; ++i )
- p_new_buf[i_new_ofs++] = p_buf[i_ofs++];
- i_buf -= 3;
- } else
- {
- p_new_buf[i_new_ofs++] = p_buf[i_ofs++];
- i_buf--;
- }
- }
-
- block_Release( p_block );
- return p_new;
-}
-
-static int h264_replace_startcode( uint8_t *p_buf,
- uint8_t i_nal_length_size,
- size_t i_startcode_ofs,
- size_t i_nal_size )
-{
- if( i_nal_size < (unsigned) 1 << ( 8 * i_nal_length_size) )
- {
- /* NAL is too big to fit in i_nal_length_size */
- return -1;
- }
-
- p_buf[i_startcode_ofs++] = i_nal_size >> (--i_nal_length_size * 8);
- if( !i_nal_length_size )
- return 0;
- p_buf[i_startcode_ofs++] = i_nal_size >> (--i_nal_length_size * 8);
- if( !i_nal_length_size )
- return 0;
- p_buf[i_startcode_ofs++] = i_nal_size >> (--i_nal_length_size * 8);
- p_buf[i_startcode_ofs] = i_nal_size;
- return 0;
-}
-
-block_t *h264_AnnexB_to_AVC( block_t *p_block, uint8_t i_nal_length_size )
-{
- size_t i_startcode_ofs = 0;
- size_t i_startcode_size = 0;
- uint32_t i_buf = p_block->i_buffer;
- uint8_t *p_buf = p_block->p_buffer;
- size_t i_ofs = 0;
-
- /* The length of the NAL size is encoded using 1, 2 or 4 bytes */
- if( i_nal_length_size != 1 && i_nal_length_size != 2
- && i_nal_length_size != 4 )
- goto error;
-
- /* Replace the Annex B start code with the size of the NAL. */
- while( i_buf > 0 )
- {
- if( i_buf > 3 && memcmp( &p_buf[i_ofs], annexb_startcode3, 3 ) == 0 )
- {
- if( i_startcode_size )
- {
- size_t i_nal_size = i_ofs - i_startcode_ofs - i_startcode_size;
-
- if( i_ofs > 0 && p_buf[i_ofs - 1] == 0 )
- i_nal_size--;
- if( h264_replace_startcode( p_buf, i_nal_length_size,
- i_startcode_ofs,
- i_nal_size ) )
- goto error;
- }
- if( i_ofs > 0 && p_buf[i_ofs - 1] == 0 )
- {
- /* startcode of size 3 */
- i_startcode_ofs = i_ofs - 1;
- i_startcode_size = 4;
- }
- else
- {
- i_startcode_ofs = i_ofs;
- i_startcode_size = 3;
- }
-
- if( i_startcode_size < i_nal_length_size )
- {
- /* i_nal_length_size can't fit in i_startcode_size. Therefore,
- * reallocate a buffer in order to increase all startcode that
- * are smaller than i_nal_length_size. This is not efficient but
- * it's a corner case that won't happen often */
- p_block = h264_increase_startcode_size( p_block, i_startcode_ofs );
- if( !p_block )
- return NULL;
-
- p_buf = p_block->p_buffer;
- i_startcode_size++;
- }
- i_buf -= 3;
- i_ofs += 3;
- }
- else
- {
- i_buf--;
- i_ofs++;
- }
- }
-
- if( i_startcode_size
- && h264_replace_startcode( p_buf, i_nal_length_size, i_startcode_ofs,
- i_ofs - i_startcode_ofs - i_startcode_size) )
- return NULL;
- else
- return p_block;
-error:
- block_Release( p_block );
- return NULL;
-}
-
int h264_get_spspps( uint8_t *p_buf, size_t i_buf,
uint8_t **pp_sps, size_t *p_sps_size,
uint8_t **pp_pps, size_t *p_pps_size )
diff --git a/modules/packetizer/h264_nal.h b/modules/packetizer/h264_nal.h
index cb49786..0c9f619 100644
--- a/modules/packetizer/h264_nal.h
+++ b/modules/packetizer/h264_nal.h
@@ -149,12 +149,6 @@ bool h264_isavcC( const uint8_t *, size_t );
void h264_AVC_to_AnnexB( uint8_t *p_buf, uint32_t i_len,
uint8_t i_nal_length_size );
-/* Convert Annex B to AVC Sample format in-place
- * Returns the same p_block or a new p_block if there is not enough room to put
- * the NAL size. In case of error, NULL is returned and p_block is released.
- * */
-block_t *h264_AnnexB_to_AVC( block_t *p_block, uint8_t i_nal_length_size );
-
/* Get the SPS/PPS pointers from an Annex B buffer
* Returns 0 if a SPS and/or a PPS is found */
int h264_get_spspps( uint8_t *p_buf, size_t i_buf,
diff --git a/modules/packetizer/hxxx_nal.c b/modules/packetizer/hxxx_nal.c
index dc49570..e01c05b 100644
--- a/modules/packetizer/hxxx_nal.c
+++ b/modules/packetizer/hxxx_nal.c
@@ -38,7 +38,7 @@ static inline void hxxx_WritePrefix( uint8_t i_nal_length_size, uint8_t *p_dest,
*p_dest = i_payload;
}
-static block_t *hxxx_AnnexB_to_xVC( block_t *p_block, uint8_t i_nal_length_size )
+block_t *hxxx_AnnexB_to_xVC( block_t *p_block, uint8_t i_nal_length_size )
{
unsigned i_nalcount = 0;
unsigned i_list = 16;
More information about the vlc-commits
mailing list