Mercurial > libavformat.hg
comparison asfdec.c @ 6481:123ebc5da327 libavformat
Fix aspect ratio for files that have it stored in
ff_asf_extended_content_header.
Patch by Richard Buteau, rbuteau rgbnetworks com
author | cehoyos |
---|---|
date | Thu, 23 Sep 2010 03:40:06 +0000 |
parents | 3800dce5a40a |
children | c59fad269e39 |
comparison
equal
deleted
inserted
replaced
6480:d55dd9679e52 | 6481:123ebc5da327 |
---|---|
465 get_str16_nolen(pb, name_len, name, sizeof(name)); | 465 get_str16_nolen(pb, name_len, name, sizeof(name)); |
466 value_type = get_le16(pb); | 466 value_type = get_le16(pb); |
467 value_len = get_le16(pb); | 467 value_len = get_le16(pb); |
468 if (!value_type && value_len%2) | 468 if (!value_type && value_len%2) |
469 value_len += 1; | 469 value_len += 1; |
470 get_tag(s, name, value_type, value_len); | 470 /** |
471 * My sample has that stream set to 0 maybe that mean the container. | |
472 * Asf stream count start at 1. I am using 0 to the container value since it's unused | |
473 */ | |
474 if (!strcmp(name, "AspectRatioX")){ | |
475 dar[0].num= get_value(s->pb, value_type); | |
476 } else if(!strcmp(name, "AspectRatioY")){ | |
477 dar[0].den= get_value(s->pb, value_type); | |
478 } else get_tag(s, name, value_type, value_len); | |
471 } | 479 } |
472 } else if (!guidcmp(&g, &ff_asf_metadata_header)) { | 480 } else if (!guidcmp(&g, &ff_asf_metadata_header)) { |
473 int n, stream_num, name_len, value_len, value_type, value_num; | 481 int n, stream_num, name_len, value_len, value_type, value_num; |
474 n = get_le16(pb); | 482 n = get_le16(pb); |
475 | 483 |
624 int stream_num= asf->asfid2avid[i]; | 632 int stream_num= asf->asfid2avid[i]; |
625 if(stream_num>=0){ | 633 if(stream_num>=0){ |
626 AVStream *st = s->streams[stream_num]; | 634 AVStream *st = s->streams[stream_num]; |
627 if (!st->codec->bit_rate) | 635 if (!st->codec->bit_rate) |
628 st->codec->bit_rate = bitrate[i]; | 636 st->codec->bit_rate = bitrate[i]; |
629 if (dar[i].num > 0 && dar[i].den > 0) | 637 if (dar[i].num > 0 && dar[i].den > 0){ |
630 av_reduce(&st->sample_aspect_ratio.num, | 638 av_reduce(&st->sample_aspect_ratio.num, |
631 &st->sample_aspect_ratio.den, | 639 &st->sample_aspect_ratio.den, |
632 dar[i].num, dar[i].den, INT_MAX); | 640 dar[i].num, dar[i].den, INT_MAX); |
633 //av_log(s, 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); | 641 } else if ((dar[0].num > 0) && (dar[0].den > 0) && (st->codec->codec_type==CODEC_TYPE_VIDEO)) // Use ASF container value if the stream doesn't AR set. |
642 av_reduce(&st->sample_aspect_ratio.num, | |
643 &st->sample_aspect_ratio.den, | |
644 dar[0].num, dar[0].den, INT_MAX); | |
645 | |
646 //av_log(s, AV_LOG_INFO, "i=%d, st->codec->codec_type:%d, dar %d:%d sar=%d:%d\n", i, st->codec->codec_type, dar[i].num, dar[i].den, st->sample_aspect_ratio.num, st->sample_aspect_ratio.den); | |
634 | 647 |
635 // copy and convert language codes to the frontend | 648 // copy and convert language codes to the frontend |
636 if (asf->streams[i].stream_language_index < 128) { | 649 if (asf->streams[i].stream_language_index < 128) { |
637 const char *rfc1766 = asf->stream_languages[asf->streams[i].stream_language_index]; | 650 const char *rfc1766 = asf->stream_languages[asf->streams[i].stream_language_index]; |
638 if (rfc1766 && strlen(rfc1766) > 1) { | 651 if (rfc1766 && strlen(rfc1766) > 1) { |