|
|
|
@ -44,7 +44,7 @@ int has_altivec(void); |
|
|
|
|
* Structure for the private Xvid context. |
|
|
|
|
* This stores all the private context for the codec. |
|
|
|
|
*/ |
|
|
|
|
typedef struct xvid_context { |
|
|
|
|
struct xvid_context { |
|
|
|
|
void *encoder_handle; /** Handle for Xvid encoder */ |
|
|
|
|
int xsize, ysize; /** Frame size */ |
|
|
|
|
int vop_flags; /** VOP flags for Xvid encoder */ |
|
|
|
@ -58,15 +58,15 @@ typedef struct xvid_context { |
|
|
|
|
char *twopassfile; /** second pass temp file name */ |
|
|
|
|
unsigned char *intra_matrix; /** P-Frame Quant Matrix */ |
|
|
|
|
unsigned char *inter_matrix; /** I-Frame Quant Matrix */ |
|
|
|
|
} xvid_context_t; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Structure for the private first-pass plugin. |
|
|
|
|
*/ |
|
|
|
|
typedef struct xvid_ff_pass1 { |
|
|
|
|
struct xvid_ff_pass1 { |
|
|
|
|
int version; /** Xvid version */ |
|
|
|
|
xvid_context_t *context; /** Pointer to private context */ |
|
|
|
|
} xvid_ff_pass1_t; |
|
|
|
|
struct xvid_context *context; /** Pointer to private context */ |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/* Prototypes - See function implementation for details */ |
|
|
|
|
int xvid_strip_vol_header(AVCodecContext *avctx, unsigned char *frame, unsigned int header_len, unsigned int frame_len); |
|
|
|
@ -84,12 +84,12 @@ void xvid_correct_framerate(AVCodecContext *avctx); |
|
|
|
|
av_cold int ff_xvid_encode_init(AVCodecContext *avctx) { |
|
|
|
|
int xerr, i; |
|
|
|
|
int xvid_flags = avctx->flags; |
|
|
|
|
xvid_context_t *x = avctx->priv_data; |
|
|
|
|
struct xvid_context *x = avctx->priv_data; |
|
|
|
|
uint16_t *intra, *inter; |
|
|
|
|
int fd; |
|
|
|
|
|
|
|
|
|
xvid_plugin_single_t single; |
|
|
|
|
xvid_ff_pass1_t rc2pass1; |
|
|
|
|
struct xvid_ff_pass1 rc2pass1; |
|
|
|
|
xvid_plugin_2pass2_t rc2pass2; |
|
|
|
|
xvid_gbl_init_t xvid_gbl_init; |
|
|
|
|
xvid_enc_create_t xvid_enc_create; |
|
|
|
@ -208,7 +208,7 @@ av_cold int ff_xvid_encode_init(AVCodecContext *avctx) { |
|
|
|
|
x->twopassfile = NULL; |
|
|
|
|
|
|
|
|
|
if( xvid_flags & CODEC_FLAG_PASS1 ) { |
|
|
|
|
memset(&rc2pass1, 0, sizeof(xvid_ff_pass1_t)); |
|
|
|
|
memset(&rc2pass1, 0, sizeof(struct xvid_ff_pass1)); |
|
|
|
|
rc2pass1.version = XVID_VERSION; |
|
|
|
|
rc2pass1.context = x; |
|
|
|
|
x->twopassbuffer = av_malloc(BUFFER_SIZE); |
|
|
|
@ -370,7 +370,7 @@ int ff_xvid_encode_frame(AVCodecContext *avctx, |
|
|
|
|
unsigned char *frame, int buf_size, void *data) { |
|
|
|
|
int xerr, i; |
|
|
|
|
char *tmp; |
|
|
|
|
xvid_context_t *x = avctx->priv_data; |
|
|
|
|
struct xvid_context *x = avctx->priv_data; |
|
|
|
|
AVFrame *picture = data; |
|
|
|
|
AVFrame *p = &(x->encoded_picture); |
|
|
|
|
|
|
|
|
@ -475,7 +475,7 @@ int ff_xvid_encode_frame(AVCodecContext *avctx, |
|
|
|
|
* @return Returns 0, success guaranteed |
|
|
|
|
*/ |
|
|
|
|
av_cold int ff_xvid_encode_close(AVCodecContext *avctx) { |
|
|
|
|
xvid_context_t *x = avctx->priv_data; |
|
|
|
|
struct xvid_context *x = avctx->priv_data; |
|
|
|
|
|
|
|
|
|
xvid_encore(x->encoder_handle, XVID_ENC_DESTROY, NULL, NULL); |
|
|
|
|
|
|
|
|
@ -616,7 +616,7 @@ void xvid_correct_framerate(AVCodecContext *avctx) { |
|
|
|
|
*/ |
|
|
|
|
static int xvid_ff_2pass_create(xvid_plg_create_t * param, |
|
|
|
|
void ** handle) { |
|
|
|
|
xvid_ff_pass1_t *x = (xvid_ff_pass1_t *)param->param; |
|
|
|
|
struct xvid_ff_pass1 *x = (struct xvid_ff_pass1 *)param->param; |
|
|
|
|
char *log = x->context->twopassbuffer; |
|
|
|
|
|
|
|
|
|
/* Do a quick bounds check */ |
|
|
|
@ -645,7 +645,7 @@ static int xvid_ff_2pass_create(xvid_plg_create_t * param, |
|
|
|
|
* @param param Destrooy context |
|
|
|
|
* @return Returns 0, success guaranteed |
|
|
|
|
*/ |
|
|
|
|
static int xvid_ff_2pass_destroy(xvid_context_t *ref, |
|
|
|
|
static int xvid_ff_2pass_destroy(struct xvid_context *ref, |
|
|
|
|
xvid_plg_destroy_t *param) { |
|
|
|
|
/* Currently cannot think of anything to do on destruction */ |
|
|
|
|
/* Still, the framework should be here for reference/use */ |
|
|
|
@ -661,7 +661,7 @@ static int xvid_ff_2pass_destroy(xvid_context_t *ref, |
|
|
|
|
* @param param Frame data |
|
|
|
|
* @return Returns 0, success guaranteed |
|
|
|
|
*/ |
|
|
|
|
static int xvid_ff_2pass_before(xvid_context_t *ref, |
|
|
|
|
static int xvid_ff_2pass_before(struct xvid_context *ref, |
|
|
|
|
xvid_plg_data_t *param) { |
|
|
|
|
int motion_remove; |
|
|
|
|
int motion_replacements; |
|
|
|
@ -704,7 +704,7 @@ static int xvid_ff_2pass_before(xvid_context_t *ref, |
|
|
|
|
* @param param Statistic data |
|
|
|
|
* @return Returns XVID_ERR_xxxx on failure, or 0 on success |
|
|
|
|
*/ |
|
|
|
|
static int xvid_ff_2pass_after(xvid_context_t *ref, |
|
|
|
|
static int xvid_ff_2pass_after(struct xvid_context *ref, |
|
|
|
|
xvid_plg_data_t *param) { |
|
|
|
|
char *log = ref->twopassbuffer; |
|
|
|
|
char *frame_types = " ipbs"; |
|
|
|
@ -770,7 +770,7 @@ AVCodec libxvid_encoder = { |
|
|
|
|
"libxvid", |
|
|
|
|
CODEC_TYPE_VIDEO, |
|
|
|
|
CODEC_ID_XVID, |
|
|
|
|
sizeof(xvid_context_t), |
|
|
|
|
sizeof(struct xvid_context), |
|
|
|
|
ff_xvid_encode_init, |
|
|
|
|
ff_xvid_encode_frame, |
|
|
|
|
ff_xvid_encode_close, |
|
|
|
|