Commit 718d7279 authored by François Cartegnie's avatar François Cartegnie 🤞
Browse files

packetizer: mpeg4video: parse/set color space

parent bd8d39bc
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
#include <vlc_block_helper.h> #include <vlc_block_helper.h>
#include "packetizer_helper.h" #include "packetizer_helper.h"
#include "startcode_helper.h" #include "startcode_helper.h"
#include "hxxx_nal.h" /* colour values/mappings */
/***************************************************************************** /*****************************************************************************
* Module descriptor * Module descriptor
...@@ -100,6 +101,7 @@ static int PacketizeValidate( void *p_private, block_t * ); ...@@ -100,6 +101,7 @@ static int PacketizeValidate( void *p_private, block_t * );
static block_t *ParseMPEGBlock( decoder_t *, block_t * ); static block_t *ParseMPEGBlock( decoder_t *, block_t * );
static int ParseVOL( decoder_t *, es_format_t *, uint8_t *, int ); 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 ParseVOP( decoder_t *, block_t * );
static int vlc_log2( unsigned int ); static int vlc_log2( unsigned int );
...@@ -330,6 +332,11 @@ static block_t *ParseMPEGBlock( decoder_t *p_dec, block_t *p_frag ) ...@@ -330,6 +332,11 @@ static block_t *ParseMPEGBlock( decoder_t *p_dec, block_t *p_frag )
block_ChainLastAppend( &p_sys->pp_last, 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 && if( p_frag->p_buffer[3] == 0xb6 &&
ParseVOP( p_dec, p_frag ) == VLC_SUCCESS ) ParseVOP( p_dec, p_frag ) == VLC_SUCCESS )
{ {
...@@ -437,6 +444,45 @@ static int ParseVOL( decoder_t *p_dec, es_format_t *fmt, ...@@ -437,6 +444,45 @@ static int ParseVOL( decoder_t *p_dec, es_format_t *fmt,
return VLC_SUCCESS; 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 ) static int ParseVOP( decoder_t *p_dec, block_t *p_vop )
{ {
decoder_sys_t *p_sys = p_dec->p_sys; decoder_sys_t *p_sys = p_dec->p_sys;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment