Commit bfaa0ce9 authored by Francois Cartegnie's avatar Francois Cartegnie

videotoolbox: fix build / h264 conversion

parent 0da5762a
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#import <vlc_plugin.h> #import <vlc_plugin.h>
#import <vlc_codec.h> #import <vlc_codec.h>
#import "../packetizer/h264_nal.h" #import "../packetizer/h264_nal.h"
#import "../packetizer/hxxx_nal.h"
#import "../video_chroma/copy.h" #import "../video_chroma/copy.h"
#import <vlc_bits.h> #import <vlc_bits.h>
#import <vlc_boxes.h> #import <vlc_boxes.h>
...@@ -350,26 +351,31 @@ static int StartVideoToolbox(decoder_t *p_dec, block_t *p_block) ...@@ -350,26 +351,31 @@ static int StartVideoToolbox(decoder_t *p_dec, block_t *p_block)
return VLC_EGENERIC; return VLC_EGENERIC;
} }
struct h264_nal_sps sps_data; /* Decode Sequence Parameter Set */
i_ret = h264_parse_sps(p_sps_buf, const uint8_t *p_stp_sps_buf = p_sps_buf;
i_sps_size, size_t i_stp_sps_nal = i_sps_size;
&sps_data); h264_sequence_parameter_set_t *p_sps_data;
if( !hxxx_strip_AnnexB_startcode( &p_stp_sps_buf, &i_stp_sps_nal ) ||
if (i_ret != VLC_SUCCESS) { !( p_sps_data = h264_decode_sps(p_stp_sps_buf, i_stp_sps_nal, true) ) )
{
msg_Warn(p_dec, "sps pps parsing failed"); msg_Warn(p_dec, "sps pps parsing failed");
return VLC_EGENERIC; return VLC_EGENERIC;
} }
/* this data is more trust-worthy than what we receive /* this data is more trust-worthy than what we receive
* from the demuxer, so we will use it to over-write * from the demuxer, so we will use it to over-write
* the current values */ * the current values */
i_video_width = sps_data.i_width; i_video_width = p_sps_data->i_width;
i_video_height = sps_data.i_height; i_video_height = p_sps_data->i_height;
i_sar_den = sps_data.vui.i_sar_den; i_sar_den = p_sps_data->vui.i_sar_den;
i_sar_num = sps_data.vui.i_sar_num; i_sar_num = p_sps_data->vui.i_sar_num;
/* no evaluation here as this is done in the precheck */ /* no evaluation here as this is done in the precheck */
p_sys->codec_profile = sps_data.i_profile; p_sys->codec_profile = p_sps_data->i_profile;
p_sys->codec_level = sps_data.i_level; p_sys->codec_level = p_sps_data->i_level;
h264_release_sps( p_sps_data );
/* !Decode Sequence Parameter Set */
if(!p_sys->b_is_avcc) if(!p_sys->b_is_avcc)
{ {
...@@ -811,7 +817,7 @@ static block_t *H264ProcessBlock(decoder_t *p_dec, block_t *p_block) ...@@ -811,7 +817,7 @@ static block_t *H264ProcessBlock(decoder_t *p_dec, block_t *p_block)
{ {
decoder_sys_t *p_sys = p_dec->p_sys; decoder_sys_t *p_sys = p_dec->p_sys;
if (p_sys->b_is_avcc) if (p_sys->b_is_avcc) /* FIXME: no change checks done for AVC ? */
return p_block; return p_block;
uint8_t *p_sps_buf = NULL, *p_pps_buf = NULL; uint8_t *p_sps_buf = NULL, *p_pps_buf = NULL;
...@@ -826,45 +832,47 @@ static block_t *H264ProcessBlock(decoder_t *p_dec, block_t *p_block) ...@@ -826,45 +832,47 @@ static block_t *H264ProcessBlock(decoder_t *p_dec, block_t *p_block)
&i_pps_size); &i_pps_size);
if (i_ret == VLC_SUCCESS) { if (i_ret == VLC_SUCCESS) {
struct h264_nal_sps sps_data; /* Decode Sequence Parameter Set */
i_ret = h264_parse_sps(p_sps_buf, const uint8_t *p_stp_sps_buf = p_sps_buf;
i_sps_size, size_t i_stp_sps_nal = i_sps_size;
&sps_data); h264_sequence_parameter_set_t *p_sps_data;
if( hxxx_strip_AnnexB_startcode( &p_stp_sps_buf, &i_stp_sps_nal ) &&
if (i_ret == VLC_SUCCESS) { ( p_sps_data = h264_decode_sps(p_stp_sps_buf, i_stp_sps_nal, true) ) )
{
bool b_something_changed = false; bool b_something_changed = false;
if (p_sys->codec_profile != p_sps_data->i_profile) {
if (p_sys->codec_profile != sps_data.i_profile) {
msg_Warn(p_dec, "mid stream profile change found, restarting decoder"); msg_Warn(p_dec, "mid stream profile change found, restarting decoder");
b_something_changed = true; b_something_changed = true;
} else if (p_sys->codec_level != sps_data.i_level) { } else if (p_sys->codec_level != p_sps_data->i_level) {
msg_Warn(p_dec, "mid stream level change found, restarting decoder"); msg_Warn(p_dec, "mid stream level change found, restarting decoder");
b_something_changed = true; b_something_changed = true;
} else if (p_dec->fmt_out.video.i_width != sps_data.i_width) { } else if (p_dec->fmt_out.video.i_width != p_sps_data->i_width) {
msg_Warn(p_dec, "mid stream width change found, restarting decoder"); msg_Warn(p_dec, "mid stream width change found, restarting decoder");
b_something_changed = true; b_something_changed = true;
} else if (p_dec->fmt_out.video.i_height != sps_data.i_height) { } else if (p_dec->fmt_out.video.i_height != p_sps_data->i_height) {
msg_Warn(p_dec, "mid stream height change found, restarting decoder"); msg_Warn(p_dec, "mid stream height change found, restarting decoder");
b_something_changed = true; b_something_changed = true;
} else if (p_dec->fmt_out.video.i_sar_den != sps_data.vui.i_sar_den) { } else if (p_dec->fmt_out.video.i_sar_den != p_sps_data->vui.i_sar_den) {
msg_Warn(p_dec, "mid stream SAR DEN change found, restarting decoder"); msg_Warn(p_dec, "mid stream SAR DEN change found, restarting decoder");
b_something_changed = true; b_something_changed = true;
} else if (p_dec->fmt_out.video.i_sar_num != sps_data.vui.i_sar_num) { } else if (p_dec->fmt_out.video.i_sar_num != p_sps_data->vui.i_sar_num) {
msg_Warn(p_dec, "mid stream SAR NUM change found, restarting decoder"); msg_Warn(p_dec, "mid stream SAR NUM change found, restarting decoder");
b_something_changed = true; b_something_changed = true;
} }
if (b_something_changed) { if (b_something_changed)
p_sys->codec_profile = sps_data.i_profile; {
p_sys->codec_level = sps_data.i_level; p_sys->codec_profile = p_sps_data->i_profile;
p_sys->codec_level = p_sps_data->i_level;
StopVideoToolbox(p_dec); StopVideoToolbox(p_dec);
block_Release(p_block); block_Release(p_block);
return NULL; p_block = NULL;
} }
h264_release_sps( p_sps_data );
} }
} }
return h264_AnnexB_to_AVC(p_block, p_sys->i_nal_length_size); return (p_block) ? h264_AnnexB_to_AVC(p_block, p_sys->i_nal_length_size) : NULL;
} }
static CMSampleBufferRef VTSampleBufferCreate(decoder_t *p_dec, static CMSampleBufferRef VTSampleBufferCreate(decoder_t *p_dec,
......
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