Mercurial > libavformat.hg
changeset 4852:ecf9f13948f1 libavformat
Use get_le32/get_be32 in wc3movie demuxer instead of reading everything into
a buffer first.
author | reimar |
---|---|
date | Sat, 11 Apr 2009 18:58:55 +0000 |
parents | dcd4702bcc21 |
children | 74342058fc9d |
files | wc3movie.c |
diffstat | 1 files changed, 18 insertions(+), 36 deletions(-) [+] |
line wrap: on
line diff
--- a/wc3movie.c Sat Apr 11 12:42:29 2009 +0000 +++ b/wc3movie.c Sat Apr 11 18:58:55 2009 +0000 @@ -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 @@ 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 @@ /* 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 @@ 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 @@ 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 @@ 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) + fourcc_tag = get_le32(pb); + /* chunk sizes are 16-bit aligned */ + size = (get_be32(pb) + 1) & (~1); + if (url_feof(pb)) return AVERROR(EIO); - fourcc_tag = AV_RL32(&preamble[0]); - /* chunk sizes are 16-bit aligned */ - size = (AV_RB32(&preamble[4]) + 1) & (~1); } while (fourcc_tag != BRCH_TAG); @@ -281,7 +269,6 @@ 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,15 +277,12 @@ while (!packet_read) { - /* get the next chunk preamble */ - if ((ret = get_buffer(pb, preamble, WC3_PREAMBLE_SIZE)) != - WC3_PREAMBLE_SIZE) + fourcc_tag = get_le32(pb); + /* chunk sizes are 16-bit aligned */ + size = (get_be32(pb) + 1) & (~1); + if (url_feof(pb)) return AVERROR(EIO); - fourcc_tag = AV_RL32(&preamble[0]); - /* chunk sizes are 16-bit aligned */ - size = (AV_RB32(&preamble[4]) + 1) & (~1); - switch (fourcc_tag) { case BRCH_TAG: @@ -307,9 +291,7 @@ 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 @@ 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;