From fc4f11cf8ecb48f2ae2f37cf78a248b790742d96 Mon Sep 17 00:00:00 2001 From: Darren Salt Date: Fri, 27 Jun 2008 01:46:09 +0100 Subject: Add basic aspect ratio detection for WMV streams. --- src/demuxers/asfheader.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++- src/demuxers/asfheader.h | 1 + src/demuxers/demux_asf.c | 8 +++++++ 3 files changed, 67 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/demuxers/asfheader.c b/src/demuxers/asfheader.c index 5db25d07f..1b71a0b19 100644 --- a/src/demuxers/asfheader.c +++ b/src/demuxers/asfheader.c @@ -511,6 +511,61 @@ static int asf_header_parse_stream_bitrate_properties(asf_header_t *header_pub, return 1; } +static int asf_header_parse_metadata(asf_header_t *header_pub, uint8_t *buffer, int buffer_len) +{ + asf_header_internal_t *header = (asf_header_internal_t *)header_pub; + asf_reader_t reader; + uint16_t i, records_count; + iconv_t iconv_cd; + + if (buffer_len < 2) + return 0; + + if ((iconv_cd = iconv_open ("UTF-8", "UCS-2LE")) == (iconv_t)-1) + return 0; + + asf_reader_init(&reader, buffer, buffer_len); + asf_reader_get_16(&reader, &records_count); + + for (i = 0; i < records_count; i++) + { + uint16_t index, stream, name_len = 0, data_type; + uint32_t data_len = 0; + int stream_id; + + asf_reader_get_16 (&reader, &index); + asf_reader_get_16 (&reader, &stream); + stream &= 0x7f; + asf_reader_get_16 (&reader, &name_len); + asf_reader_get_16 (&reader, &data_type); + asf_reader_get_32 (&reader, &data_len); + + stream_id = asf_header_get_stream_id (&header->pub, stream); + + if (data_len >= 4) + { + char *name = asf_reader_get_string (&reader, name_len, iconv_cd); + if (!strcmp (name, "AspectRatioX")) + { + asf_reader_get_32 (&reader, &header->pub.aspect_ratios[stream_id].x); + data_len -= 4; + } + else if (!strcmp (name, "AspectRatioY")) + { + asf_reader_get_32 (&reader, &header->pub.aspect_ratios[stream_id].y); + data_len -= 4; + } + free (name); + asf_reader_skip (&reader, data_len); + } + else + asf_reader_skip (&reader, data_len + name_len); + } + + iconv_close (iconv_cd); + return 1; +} + static int asf_header_parse_header_extension(asf_header_t *header, uint8_t *buffer, int buffer_len) { asf_reader_t reader; @@ -549,12 +604,14 @@ static int asf_header_parse_header_extension(asf_header_t *header, uint8_t *buff case GUID_EXTENDED_STREAM_PROPERTIES: asf_header_parse_stream_extended_properties(header, asf_reader_get_buffer(&reader), object_data_length); break; + case GUID_METADATA: + asf_header_parse_metadata(header, asf_reader_get_buffer(&reader), object_data_length); + break; case GUID_ADVANCED_MUTUAL_EXCLUSION: case GUID_GROUP_MUTUAL_EXCLUSION: case GUID_STREAM_PRIORITIZATION: case GUID_BANDWIDTH_SHARING: case GUID_LANGUAGE_LIST: - case GUID_METADATA: case GUID_METADATA_LIBRARY: case GUID_INDEX_PARAMETERS: case GUID_MEDIA_OBJECT_INDEX_PARAMETERS: diff --git a/src/demuxers/asfheader.h b/src/demuxers/asfheader.h index b895a1817..265f0e643 100644 --- a/src/demuxers/asfheader.h +++ b/src/demuxers/asfheader.h @@ -320,6 +320,7 @@ struct asf_header_s { asf_stream_t *streams[ASF_MAX_NUM_STREAMS]; asf_stream_extension_t *stream_extensions[ASF_MAX_NUM_STREAMS]; uint32_t bitrates[ASF_MAX_NUM_STREAMS]; + struct { uint32_t x, y; } aspect_ratios[ASF_MAX_NUM_STREAMS]; }; struct asf_file_s { diff --git a/src/demuxers/demux_asf.c b/src/demuxers/demux_asf.c index 2b8114a0d..3af265ce4 100644 --- a/src/demuxers/demux_asf.c +++ b/src/demuxers/demux_asf.c @@ -351,6 +351,14 @@ static void asf_send_video_header (demux_asf_t *this, int stream) { BUF_FLAG_FRAME_END; buf->decoder_info[0] = 0; + + if (this->asf_header->aspect_ratios[stream].x && this->asf_header->aspect_ratios[stream].y) + { + buf->decoder_flags |= BUF_FLAG_ASPECT; + buf->decoder_info[1] = bih->biWidth * this->asf_header->aspect_ratios[stream].x; + buf->decoder_info[2] = bih->biHeight * this->asf_header->aspect_ratios[stream].y; + } + buf->size = asf_stream->private_data_length - 11; memcpy (buf->content, bih, buf->size); buf->type = this->streams[stream].buf_type; -- cgit v1.2.3