From f6a708f0920c5c93f183c1e02ac676450533987e Mon Sep 17 00:00:00 2001 From: Reimar Döffinger Date: Sat, 11 Apr 2009 18:58:55 +0000 Subject: Use get_le32/get_be32 in wc3movie demuxer instead of reading everything into a buffer first. Originally committed as revision 18444 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/wc3movie.c | 54 +++++++++++++++++--------------------------------- 1 file changed, 18 insertions(+), 36 deletions(-) (limited to 'libavformat') diff --git a/libavformat/wc3movie.c b/libavformat/wc3movie.c index 59b11ae2b2..4d2c88a647 100644 --- a/libavformat/wc3movie.c +++ b/libavformat/wc3movie.c @@ -30,8 +30,6 @@ #include "libavutil/intreadwrite.h" #include "avformat.h" -#define WC3_PREAMBLE_SIZE 8 - #define FORM_TAG MKTAG('F', 'O', 'R', 'M') #define MOVE_TAG MKTAG('M', 'O', 'V', 'E') #define PC__TAG MKTAG('_', 'P', 'C', '_') @@ -131,7 +129,6 @@ static int wc3_read_header(AVFormatContext *s, unsigned int fourcc_tag; unsigned int size; AVStream *st; - unsigned char preamble[WC3_PREAMBLE_SIZE]; char buffer[513]; int ret = 0; int current_palette = 0; @@ -152,11 +149,8 @@ static int wc3_read_header(AVFormatContext *s, /* traverse through the chunks and load the header information before * the first BRCH tag */ - if ((ret = get_buffer(pb, preamble, WC3_PREAMBLE_SIZE)) != - WC3_PREAMBLE_SIZE) - return AVERROR(EIO); - fourcc_tag = AV_RL32(&preamble[0]); - size = (AV_RB32(&preamble[4]) + 1) & (~1); + fourcc_tag = get_le32(pb); + size = (get_be32(pb) + 1) & (~1); do { switch (fourcc_tag) { @@ -170,9 +164,7 @@ static int wc3_read_header(AVFormatContext *s, case PC__TAG: /* need the number of palettes */ url_fseek(pb, 8, SEEK_CUR); - if ((ret = get_buffer(pb, preamble, 4)) != 4) - return AVERROR(EIO); - wc3->palette_count = AV_RL32(&preamble[0]); + wc3->palette_count = get_le32(pb); if((unsigned)wc3->palette_count >= UINT_MAX / PALETTE_SIZE){ wc3->palette_count= 0; return -1; @@ -194,11 +186,8 @@ static int wc3_read_header(AVFormatContext *s, case SIZE_TAG: /* video resolution override */ - if ((ret = get_buffer(pb, preamble, WC3_PREAMBLE_SIZE)) != - WC3_PREAMBLE_SIZE) - return AVERROR(EIO); - wc3->width = AV_RL32(&preamble[0]); - wc3->height = AV_RL32(&preamble[4]); + wc3->width = get_le32(pb); + wc3->height = get_le32(pb); break; case PALT_TAG: @@ -224,18 +213,17 @@ static int wc3_read_header(AVFormatContext *s, default: av_log(s, AV_LOG_ERROR, " unrecognized WC3 chunk: %c%c%c%c (0x%02X%02X%02X%02X)\n", - preamble[0], preamble[1], preamble[2], preamble[3], - preamble[0], preamble[1], preamble[2], preamble[3]); + (char)fourcc_tag, (char)(fourcc_tag >> 8), (char)(fourcc_tag >> 16), (char)(fourcc_tag >> 24), + (char)fourcc_tag, (char)(fourcc_tag >> 8), (char)(fourcc_tag >> 16), (char)(fourcc_tag >> 24)); return AVERROR_INVALIDDATA; break; } - if ((ret = get_buffer(pb, preamble, WC3_PREAMBLE_SIZE)) != - WC3_PREAMBLE_SIZE) - return AVERROR(EIO); - fourcc_tag = AV_RL32(&preamble[0]); + fourcc_tag = get_le32(pb); /* chunk sizes are 16-bit aligned */ - size = (AV_RB32(&preamble[4]) + 1) & (~1); + size = (get_be32(pb) + 1) & (~1); + if (url_feof(pb)) + return AVERROR(EIO); } while (fourcc_tag != BRCH_TAG); @@ -281,7 +269,6 @@ static int wc3_read_packet(AVFormatContext *s, unsigned int size; int packet_read = 0; int ret = 0; - unsigned char preamble[WC3_PREAMBLE_SIZE]; unsigned char text[1024]; unsigned int palette_number; int i; @@ -290,14 +277,11 @@ static int wc3_read_packet(AVFormatContext *s, while (!packet_read) { - /* get the next chunk preamble */ - if ((ret = get_buffer(pb, preamble, WC3_PREAMBLE_SIZE)) != - WC3_PREAMBLE_SIZE) - return AVERROR(EIO); - - fourcc_tag = AV_RL32(&preamble[0]); + fourcc_tag = get_le32(pb); /* chunk sizes are 16-bit aligned */ - size = (AV_RB32(&preamble[4]) + 1) & (~1); + size = (get_be32(pb) + 1) & (~1); + if (url_feof(pb)) + return AVERROR(EIO); switch (fourcc_tag) { @@ -307,9 +291,7 @@ static int wc3_read_packet(AVFormatContext *s, case SHOT_TAG: /* load up new palette */ - if ((ret = get_buffer(pb, preamble, 4)) != 4) - return AVERROR(EIO); - palette_number = AV_RL32(&preamble[0]); + palette_number = get_le32(pb); if (palette_number >= wc3->palette_count) return AVERROR_INVALIDDATA; base_palette_index = palette_number * PALETTE_COUNT * 3; @@ -367,8 +349,8 @@ static int wc3_read_packet(AVFormatContext *s, default: av_log (s, AV_LOG_ERROR, " unrecognized WC3 chunk: %c%c%c%c (0x%02X%02X%02X%02X)\n", - preamble[0], preamble[1], preamble[2], preamble[3], - preamble[0], preamble[1], preamble[2], preamble[3]); + (char)fourcc_tag, (char)(fourcc_tag >> 8), (char)(fourcc_tag >> 16), (char)(fourcc_tag >> 24), + (char)fourcc_tag, (char)(fourcc_tag >> 8), (char)(fourcc_tag >> 16), (char)(fourcc_tag >> 24)); ret = AVERROR_INVALIDDATA; packet_read = 1; break; -- cgit v1.2.3