From c30a4489b444020ef951c1f0583afd8679c07c78 Mon Sep 17 00:00:00 2001 From: Aurelien Jacobs Date: Sat, 23 Aug 2008 23:13:58 +0000 Subject: [PATCH] export sample_aspect_ratio read by the demuxer in a separate field that the one read by the decoder. Originally committed as revision 14932 to svn://svn.ffmpeg.org/ffmpeg/trunk --- ffmpeg.c | 8 +++++++- ffplay.c | 13 +++++++------ libavformat/avformat.h | 9 ++++++++- libavformat/utils.c | 2 ++ 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/ffmpeg.c b/ffmpeg.c index b4b0ee0520..493cacb0df 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -2888,7 +2888,11 @@ static void opt_input_file(const char *filename) set_context_opts(enc, avctx_opts[CODEC_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM); frame_height = enc->height; frame_width = enc->width; - frame_aspect_ratio = av_q2d(enc->sample_aspect_ratio) * enc->width / enc->height; + if(ic->streams[i]->sample_aspect_ratio.num) + frame_aspect_ratio=av_q2d(ic->streams[i]->sample_aspect_ratio); + else + frame_aspect_ratio=av_q2d(enc->sample_aspect_ratio); + frame_aspect_ratio *= (float) enc->width / enc->height; frame_pix_fmt = enc->pix_fmt; rfps = ic->streams[i]->r_frame_rate.num; rfps_base = ic->streams[i]->r_frame_rate.den; @@ -3019,6 +3023,7 @@ static void new_video_stream(AVFormatContext *oc) if (video_stream_copy) { st->stream_copy = 1; video_enc->codec_type = CODEC_TYPE_VIDEO; + st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255); } else { const char *p; int i; @@ -3056,6 +3061,7 @@ static void new_video_stream(AVFormatContext *oc) video_enc->height = frame_height + frame_padtop + frame_padbottom; video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255); video_enc->pix_fmt = frame_pix_fmt; + st->sample_aspect_ratio = video_enc->sample_aspect_ratio; if(codec && codec->pix_fmts){ const enum PixelFormat *p= codec->pix_fmts; diff --git a/ffplay.c b/ffplay.c index 38080e70dd..7ea077d3bd 100644 --- a/ffplay.c +++ b/ffplay.c @@ -657,14 +657,15 @@ static void video_image_display(VideoState *is) vp = &is->pictq[is->pictq_rindex]; if (vp->bmp) { /* XXX: use variable in the frame */ - if (is->video_st->codec->sample_aspect_ratio.num == 0) - aspect_ratio = 0; + if (is->video_st->sample_aspect_ratio.num) + aspect_ratio = av_q2d(is->video_st->sample_aspect_ratio); + else if (is->video_st->codec->sample_aspect_ratio.num) + aspect_ratio = av_q2d(is->video_st->codec->sample_aspect_ratio); else - aspect_ratio = av_q2d(is->video_st->codec->sample_aspect_ratio) - * is->video_st->codec->width / is->video_st->codec->height; + aspect_ratio = 0; if (aspect_ratio <= 0.0) - aspect_ratio = (float)is->video_st->codec->width / - (float)is->video_st->codec->height; + aspect_ratio = 1.0; + aspect_ratio *= (float)is->video_st->codec->width / is->video_st->codec->height; /* if an active format is indicated, then it overrides the mpeg format */ #if 0 diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 9c6168597b..09c465655f 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -22,7 +22,7 @@ #define FFMPEG_AVFORMAT_H #define LIBAVFORMAT_VERSION_MAJOR 52 -#define LIBAVFORMAT_VERSION_MINOR 20 +#define LIBAVFORMAT_VERSION_MINOR 21 #define LIBAVFORMAT_VERSION_MICRO 0 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ @@ -402,6 +402,13 @@ typedef struct AVStream { AVProbeData probe_data; #define MAX_REORDER_DELAY 16 int64_t pts_buffer[MAX_REORDER_DELAY+1]; + + /** + * sample aspect ratio (0 if unknown) + * - encoding: Set by user. + * - decoding: Set by libavformat. + */ + AVRational sample_aspect_ratio; } AVStream; #define AV_PROGRAM_RUNNING 1 diff --git a/libavformat/utils.c b/libavformat/utils.c index 51cad25ab9..9a8aaeca7f 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -2331,6 +2331,8 @@ AVStream *av_new_stream(AVFormatContext *s, int id) for(i=0; ipts_buffer[i]= AV_NOPTS_VALUE; + st->sample_aspect_ratio = (AVRational){0,1}; + s->streams[s->nb_streams++] = st; return st; }