@ -23,6 +23,7 @@
# include "libavutil/opt.h"
# include "libavutil/mem.h"
# include "libavutil/pixdesc.h"
# include "libavutil/stereo3d.h"
# include "avcodec.h"
# include "internal.h"
@ -161,6 +162,7 @@ static int X264_frame(AVCodecContext *ctx, AVPacket *pkt, const AVFrame *frame,
x264_nal_t * nal ;
int nnal , i , ret ;
x264_picture_t pic_out = { 0 } ;
AVFrameSideData * side_data ;
x264_picture_init ( & x4 - > pic ) ;
x4 - > pic . img . i_csp = x4 - > params . i_csp ;
@ -190,8 +192,42 @@ static int X264_frame(AVCodecContext *ctx, AVPacket *pkt, const AVFrame *frame,
x4 - > params . vui . i_sar_width = ctx - > sample_aspect_ratio . num ;
x264_encoder_reconfig ( x4 - > enc , & x4 - > params ) ;
}
}
side_data = av_frame_get_side_data ( frame , AV_FRAME_DATA_STEREO3D ) ;
if ( side_data ) {
AVStereo3D * stereo = ( AVStereo3D * ) side_data - > data ;
int fpa_type ;
switch ( stereo - > type ) {
case AV_STEREO3D_CHECKERBOARD :
fpa_type = 0 ;
break ;
case AV_STEREO3D_LINES :
fpa_type = 1 ;
break ;
case AV_STEREO3D_COLUMNS :
fpa_type = 2 ;
break ;
case AV_STEREO3D_SIDEBYSIDE :
fpa_type = 3 ;
break ;
case AV_STEREO3D_TOPBOTTOM :
fpa_type = 4 ;
break ;
case AV_STEREO3D_FRAMESEQUENCE :
fpa_type = 5 ;
break ;
default :
fpa_type = - 1 ;
break ;
}
if ( fpa_type ! = x4 - > params . i_frame_packing ) {
x4 - > params . i_frame_packing = fpa_type ;
x264_encoder_reconfig ( x4 - > enc , & x4 - > params ) ;
}
}
}
do {
if ( x264_encoder_encode ( x4 - > enc , & nal , & nnal , frame ? & x4 - > pic : NULL , & pic_out ) < 0 )
return - 1 ;