@ -77,33 +77,32 @@ typedef struct SchroEncoderParams {
/**
* Works out Schro - compatible chroma format .
*/
static int set_chroma_format ( AVCodecContext * avccon te xt )
static int set_chroma_format ( AVCodecContext * avctx )
{
int num_formats = sizeof ( schro_pixel_format_map ) /
sizeof ( schro_pixel_format_map [ 0 ] ) ;
int idx ;
SchroEncoderParams * p_schro_params = avccon te xt - > priv_data ;
SchroEncoderParams * p_schro_params = avctx - > priv_data ;
for ( idx = 0 ; idx < num_formats ; + + idx ) {
if ( schro_pixel_format_map [ idx ] . ff_pix_fmt = =
avccontext - > pix_fmt ) {
if ( schro_pixel_format_map [ idx ] . ff_pix_fmt = = avctx - > pix_fmt ) {
p_schro_params - > format - > chroma_format =
schro_pixel_format_map [ idx ] . schro_pix_fmt ;
return 0 ;
}
}
av_log ( avccon te xt , AV_LOG_ERROR ,
av_log ( avctx , AV_LOG_ERROR ,
" This codec currently only supports planar YUV 4:2:0, 4:2:2 "
" and 4:4:4 formats. \n " ) ;
return - 1 ;
}
static int libschroedinger_encode_init ( AVCodecContext * avccon te xt )
static int libschroedinger_encode_init ( AVCodecContext * avctx )
{
SchroEncoderParams * p_schro_params = avccon te xt - > priv_data ;
SchroEncoderParams * p_schro_params = avctx - > priv_data ;
SchroVideoFormatEnum preset ;
/* Initialize the libraries that libschroedinger depends on. */
@ -113,75 +112,75 @@ static int libschroedinger_encode_init(AVCodecContext *avccontext)
p_schro_params - > encoder = schro_encoder_new ( ) ;
if ( ! p_schro_params - > encoder ) {
av_log ( avccon te xt , AV_LOG_ERROR ,
av_log ( avctx , AV_LOG_ERROR ,
" Unrecoverable Error: schro_encoder_new failed. " ) ;
return - 1 ;
}
/* Initialize the format. */
preset = ff_get_schro_video_format_preset ( avccon te xt ) ;
preset = ff_get_schro_video_format_preset ( avctx ) ;
p_schro_params - > format =
schro_encoder_get_video_format ( p_schro_params - > encoder ) ;
schro_video_format_set_std_video_format ( p_schro_params - > format , preset ) ;
p_schro_params - > format - > width = avccon te xt - > width ;
p_schro_params - > format - > height = avccon te xt - > height ;
p_schro_params - > format - > width = avctx - > width ;
p_schro_params - > format - > height = avctx - > height ;
if ( set_chroma_format ( avccon te xt ) = = - 1 )
if ( set_chroma_format ( avctx ) = = - 1 )
return - 1 ;
if ( avccon te xt - > color_primaries = = AVCOL_PRI_BT709 ) {
if ( avctx - > color_primaries = = AVCOL_PRI_BT709 ) {
p_schro_params - > format - > colour_primaries = SCHRO_COLOUR_PRIMARY_HDTV ;
} else if ( avccon te xt - > color_primaries = = AVCOL_PRI_BT470BG ) {
} else if ( avctx - > color_primaries = = AVCOL_PRI_BT470BG ) {
p_schro_params - > format - > colour_primaries = SCHRO_COLOUR_PRIMARY_SDTV_625 ;
} else if ( avccon te xt - > color_primaries = = AVCOL_PRI_SMPTE170M ) {
} else if ( avctx - > color_primaries = = AVCOL_PRI_SMPTE170M ) {
p_schro_params - > format - > colour_primaries = SCHRO_COLOUR_PRIMARY_SDTV_525 ;
}
if ( avccon te xt - > colorspace = = AVCOL_SPC_BT709 ) {
if ( avctx - > colorspace = = AVCOL_SPC_BT709 ) {
p_schro_params - > format - > colour_matrix = SCHRO_COLOUR_MATRIX_HDTV ;
} else if ( avccon te xt - > colorspace = = AVCOL_SPC_BT470BG ) {
} else if ( avctx - > colorspace = = AVCOL_SPC_BT470BG ) {
p_schro_params - > format - > colour_matrix = SCHRO_COLOUR_MATRIX_SDTV ;
}
if ( avccon te xt - > color_trc = = AVCOL_TRC_BT709 ) {
if ( avctx - > color_trc = = AVCOL_TRC_BT709 ) {
p_schro_params - > format - > transfer_function = SCHRO_TRANSFER_CHAR_TV_GAMMA ;
}
if ( ff_get_schro_frame_format ( p_schro_params - > format - > chroma_format ,
& p_schro_params - > frame_format ) = = - 1 ) {
av_log ( avccon te xt , AV_LOG_ERROR ,
av_log ( avctx , AV_LOG_ERROR ,
" This codec currently supports only planar YUV 4:2:0, 4:2:2 "
" and 4:4:4 formats. \n " ) ;
return - 1 ;
}
p_schro_params - > format - > frame_rate_numerator = avccon te xt - > time_base . den ;
p_schro_params - > format - > frame_rate_denominator = avccon te xt - > time_base . num ;
p_schro_params - > format - > frame_rate_numerator = avctx - > time_base . den ;
p_schro_params - > format - > frame_rate_denominator = avctx - > time_base . num ;
p_schro_params - > frame_size = avpicture_get_size ( avccon te xt - > pix_fmt ,
avccon te xt - > width ,
avccon te xt - > height ) ;
p_schro_params - > frame_size = avpicture_get_size ( avctx - > pix_fmt ,
avctx - > width ,
avctx - > height ) ;
avccon te xt - > coded_frame = & p_schro_params - > picture ;
avctx - > coded_frame = & p_schro_params - > picture ;
if ( ! avccon te xt - > gop_size ) {
if ( ! avctx - > gop_size ) {
schro_encoder_setting_set_double ( p_schro_params - > encoder ,
" gop_structure " ,
SCHRO_ENCODER_GOP_INTRA_ONLY ) ;
if ( avccon te xt - > coder_type = = FF_CODER_TYPE_VLC )
if ( avctx - > coder_type = = FF_CODER_TYPE_VLC )
schro_encoder_setting_set_double ( p_schro_params - > encoder ,
" enable_noarith " , 1 ) ;
} else {
schro_encoder_setting_set_double ( p_schro_params - > encoder ,
" au_distance " , avccon te xt - > gop_size ) ;
avccon te xt - > has_b_frames = 1 ;
" au_distance " , avctx - > gop_size ) ;
avctx - > has_b_frames = 1 ;
p_schro_params - > dts = - 1 ;
}
/* FIXME - Need to handle SCHRO_ENCODER_RATE_CONTROL_LOW_DELAY. */
if ( avccon te xt - > flags & CODEC_FLAG_QSCALE ) {
if ( ! avccon te xt - > global_quality ) {
if ( avctx - > flags & CODEC_FLAG_QSCALE ) {
if ( ! avctx - > global_quality ) {
/* lossless coding */
schro_encoder_setting_set_double ( p_schro_params - > encoder ,
" rate_control " ,
@ -192,7 +191,7 @@ static int libschroedinger_encode_init(AVCodecContext *avccontext)
" rate_control " ,
SCHRO_ENCODER_RATE_CONTROL_CONSTANT_QUALITY ) ;
quality = avccon te xt - > global_quality / FF_QP2LAMBDA ;
quality = avctx - > global_quality / FF_QP2LAMBDA ;
if ( quality > 10 )
quality = 10 ;
schro_encoder_setting_set_double ( p_schro_params - > encoder ,
@ -204,19 +203,17 @@ static int libschroedinger_encode_init(AVCodecContext *avccontext)
SCHRO_ENCODER_RATE_CONTROL_CONSTANT_BITRATE ) ;
schro_encoder_setting_set_double ( p_schro_params - > encoder ,
" bitrate " ,
avccontext - > bit_rate ) ;
" bitrate " , avctx - > bit_rate ) ;
}
if ( avccon te xt - > flags & CODEC_FLAG_INTERLACED_ME )
if ( avctx - > flags & CODEC_FLAG_INTERLACED_ME )
/* All material can be coded as interlaced or progressive
irrespective of the type of source material . */
schro_encoder_setting_set_double ( p_schro_params - > encoder ,
" interlaced_coding " , 1 ) ;
schro_encoder_setting_set_double ( p_schro_params - > encoder , " open_gop " ,
! ( avccon te xt - > flags & CODEC_FLAG_CLOSED_GOP ) ) ;
! ( avctx - > flags & CODEC_FLAG_CLOSED_GOP ) ) ;
/* FIXME: Signal range hardcoded to 8-bit data until both libschroedinger
* and libdirac support other bit - depth data . */
@ -228,7 +225,7 @@ static int libschroedinger_encode_init(AVCodecContext *avccontext)
p_schro_params - > format ) ;
/* Set the debug level. */
schro_debug_set_level ( avccon te xt - > debug ) ;
schro_debug_set_level ( avctx - > debug ) ;
schro_encoder_start ( p_schro_params - > encoder ) ;
@ -237,19 +234,19 @@ static int libschroedinger_encode_init(AVCodecContext *avccontext)
return 0 ;
}
static SchroFrame * libschroedinger_frame_from_data ( AVCodecContext * avccon te xt ,
static SchroFrame * libschroedinger_frame_from_data ( AVCodecContext * avctx ,
const AVFrame * frame )
{
SchroEncoderParams * p_schro_params = avccon te xt - > priv_data ;
SchroEncoderParams * p_schro_params = avctx - > priv_data ;
SchroFrame * in_frame ;
/* Input line size may differ from what the codec supports. Especially
* when transcoding from one format to another . So use avpicture_layout
* to copy the frame . */
in_frame = ff_create_schro_frame ( avccon te xt , p_schro_params - > frame_format ) ;
in_frame = ff_create_schro_frame ( avctx , p_schro_params - > frame_format ) ;
if ( in_frame )
avpicture_layout ( ( const AVPicture * ) frame , avccon te xt - > pix_fmt ,
avccon te xt - > width , avccon te xt - > height ,
avpicture_layout ( ( const AVPicture * ) frame , avctx - > pix_fmt ,
avctx - > width , avctx - > height ,
in_frame - > components [ 0 ] . data ,
p_schro_params - > frame_size ) ;
@ -264,11 +261,11 @@ static void libschroedinger_free_frame(void *data)
av_free ( enc_frame ) ;
}
static int libschroedinger_encode_frame ( AVCodecContext * avccon te xt , AVPacket * pkt ,
static int libschroedinger_encode_frame ( AVCodecContext * avctx , AVPacket * pkt ,
const AVFrame * frame , int * got_packet )
{
int enc_size = 0 ;
SchroEncoderParams * p_schro_params = avccon te xt - > priv_data ;
SchroEncoderParams * p_schro_params = avctx - > priv_data ;
SchroEncoder * encoder = p_schro_params - > encoder ;
struct FFSchroEncodedFrame * p_frame_output = NULL ;
int go = 1 ;
@ -286,8 +283,7 @@ static int libschroedinger_encode_frame(AVCodecContext *avccontext, AVPacket *pk
}
} else {
/* Allocate frame data to schro input buffer. */
SchroFrame * in_frame = libschroedinger_frame_from_data ( avccontext ,
frame ) ;
SchroFrame * in_frame = libschroedinger_frame_from_data ( avctx , frame ) ;
/* Load next frame. */
schro_encoder_push_frame ( encoder , in_frame ) ;
}
@ -358,7 +354,7 @@ static int libschroedinger_encode_frame(AVCodecContext *avccontext, AVPacket *pk
break ;
default :
av_log ( avccon te xt , AV_LOG_ERROR , " Unknown Schro Encoder state \n " ) ;
av_log ( avctx , AV_LOG_ERROR , " Unknown Schro Encoder state \n " ) ;
return - 1 ;
}
}
@ -377,16 +373,16 @@ static int libschroedinger_encode_frame(AVCodecContext *avccontext, AVPacket *pk
pkt_size = p_frame_output - > size ;
if ( last_frame_in_sequence & & p_schro_params - > enc_buf_size > 0 )
pkt_size + = p_schro_params - > enc_buf_size ;
if ( ( ret = ff_alloc_packet2 ( avccon te xt , pkt , pkt_size ) ) < 0 )
if ( ( ret = ff_alloc_packet2 ( avctx , pkt , pkt_size ) ) < 0 )
goto error ;
memcpy ( pkt - > data , p_frame_output - > p_encbuf , p_frame_output - > size ) ;
avccon te xt - > coded_frame - > key_frame = p_frame_output - > key_frame ;
avctx - > coded_frame - > key_frame = p_frame_output - > key_frame ;
/* Use the frame number of the encoded frame as the pts. It is OK to
* do so since Dirac is a constant frame rate codec . It expects input
* to be of constant frame rate . */
pkt - > pts =
avccon te xt - > coded_frame - > pts = p_frame_output - > frame_num ;
avctx - > coded_frame - > pts = p_frame_output - > frame_num ;
pkt - > dts = p_schro_params - > dts + + ;
enc_size = p_frame_output - > size ;
@ -411,9 +407,9 @@ error:
}
static int libschroedinger_encode_close ( AVCodecContext * avccon te xt )
static int libschroedinger_encode_close ( AVCodecContext * avctx )
{
SchroEncoderParams * p_schro_params = avccon te xt - > priv_data ;
SchroEncoderParams * p_schro_params = avctx - > priv_data ;
/* Close the encoder. */
schro_encoder_free ( p_schro_params - > encoder ) ;