ffmpeg: Factorize video resampling.
This commit is contained in:
parent
dadbebbbbc
commit
ebf94f439e
111
ffmpeg.c
111
ffmpeg.c
@ -1073,14 +1073,71 @@ static void do_subtitle_out(AVFormatContext *s,
|
||||
static int bit_buffer_size= 1024*256;
|
||||
static uint8_t *bit_buffer= NULL;
|
||||
|
||||
static void do_video_resample(OutputStream *ost,
|
||||
InputStream *ist,
|
||||
AVFrame *in_picture,
|
||||
AVFrame **out_picture)
|
||||
{
|
||||
int resample_changed = 0;
|
||||
AVCodecContext *dec = ist->st->codec;
|
||||
*out_picture = in_picture;
|
||||
#if !CONFIG_AVFILTER
|
||||
resample_changed = ost->resample_width != dec->width ||
|
||||
ost->resample_height != dec->height ||
|
||||
ost->resample_pix_fmt != dec->pix_fmt;
|
||||
|
||||
if (resample_changed) {
|
||||
av_log(NULL, AV_LOG_INFO,
|
||||
"Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
|
||||
ist->file_index, ist->st->index,
|
||||
ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
|
||||
dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
|
||||
ost->resample_width = dec->width;
|
||||
ost->resample_height = dec->height;
|
||||
ost->resample_pix_fmt = dec->pix_fmt;
|
||||
}
|
||||
|
||||
ost->video_resample = dec->width != enc->width ||
|
||||
dec->height != enc->height ||
|
||||
dec->pix_fmt != enc->pix_fmt;
|
||||
|
||||
if (ost->video_resample) {
|
||||
*out_picture = &ost->resample_frame;
|
||||
if (!ost->img_resample_ctx || resample_changed) {
|
||||
/* initialize the destination picture */
|
||||
if (!ost->resample_frame.data[0]) {
|
||||
avcodec_get_frame_defaults(&ost->resample_frame);
|
||||
if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt,
|
||||
enc->width, enc->height)) {
|
||||
fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
|
||||
exit_program(1);
|
||||
}
|
||||
}
|
||||
/* initialize a new scaler context */
|
||||
sws_freeContext(ost->img_resample_ctx);
|
||||
ost->img_resample_ctx = sws_getContext(dec->width, dec->height, dec->pix_fmt,
|
||||
enc->width, enc->height, enc->pix_fmt,
|
||||
ost->sws_flags, NULL, NULL, NULL);
|
||||
if (ost->img_resample_ctx == NULL) {
|
||||
fprintf(stderr, "Cannot get resampling context\n");
|
||||
exit_program(1);
|
||||
}
|
||||
}
|
||||
sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
|
||||
0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
static void do_video_out(AVFormatContext *s,
|
||||
OutputStream *ost,
|
||||
InputStream *ist,
|
||||
AVFrame *in_picture,
|
||||
int *frame_size, float quality)
|
||||
{
|
||||
int nb_frames, i, ret, av_unused resample_changed;
|
||||
AVFrame *final_picture, *formatted_picture;
|
||||
int nb_frames, i, ret;
|
||||
AVFrame *final_picture;
|
||||
AVCodecContext *enc, *dec;
|
||||
double sync_ipts;
|
||||
|
||||
@ -1123,55 +1180,7 @@ static void do_video_out(AVFormatContext *s,
|
||||
if (nb_frames <= 0)
|
||||
return;
|
||||
|
||||
formatted_picture = in_picture;
|
||||
final_picture = formatted_picture;
|
||||
|
||||
#if !CONFIG_AVFILTER
|
||||
resample_changed = ost->resample_width != dec->width ||
|
||||
ost->resample_height != dec->height ||
|
||||
ost->resample_pix_fmt != dec->pix_fmt;
|
||||
|
||||
if (resample_changed) {
|
||||
av_log(NULL, AV_LOG_INFO,
|
||||
"Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
|
||||
ist->file_index, ist->st->index,
|
||||
ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
|
||||
dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
|
||||
ost->resample_width = dec->width;
|
||||
ost->resample_height = dec->height;
|
||||
ost->resample_pix_fmt = dec->pix_fmt;
|
||||
}
|
||||
|
||||
ost->video_resample = dec->width != enc->width ||
|
||||
dec->height != enc->height ||
|
||||
dec->pix_fmt != enc->pix_fmt;
|
||||
|
||||
if (ost->video_resample) {
|
||||
final_picture = &ost->resample_frame;
|
||||
if (!ost->img_resample_ctx || resample_changed) {
|
||||
/* initialize the destination picture */
|
||||
if (!ost->resample_frame.data[0]) {
|
||||
avcodec_get_frame_defaults(&ost->resample_frame);
|
||||
if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt,
|
||||
enc->width, enc->height)) {
|
||||
fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
|
||||
exit_program(1);
|
||||
}
|
||||
}
|
||||
/* initialize a new scaler context */
|
||||
sws_freeContext(ost->img_resample_ctx);
|
||||
ost->img_resample_ctx = sws_getContext(dec->width, dec->height, dec->pix_fmt,
|
||||
enc->width, enc->height, enc->pix_fmt,
|
||||
ost->sws_flags, NULL, NULL, NULL);
|
||||
if (ost->img_resample_ctx == NULL) {
|
||||
fprintf(stderr, "Cannot get resampling context\n");
|
||||
exit_program(1);
|
||||
}
|
||||
}
|
||||
sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
|
||||
0, ost->resample_height, final_picture->data, final_picture->linesize);
|
||||
}
|
||||
#endif
|
||||
do_video_resample(ost, ist, in_picture, &final_picture);
|
||||
|
||||
/* duplicates frame if needed */
|
||||
for(i=0;i<nb_frames;i++) {
|
||||
|
Loading…
Reference in New Issue
Block a user