summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAurelien Jacobs <aurel@gnuage.org>2008-08-23 23:13:58 +0000
committerAurelien Jacobs <aurel@gnuage.org>2008-08-23 23:13:58 +0000
commitc30a4489b444020ef951c1f0583afd8679c07c78 (patch)
tree0ca4b5260d083c6c053b8424ce213448451a0736
parent0cdc6ec94130572e1da1902821e2b3cbcf0fbea8 (diff)
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
-rw-r--r--ffmpeg.c8
-rw-r--r--ffplay.c13
-rw-r--r--libavformat/avformat.h9
-rw-r--r--libavformat/utils.c2
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; i<MAX_REORDER_DELAY+1; i++)
st->pts_buffer[i]= AV_NOPTS_VALUE;
+ st->sample_aspect_ratio = (AVRational){0,1};
+
s->streams[s->nb_streams++] = st;
return st;
}