mirror of https://git.ffmpeg.org/ffmpeg.git
output example: store the scaling context in the stream context
This commit is contained in:
parent
6a927d7aaf
commit
a7fcd4122b
|
@ -55,6 +55,8 @@ typedef struct OutputStream {
|
||||||
AVFrame *tmp_frame;
|
AVFrame *tmp_frame;
|
||||||
|
|
||||||
float t, tincr, tincr2;
|
float t, tincr, tincr2;
|
||||||
|
|
||||||
|
struct SwsContext *sws_ctx;
|
||||||
} OutputStream;
|
} OutputStream;
|
||||||
|
|
||||||
/**************************************************************/
|
/**************************************************************/
|
||||||
|
@ -327,7 +329,6 @@ static void write_video_frame(AVFormatContext *oc, OutputStream *ost)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
AVCodecContext *c;
|
AVCodecContext *c;
|
||||||
static struct SwsContext *img_convert_ctx;
|
|
||||||
|
|
||||||
c = ost->st->codec;
|
c = ost->st->codec;
|
||||||
|
|
||||||
|
@ -339,20 +340,20 @@ static void write_video_frame(AVFormatContext *oc, OutputStream *ost)
|
||||||
if (c->pix_fmt != AV_PIX_FMT_YUV420P) {
|
if (c->pix_fmt != AV_PIX_FMT_YUV420P) {
|
||||||
/* as we only generate a YUV420P picture, we must convert it
|
/* as we only generate a YUV420P picture, we must convert it
|
||||||
* to the codec pixel format if needed */
|
* to the codec pixel format if needed */
|
||||||
if (img_convert_ctx == NULL) {
|
if (!ost->sws_ctx) {
|
||||||
img_convert_ctx = sws_getContext(c->width, c->height,
|
ost->sws_ctx = sws_getContext(c->width, c->height,
|
||||||
AV_PIX_FMT_YUV420P,
|
AV_PIX_FMT_YUV420P,
|
||||||
c->width, c->height,
|
c->width, c->height,
|
||||||
c->pix_fmt,
|
c->pix_fmt,
|
||||||
SCALE_FLAGS, NULL, NULL, NULL);
|
SCALE_FLAGS, NULL, NULL, NULL);
|
||||||
if (img_convert_ctx == NULL) {
|
if (!ost->sws_ctx) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Cannot initialize the conversion context\n");
|
"Cannot initialize the conversion context\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fill_yuv_image(ost->tmp_frame, frame_count, c->width, c->height);
|
fill_yuv_image(ost->tmp_frame, frame_count, c->width, c->height);
|
||||||
sws_scale(img_convert_ctx, ost->tmp_frame->data, ost->tmp_frame->linesize,
|
sws_scale(ost->sws_ctx, ost->tmp_frame->data, ost->tmp_frame->linesize,
|
||||||
0, c->height, ost->frame->data, ost->frame->linesize);
|
0, c->height, ost->frame->data, ost->frame->linesize);
|
||||||
} else {
|
} else {
|
||||||
fill_yuv_image(ost->frame, frame_count, c->width, c->height);
|
fill_yuv_image(ost->frame, frame_count, c->width, c->height);
|
||||||
|
@ -401,6 +402,7 @@ static void close_stream(AVFormatContext *oc, OutputStream *ost)
|
||||||
avcodec_close(ost->st->codec);
|
avcodec_close(ost->st->codec);
|
||||||
av_frame_free(&ost->frame);
|
av_frame_free(&ost->frame);
|
||||||
av_frame_free(&ost->tmp_frame);
|
av_frame_free(&ost->tmp_frame);
|
||||||
|
sws_freeContext(ost->sws_ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************************/
|
/**************************************************************/
|
||||||
|
|
Loading…
Reference in New Issue