[vlc-commits] packetizer: mpeg4video: parse/set color space
Francois Cartegnie
git at videolan.org
Thu Mar 30 15:06:24 CEST 2017
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Thu Mar 30 14:48:08 2017 +0200| [718d7279de7ee7c145d200bedf2b7fe7613e44cf] | committer: Francois Cartegnie
packetizer: mpeg4video: parse/set color space
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=718d7279de7ee7c145d200bedf2b7fe7613e44cf
---
modules/packetizer/mpeg4video.c | 46 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 46 insertions(+)
diff --git a/modules/packetizer/mpeg4video.c b/modules/packetizer/mpeg4video.c
index eb00522..9987ab4 100644
--- a/modules/packetizer/mpeg4video.c
+++ b/modules/packetizer/mpeg4video.c
@@ -41,6 +41,7 @@
#include <vlc_block_helper.h>
#include "packetizer_helper.h"
#include "startcode_helper.h"
+#include "hxxx_nal.h" /* colour values/mappings */
/*****************************************************************************
* Module descriptor
@@ -100,6 +101,7 @@ static int PacketizeValidate( void *p_private, block_t * );
static block_t *ParseMPEGBlock( decoder_t *, block_t * );
static int ParseVOL( decoder_t *, es_format_t *, uint8_t *, int );
+static int ParseVO( decoder_t *, block_t * );
static int ParseVOP( decoder_t *, block_t * );
static int vlc_log2( unsigned int );
@@ -330,6 +332,11 @@ static block_t *ParseMPEGBlock( decoder_t *p_dec, block_t *p_frag )
block_ChainLastAppend( &p_sys->pp_last, p_frag );
}
+ if(p_frag->p_buffer[3] == 0xb5)
+ {
+ ParseVO( p_dec, p_frag );
+ }
+ else
if( p_frag->p_buffer[3] == 0xb6 &&
ParseVOP( p_dec, p_frag ) == VLC_SUCCESS )
{
@@ -437,6 +444,45 @@ static int ParseVOL( decoder_t *p_dec, es_format_t *fmt,
return VLC_SUCCESS;
}
+static int ParseVO( decoder_t *p_dec, block_t *p_vo )
+{
+ bs_t s;
+ bs_init( &s, &p_vo->p_buffer[4], p_vo->i_buffer - 4 );
+ if( bs_read1( &s ) )
+ bs_skip( &s, 7 );
+
+ const uint8_t visual_object_type = bs_read( &s, 4 );
+ if( visual_object_type == 1 /* video ID */ ||
+ visual_object_type == 2 /* still texture ID */ )
+ {
+ uint8_t colour_primaries = 1;
+ uint8_t colour_xfer = 1;
+ uint8_t colour_matrix_coeff = 1;
+ uint8_t full_range = 0;
+ if( bs_read1( &s ) ) /* video_signal_type */
+ {
+ bs_read( &s, 3 );
+ full_range = bs_read( &s, 1 );
+ if( bs_read( &s, 1 ) ) /* colour description */
+ {
+ colour_primaries = bs_read( &s, 8 );
+ colour_xfer = bs_read( &s, 8 );
+ colour_matrix_coeff = bs_read( &s, 8 );
+ }
+ }
+
+ if( p_dec->fmt_in.video.primaries == COLOR_PRIMARIES_UNDEF )
+ {
+ p_dec->fmt_out.video.primaries = hxxx_colour_primaries_to_vlc( colour_primaries );
+ p_dec->fmt_out.video.transfer = hxxx_transfer_characteristics_to_vlc( colour_xfer );
+ p_dec->fmt_out.video.space = hxxx_matrix_coeffs_to_vlc( colour_matrix_coeff );
+ p_dec->fmt_out.video.b_color_range_full = full_range;
+ }
+ }
+
+ return VLC_SUCCESS;
+}
+
static int ParseVOP( decoder_t *p_dec, block_t *p_vop )
{
decoder_sys_t *p_sys = p_dec->p_sys;
More information about the vlc-commits
mailing list