diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2013-03-26 16:14:16 +0400 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2013-03-26 16:14:16 +0400 |
commit | 795b911bd8acaec4b6f7dc1590f63a529c028ac8 (patch) | |
tree | ef7cd0b106ca457cae871497aff89e22b8d7eacb /libavformat/ape.c | |
parent | 9b9205e760d226a7dfa1c7ba8d94694f097c8510 (diff) | |
parent | 613a37eca4c7b8eefceaa3e0231c23ad090ca94f (diff) |
Merge commit '613a37eca4c7b8eefceaa3e0231c23ad090ca94f'
* commit '613a37eca4c7b8eefceaa3e0231c23ad090ca94f':
ape: 3.80-3.92 decoding support
h264: Remove an unused variable
Conflicts:
libavcodec/apedec.c
libavformat/ape.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/ape.c')
-rw-r--r-- | libavformat/ape.c | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/libavformat/ape.c b/libavformat/ape.c index 09ed9c54f5..a532d5b840 100644 --- a/libavformat/ape.c +++ b/libavformat/ape.c @@ -28,7 +28,7 @@ #include "apetag.h" /* The earliest and latest file formats supported by this library */ -#define APE_MIN_VERSION 3930 +#define APE_MIN_VERSION 3800 #define APE_MAX_VERSION 3990 #define MAC_FORMAT_FLAG_8_BIT 1 // is 8-bit [OBSOLETE] @@ -81,6 +81,7 @@ typedef struct { /* Seektable */ uint32_t *seektable; + uint8_t *bittable; } APEContext; static int ape_probe(AVProbeData * p) @@ -128,9 +129,13 @@ static void ape_dumpinfo(AVFormatContext * s, APEContext * ape_ctx) } else { for (i = 0; i < ape_ctx->seektablelength / sizeof(uint32_t); i++) { if (i < ape_ctx->totalframes - 1) { - av_log(s, AV_LOG_DEBUG, "%8d %"PRIu32" (%"PRIu32" bytes)\n", + av_log(s, AV_LOG_DEBUG, "%8d %"PRIu32" (%"PRIu32" bytes)", i, ape_ctx->seektable[i], ape_ctx->seektable[i + 1] - ape_ctx->seektable[i]); + if (s->bittable) + av_log(s, AV_LOG_DEBUG, " + %2d bits\n", + ape_ctx->bittable[i]); + av_log(s, AV_LOG_DEBUG, "\n"); } else { av_log(s, AV_LOG_DEBUG, "%8d %"PRIu32"\n", i, ape_ctx->seektable[i]); } @@ -263,6 +268,8 @@ static int ape_read_header(AVFormatContext * s) if(!ape->frames) return AVERROR(ENOMEM); ape->firstframe = ape->junklength + ape->descriptorlength + ape->headerlength + ape->seektablelength + ape->wavheaderlength; + if (ape->fileversion < 3810) + ape->firstframe += ape->totalframes; ape->currentframe = 0; @@ -276,6 +283,13 @@ static int ape_read_header(AVFormatContext * s) return AVERROR(ENOMEM); for (i = 0; i < ape->seektablelength / sizeof(uint32_t); i++) ape->seektable[i] = avio_rl32(pb); + if (ape->fileversion < 3810) { + ape->bittable = av_malloc(ape->totalframes); + if (!ape->bittable) + return AVERROR(ENOMEM); + for (i = 0; i < ape->totalframes; i++) + ape->bittable[i] = avio_r8(pb); + } }else{ av_log(s, AV_LOG_ERROR, "Missing seektable\n"); return AVERROR_INVALIDDATA; @@ -309,7 +323,14 @@ static int ape_read_header(AVFormatContext * s) } ape->frames[i].size = (ape->frames[i].size + 3) & ~3; } - + if (ape->fileversion < 3810) { + for (i = 0; i < ape->totalframes; i++) { + if (i < ape->totalframes - 1 && ape->bittable[i + 1]) + ape->frames[i].size += 4; + ape->frames[i].skip <<= 3; + ape->frames[i].skip += ape->bittable[i]; + } + } ape_dumpinfo(s, ape); @@ -412,6 +433,7 @@ static int ape_read_close(AVFormatContext * s) av_freep(&ape->frames); av_freep(&ape->seektable); + av_freep(&ape->bittable); return 0; } |