@ -37,6 +37,7 @@
# include "libavutil/internal.h"
# include "libavutil/mastering_display_metadata.h"
# include "libavutil/mem.h"
# include "libavutil/stereo3d.h"
# include "avcodec.h"
# include "avcodec_internal.h"
@ -1423,6 +1424,42 @@ const AVPacketSideData *ff_get_coded_side_data(const AVCodecContext *avctx,
return packet_side_data_get ( avctx - > coded_side_data , avctx - > nb_coded_side_data , type ) ;
}
static int side_data_stereo3d_merge ( AVFrameSideData * sd_frame ,
const AVPacketSideData * sd_pkt )
{
const AVStereo3D * src ;
AVStereo3D * dst ;
int ret ;
ret = av_buffer_make_writable ( & sd_frame - > buf ) ;
if ( ret < 0 )
return ret ;
sd_frame - > data = sd_frame - > buf - > data ;
dst = ( AVStereo3D * ) sd_frame - > data ;
src = ( const AVStereo3D * ) sd_pkt - > data ;
if ( dst - > type = = AV_STEREO3D_UNSPEC )
dst - > type = src - > type ;
if ( dst - > view = = AV_STEREO3D_VIEW_UNSPEC )
dst - > view = src - > view ;
if ( dst - > primary_eye = = AV_PRIMARY_EYE_NONE )
dst - > primary_eye = src - > primary_eye ;
if ( ! dst - > baseline )
dst - > baseline = src - > baseline ;
if ( ! dst - > horizontal_disparity_adjustment . num )
dst - > horizontal_disparity_adjustment = src - > horizontal_disparity_adjustment ;
if ( ! dst - > horizontal_field_of_view . num )
dst - > horizontal_field_of_view = src - > horizontal_field_of_view ;
return 0 ;
}
static int side_data_map ( AVFrame * dst ,
const AVPacketSideData * sd_src , int nb_sd_src ,
const SideDataMap * map )
@ -1439,8 +1476,15 @@ static int side_data_map(AVFrame *dst,
continue ;
sd_frame = av_frame_get_side_data ( dst , type_frame ) ;
if ( sd_frame )
if ( sd_frame ) {
if ( type_frame = = AV_FRAME_DATA_STEREO3D ) {
int ret = side_data_stereo3d_merge ( sd_frame , sd_pkt ) ;
if ( ret < 0 )
return ret ;
}
continue ;
}
sd_frame = av_frame_new_side_data ( dst , type_frame , sd_pkt - > size ) ;
if ( ! sd_frame )