Commit 59729451 authored by Aurelien Jacobs's avatar Aurelien Jacobs

convert every muxer/demuxer to write/read sample_aspect_ratio from/to

the corresponding AVStream instead of AVCodecContext

Originally committed as revision 14933 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent c30a4489
...@@ -531,14 +531,14 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap) ...@@ -531,14 +531,14 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
for(i=0; i<128; i++){ for(i=0; i<128; i++){
int stream_num= asf->asfid2avid[i]; int stream_num= asf->asfid2avid[i];
if(stream_num>=0){ if(stream_num>=0){
AVCodecContext *codec= s->streams[stream_num]->codec; AVStream *st = s->streams[stream_num];
if (!codec->bit_rate) if (!st->codec->bit_rate)
codec->bit_rate = bitrate[i]; st->codec->bit_rate = bitrate[i];
if (dar[i].num > 0 && dar[i].den > 0) if (dar[i].num > 0 && dar[i].den > 0)
av_reduce(&codec->sample_aspect_ratio.num, av_reduce(&st->sample_aspect_ratio.num,
&codec->sample_aspect_ratio.den, &st->sample_aspect_ratio.den,
dar[i].num, dar[i].den, INT_MAX); dar[i].num, dar[i].den, INT_MAX);
//av_log(NULL, AV_LOG_ERROR, "dar %d:%d sar=%d:%d\n", dar[i].num, dar[i].den, codec->sample_aspect_ratio.num, codec->sample_aspect_ratio.den); //av_log(NULL, AV_LOG_ERROR, "dar %d:%d sar=%d:%d\n", dar[i].num, dar[i].den, st->sample_aspect_ratio.num, st->sample_aspect_ratio.den);
} }
} }
......
...@@ -552,7 +552,7 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap) ...@@ -552,7 +552,7 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
get_le32(pb); //nbFieldsPerFrame get_le32(pb); //nbFieldsPerFrame
if(active_aspect.num && active_aspect.den && active.num && active.den){ if(active_aspect.num && active_aspect.den && active.num && active.den){
st->codec->sample_aspect_ratio= av_div_q(active_aspect, active); st->sample_aspect_ratio= av_div_q(active_aspect, active);
//av_log(s, AV_LOG_ERROR, "vprp %d/%d %d/%d\n", active_aspect.num, active_aspect.den, active.num, active.den); //av_log(s, AV_LOG_ERROR, "vprp %d/%d %d/%d\n", active_aspect.num, active_aspect.den, active.num, active.den);
} }
size -= 9*4; size -= 9*4;
......
...@@ -284,10 +284,10 @@ static int avi_write_header(AVFormatContext *s) ...@@ -284,10 +284,10 @@ static int avi_write_header(AVFormatContext *s)
} }
if( stream->codec_type == CODEC_TYPE_VIDEO if( stream->codec_type == CODEC_TYPE_VIDEO
&& stream->sample_aspect_ratio.num>0 && s->streams[i]->sample_aspect_ratio.num>0
&& stream->sample_aspect_ratio.den>0){ && s->streams[i]->sample_aspect_ratio.den>0){
int vprp= start_tag(pb, "vprp"); int vprp= start_tag(pb, "vprp");
AVRational dar = av_mul_q(stream->sample_aspect_ratio, AVRational dar = av_mul_q(s->streams[i]->sample_aspect_ratio,
(AVRational){stream->width, stream->height}); (AVRational){stream->width, stream->height});
int num, den; int num, den;
av_reduce(&num, &den, dar.num, dar.den, 0xFFFF); av_reduce(&num, &den, dar.num, dar.den, 0xFFFF);
......
...@@ -84,7 +84,7 @@ static int read_header(AVFormatContext *s, ...@@ -84,7 +84,7 @@ static int read_header(AVFormatContext *s,
video->codec->width = 320; video->codec->width = 320;
video->codec->height = 192; video->codec->height = 192;
/* 4:3 320x200 with 8 empty lines */ /* 4:3 320x200 with 8 empty lines */
video->codec->sample_aspect_ratio = (AVRational) { 5, 6 }; video->sample_aspect_ratio = (AVRational) { 5, 6 };
video->time_base = (AVRational) { 2, 25 }; video->time_base = (AVRational) { 2, 25 };
video->nb_frames = framecount; video->nb_frames = framecount;
video->duration = framecount; video->duration = framecount;
......
...@@ -247,7 +247,7 @@ static int dv_extract_video_info(DVDemuxContext *c, uint8_t* frame) ...@@ -247,7 +247,7 @@ static int dv_extract_video_info(DVDemuxContext *c, uint8_t* frame)
apt = frame[4] & 0x07; apt = frame[4] & 0x07;
is16_9 = (vsc_pack && ((vsc_pack[2] & 0x07) == 0x02 || is16_9 = (vsc_pack && ((vsc_pack[2] & 0x07) == 0x02 ||
(!apt && (vsc_pack[2] & 0x07) == 0x07))); (!apt && (vsc_pack[2] & 0x07) == 0x07)));
avctx->sample_aspect_ratio = c->sys->sar[is16_9]; c->vst->sample_aspect_ratio = c->sys->sar[is16_9];
avctx->bit_rate = av_rescale(c->sys->frame_size * 8, avctx->bit_rate = av_rescale(c->sys->frame_size * 8,
c->sys->frame_rate, c->sys->frame_rate,
c->sys->frame_rate_base); c->sys->frame_rate_base);
......
...@@ -246,8 +246,8 @@ static int nut_read_header(AVFormatContext * avf, AVFormatParameters * ap) { ...@@ -246,8 +246,8 @@ static int nut_read_header(AVFormatContext * avf, AVFormatParameters * ap) {
st->codec->width = s[i].width; st->codec->width = s[i].width;
st->codec->height = s[i].height; st->codec->height = s[i].height;
st->codec->sample_aspect_ratio.num = s[i].sample_width; st->sample_aspect_ratio.num = s[i].sample_width;
st->codec->sample_aspect_ratio.den = s[i].sample_height; st->sample_aspect_ratio.den = s[i].sample_height;
break; break;
} }
if (st->codec->codec_id == CODEC_ID_NONE) av_log(avf, AV_LOG_ERROR, "Unknown codec?!\n"); if (st->codec->codec_id == CODEC_ID_NONE) av_log(avf, AV_LOG_ERROR, "Unknown codec?!\n");
......
...@@ -1274,8 +1274,8 @@ static int matroska_read_header(AVFormatContext *s, AVFormatParameters *ap) ...@@ -1274,8 +1274,8 @@ static int matroska_read_header(AVFormatContext *s, AVFormatParameters *ap)
st->codec->codec_tag = track->video.fourcc; st->codec->codec_tag = track->video.fourcc;
st->codec->width = track->video.pixel_width; st->codec->width = track->video.pixel_width;
st->codec->height = track->video.pixel_height; st->codec->height = track->video.pixel_height;
av_reduce(&st->codec->sample_aspect_ratio.num, av_reduce(&st->sample_aspect_ratio.num,
&st->codec->sample_aspect_ratio.den, &st->sample_aspect_ratio.den,
st->codec->height * track->video.display_width, st->codec->height * track->video.display_width,
st->codec-> width * track->video.display_height, st->codec-> width * track->video.display_height,
255); 255);
......
...@@ -593,11 +593,10 @@ static int mkv_write_tracks(AVFormatContext *s) ...@@ -593,11 +593,10 @@ static int mkv_write_tracks(AVFormatContext *s)
// XXX: interlace flag? // XXX: interlace flag?
put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELWIDTH , codec->width); put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELWIDTH , codec->width);
put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELHEIGHT, codec->height); put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELHEIGHT, codec->height);
if (codec->sample_aspect_ratio.num) { if (st->sample_aspect_ratio.num) {
AVRational dar = av_mul_q(codec->sample_aspect_ratio, int d_width = codec->width*av_q2d(st->sample_aspect_ratio);
(AVRational){codec->width, codec->height}); put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYWIDTH , d_width);
put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYWIDTH , dar.num); put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYHEIGHT, codec->height);
put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYHEIGHT, dar.den);
} }
end_ebml_master(pb, subinfo); end_ebml_master(pb, subinfo);
break; break;
......
...@@ -1478,7 +1478,7 @@ static int mov_read_tkhd(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom) ...@@ -1478,7 +1478,7 @@ static int mov_read_tkhd(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
((int64_t) display_matrix[2][i] << 16); ((int64_t) display_matrix[2][i] << 16);
//sample aspect ratio is new width/height divided by old width/height //sample aspect ratio is new width/height divided by old width/height
st->codec->sample_aspect_ratio = av_d2q( st->sample_aspect_ratio = av_d2q(
((double) disp_transform[0] * height) / ((double) disp_transform[0] * height) /
((double) disp_transform[1] * width), INT_MAX); ((double) disp_transform[1] * width), INT_MAX);
} }
......
...@@ -887,7 +887,7 @@ static int mov_write_mdia_tag(ByteIOContext *pb, MOVTrack *track) ...@@ -887,7 +887,7 @@ static int mov_write_mdia_tag(ByteIOContext *pb, MOVTrack *track)
return updateSize(pb, pos); return updateSize(pb, pos);
} }
static int mov_write_tkhd_tag(ByteIOContext *pb, MOVTrack *track) static int mov_write_tkhd_tag(ByteIOContext *pb, MOVTrack *track, AVStream *st)
{ {
int64_t duration = av_rescale_rnd(track->trackDuration, globalTimescale, track->timescale, AV_ROUND_UP); int64_t duration = av_rescale_rnd(track->trackDuration, globalTimescale, track->timescale, AV_ROUND_UP);
int version = duration < INT32_MAX ? 0 : 1; int version = duration < INT32_MAX ? 0 : 1;
...@@ -930,7 +930,7 @@ static int mov_write_tkhd_tag(ByteIOContext *pb, MOVTrack *track) ...@@ -930,7 +930,7 @@ static int mov_write_tkhd_tag(ByteIOContext *pb, MOVTrack *track)
/* Track width and height, for visual only */ /* Track width and height, for visual only */
if(track->enc->codec_type == CODEC_TYPE_VIDEO) { if(track->enc->codec_type == CODEC_TYPE_VIDEO) {
double sample_aspect_ratio = av_q2d(track->enc->sample_aspect_ratio); double sample_aspect_ratio = av_q2d(st->sample_aspect_ratio);
if(!sample_aspect_ratio) sample_aspect_ratio = 1; if(!sample_aspect_ratio) sample_aspect_ratio = 1;
put_be32(pb, sample_aspect_ratio * track->enc->width*0x10000); put_be32(pb, sample_aspect_ratio * track->enc->width*0x10000);
put_be32(pb, track->enc->height*0x10000); put_be32(pb, track->enc->height*0x10000);
...@@ -978,12 +978,12 @@ static int mov_write_uuid_tag_psp(ByteIOContext *pb, MOVTrack *mov) ...@@ -978,12 +978,12 @@ static int mov_write_uuid_tag_psp(ByteIOContext *pb, MOVTrack *mov)
return 0x34; return 0x34;
} }
static int mov_write_trak_tag(ByteIOContext *pb, MOVTrack *track) static int mov_write_trak_tag(ByteIOContext *pb, MOVTrack *track, AVStream *st)
{ {
offset_t pos = url_ftell(pb); offset_t pos = url_ftell(pb);
put_be32(pb, 0); /* size */ put_be32(pb, 0); /* size */
put_tag(pb, "trak"); put_tag(pb, "trak");
mov_write_tkhd_tag(pb, track); mov_write_tkhd_tag(pb, track, st);
if (track->mode == MODE_PSP || track->hasBframes) if (track->mode == MODE_PSP || track->hasBframes)
mov_write_edts_tag(pb, track); // PSP Movies require edts box mov_write_edts_tag(pb, track); // PSP Movies require edts box
mov_write_mdia_tag(pb, track); mov_write_mdia_tag(pb, track);
...@@ -1350,7 +1350,7 @@ static int mov_write_moov_tag(ByteIOContext *pb, MOVContext *mov, ...@@ -1350,7 +1350,7 @@ static int mov_write_moov_tag(ByteIOContext *pb, MOVContext *mov,
//mov_write_iods_tag(pb, mov); //mov_write_iods_tag(pb, mov);
for (i=0; i<mov->nb_streams; i++) { for (i=0; i<mov->nb_streams; i++) {
if(mov->tracks[i].entry > 0) { if(mov->tracks[i].entry > 0) {
mov_write_trak_tag(pb, &(mov->tracks[i])); mov_write_trak_tag(pb, &(mov->tracks[i]), s->streams[i]);
} }
} }
......
...@@ -447,8 +447,8 @@ static void mxf_write_mpeg_video_desc(AVFormatContext *s, const MXFDescriptorWri ...@@ -447,8 +447,8 @@ static void mxf_write_mpeg_video_desc(AVFormatContext *s, const MXFDescriptorWri
put_be32(pb, st->codec->height); put_be32(pb, st->codec->height);
mxf_write_local_tag(pb, 8, 0x320E); mxf_write_local_tag(pb, 8, 0x320E);
put_be32(pb, st->codec->height * st->codec->sample_aspect_ratio.den); put_be32(pb, st->codec->height * st->sample_aspect_ratio.den);
put_be32(pb, st->codec->width * st->codec->sample_aspect_ratio.num); put_be32(pb, st->codec->width * st->sample_aspect_ratio.num);
// tmp write, will modified later // tmp write, will modified later
mxf_write_local_tag(pb, 16, 0x3201); mxf_write_local_tag(pb, 16, 0x3201);
......
...@@ -350,10 +350,10 @@ static int decode_stream_header(NUTContext *nut){ ...@@ -350,10 +350,10 @@ static int decode_stream_header(NUTContext *nut){
if (st->codec->codec_type == CODEC_TYPE_VIDEO){ if (st->codec->codec_type == CODEC_TYPE_VIDEO){
GET_V(st->codec->width , tmp > 0) GET_V(st->codec->width , tmp > 0)
GET_V(st->codec->height, tmp > 0) GET_V(st->codec->height, tmp > 0)
st->codec->sample_aspect_ratio.num= ff_get_v(bc); st->sample_aspect_ratio.num= ff_get_v(bc);
st->codec->sample_aspect_ratio.den= ff_get_v(bc); st->sample_aspect_ratio.den= ff_get_v(bc);
if((!st->codec->sample_aspect_ratio.num) != (!st->codec->sample_aspect_ratio.den)){ if((!st->sample_aspect_ratio.num) != (!st->sample_aspect_ratio.den)){
av_log(s, AV_LOG_ERROR, "invalid aspect ratio %d/%d\n", st->codec->sample_aspect_ratio.num, st->codec->sample_aspect_ratio.den); av_log(s, AV_LOG_ERROR, "invalid aspect ratio %d/%d\n", st->sample_aspect_ratio.num, st->sample_aspect_ratio.den);
return -1; return -1;
} }
ff_get_v(bc); /* csp type */ ff_get_v(bc); /* csp type */
......
...@@ -389,7 +389,8 @@ static void write_mainheader(NUTContext *nut, ByteIOContext *bc){ ...@@ -389,7 +389,8 @@ static void write_mainheader(NUTContext *nut, ByteIOContext *bc){
} }
} }
static int write_streamheader(NUTContext *nut, ByteIOContext *bc, AVCodecContext *codec, int i){ static int write_streamheader(NUTContext *nut, ByteIOContext *bc, AVStream *st, int i){
AVCodecContext *codec = st->codec;
put_v(bc, i); put_v(bc, i);
switch(codec->codec_type){ switch(codec->codec_type){
case CODEC_TYPE_VIDEO: put_v(bc, 0); break; case CODEC_TYPE_VIDEO: put_v(bc, 0); break;
...@@ -422,12 +423,12 @@ static int write_streamheader(NUTContext *nut, ByteIOContext *bc, AVCodecContext ...@@ -422,12 +423,12 @@ static int write_streamheader(NUTContext *nut, ByteIOContext *bc, AVCodecContext
put_v(bc, codec->width); put_v(bc, codec->width);
put_v(bc, codec->height); put_v(bc, codec->height);
if(codec->sample_aspect_ratio.num<=0 || codec->sample_aspect_ratio.den<=0){ if(st->sample_aspect_ratio.num<=0 || st->sample_aspect_ratio.den<=0){
put_v(bc, 0); put_v(bc, 0);
put_v(bc, 0); put_v(bc, 0);
}else{ }else{
put_v(bc, codec->sample_aspect_ratio.num); put_v(bc, st->sample_aspect_ratio.num);
put_v(bc, codec->sample_aspect_ratio.den); put_v(bc, st->sample_aspect_ratio.den);
} }
put_v(bc, 0); /* csp type -- unknown */ put_v(bc, 0); /* csp type -- unknown */
break; break;
...@@ -514,12 +515,10 @@ static int write_headers(NUTContext *nut, ByteIOContext *bc){ ...@@ -514,12 +515,10 @@ static int write_headers(NUTContext *nut, ByteIOContext *bc){
put_packet(nut, bc, dyn_bc, 1, MAIN_STARTCODE); put_packet(nut, bc, dyn_bc, 1, MAIN_STARTCODE);
for (i=0; i < nut->avf->nb_streams; i++){ for (i=0; i < nut->avf->nb_streams; i++){
AVCodecContext *codec = nut->avf->streams[i]->codec;
ret = url_open_dyn_buf(&dyn_bc); ret = url_open_dyn_buf(&dyn_bc);
if(ret < 0) if(ret < 0)
return ret; return ret;
write_streamheader(nut, dyn_bc, codec, i); write_streamheader(nut, dyn_bc, nut->avf->streams[i], i);
put_packet(nut, bc, dyn_bc, 1, STREAM_STARTCODE); put_packet(nut, bc, dyn_bc, 1, STREAM_STARTCODE);
} }
......
...@@ -158,7 +158,7 @@ static int nuv_header(AVFormatContext *s, AVFormatParameters *ap) { ...@@ -158,7 +158,7 @@ static int nuv_header(AVFormatContext *s, AVFormatParameters *ap) {
vst->codec->width = width; vst->codec->width = width;
vst->codec->height = height; vst->codec->height = height;
vst->codec->bits_per_sample = 10; vst->codec->bits_per_sample = 10;
vst->codec->sample_aspect_ratio = av_d2q(aspect * height / width, 10000); vst->sample_aspect_ratio = av_d2q(aspect * height / width, 10000);
vst->r_frame_rate = av_d2q(fps, 60000); vst->r_frame_rate = av_d2q(fps, 60000);
av_set_pts_info(vst, 32, 1, 1000); av_set_pts_info(vst, 32, 1, 1000);
} else } else
......
...@@ -87,8 +87,8 @@ theora_header (AVFormatContext * s, int idx) ...@@ -87,8 +87,8 @@ theora_header (AVFormatContext * s, int idx)
st->codec->time_base.num = get_bits_long(&gb, 32); st->codec->time_base.num = get_bits_long(&gb, 32);
st->time_base = st->codec->time_base; st->time_base = st->codec->time_base;
st->codec->sample_aspect_ratio.num = get_bits_long(&gb, 24); st->sample_aspect_ratio.num = get_bits_long(&gb, 24);
st->codec->sample_aspect_ratio.den = get_bits_long(&gb, 24); st->sample_aspect_ratio.den = get_bits_long(&gb, 24);
if (version >= 0x030200) if (version >= 0x030200)
skip_bits(&gb, 38); skip_bits(&gb, 38);
......
...@@ -44,8 +44,8 @@ static int yuv4_generate_header(AVFormatContext *s, char* buf) ...@@ -44,8 +44,8 @@ static int yuv4_generate_header(AVFormatContext *s, char* buf)
av_reduce(&raten, &rated, st->codec->time_base.den, st->codec->time_base.num, (1UL<<31)-1); av_reduce(&raten, &rated, st->codec->time_base.den, st->codec->time_base.num, (1UL<<31)-1);
aspectn = st->codec->sample_aspect_ratio.num; aspectn = st->sample_aspect_ratio.num;
aspectd = st->codec->sample_aspect_ratio.den; aspectd = st->sample_aspect_ratio.den;
if ( aspectn == 0 && aspectd == 1 ) aspectd = 0; // 0:0 means unknown if ( aspectn == 0 && aspectd == 1 ) aspectd = 0; // 0:0 means unknown
...@@ -331,7 +331,7 @@ static int yuv4_read_header(AVFormatContext *s, AVFormatParameters *ap) ...@@ -331,7 +331,7 @@ static int yuv4_read_header(AVFormatContext *s, AVFormatParameters *ap)
st->codec->pix_fmt = pix_fmt; st->codec->pix_fmt = pix_fmt;
st->codec->codec_type = CODEC_TYPE_VIDEO; st->codec->codec_type = CODEC_TYPE_VIDEO;
st->codec->codec_id = CODEC_ID_RAWVIDEO; st->codec->codec_id = CODEC_ID_RAWVIDEO;
st->codec->sample_aspect_ratio= (AVRational){aspectn, aspectd}; st->sample_aspect_ratio= (AVRational){aspectn, aspectd};
return 0; return 0;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment