diff options
author | Alexey Yakovenko <wakeroid@gmail.com> | 2009-09-12 14:40:39 +0200 |
---|---|---|
committer | Alexey Yakovenko <wakeroid@gmail.com> | 2009-09-12 14:40:39 +0200 |
commit | 9aa887d0ff32290b1ef7127fbaecb57a87abb327 (patch) | |
tree | 9398cb1a5f9c79af1e4c53598078fd7d3041d563 /plugins | |
parent | d582a7965b8a8433b1c4982e5c0556eb1b53b09e (diff) |
ffmpeg ape decoder WIP - working playback
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/ffap/ffap.c | 148 |
1 files changed, 73 insertions, 75 deletions
diff --git a/plugins/ffap/ffap.c b/plugins/ffap/ffap.c index 77f47d98..d088533f 100644 --- a/plugins/ffap/ffap.c +++ b/plugins/ffap/ffap.c @@ -34,9 +34,6 @@ float timestart; float timeend; #define PACKET_BUFFER_SIZE 100000 -uint8_t packet_data[PACKET_BUFFER_SIZE]; -int packet_remaining; // number of bytes in packet_data -int packet_sizeleft; // number of bytes left unread for current ape frame #define min(x,y) ((x)<(y)?(x):(y)) #define max(x,y) ((x)>(y)?(x):(y)) @@ -242,6 +239,10 @@ typedef struct APEContext { const uint8_t *ptr; ///< current position in frame data const uint8_t *last_ptr; + uint8_t packet_data[PACKET_BUFFER_SIZE]; + int packet_remaining; // number of bytes in packet_data + int packet_sizeleft; // number of bytes left unread for current ape frame + int error; } APEContext; @@ -570,7 +571,7 @@ static int ape_read_packet(FILE *fp, APEContext *ape_ctx) return -1; if (ape->currentframe > ape->totalframes) return -1; - +// fprintf (stderr, "seeking to %d\n", ape->frames[ape->currentframe].pos); fseek (fp, ape->frames[ape->currentframe].pos, SEEK_SET); /* Calculate how many blocks there are in this frame */ @@ -582,17 +583,18 @@ static int ape_read_packet(FILE *fp, APEContext *ape_ctx) // if (PACKET_MAX_SIZE < ape->frames[ape->currentframe].size + extra_size) { // return -1; // } - packet_sizeleft = ape->frames[ape->currentframe].size + extra_size; +// packet_sizeleft = ape->frames[ape->currentframe].size + extra_size; - AV_WL32(packet_data , nblocks); - AV_WL32(packet_data + 4, ape->frames[ape->currentframe].skip); - packet_sizeleft -= 8; + AV_WL32(ape->packet_data , nblocks); + AV_WL32(ape->packet_data + 4, ape->frames[ape->currentframe].skip); +// packet_sizeleft -= 8; - int sz = min (PACKET_BUFFER_SIZE, packet_sizeleft) - 8; - fprintf (stderr, "readsize: %d\n", sz); - ret = fread (&packet_data[extra_size], 1, sz, fp); - packet_sizeleft -= sz; - packet_remaining = sz + 8; + int sz = PACKET_BUFFER_SIZE-8; + sz = min (sz, ape->frames[ape->currentframe].size); +// fprintf (stderr, "readsize: %d, packetsize: %d\n", sz, ape->frames[ape->currentframe].size); + ret = fread (ape->packet_data + extra_size, 1, sz, fp); + ape->packet_sizeleft = ape->frames[ape->currentframe].size - sz + 8; + ape->packet_remaining = sz+8; ape->currentframe++; @@ -1370,78 +1372,75 @@ ape_decode_frame(APEContext *s, void *data, int *data_size) return -1; } - if (packet_remaining < PACKET_BUFFER_SIZE) { - assert (packet_sizeleft >= 0 && packet_remaining >= 0); - if (packet_sizeleft == 0 && packet_remaining == 0) { + if (s->packet_remaining < PACKET_BUFFER_SIZE) { +// assert (packet_sizeleft >= 0 && packet_remaining >= 0); +// if (packet_sizeleft == 0 && packet_remaining == 0) { + if (s->samples == 0) { + if (s->currentframe == s->totalframes) { + return -1; + } assert (!s->samples); - fprintf (stderr, "start reading packet %d\n", ape_ctx.currentframe); +// fprintf (stderr, "start reading packet %d\n", ape_ctx.currentframe); assert (s->samples == 0); // all samples from prev packet must have been read // start new packet if (ape_read_packet (fp, &ape_ctx) < 0) { fprintf (stderr, "error reading packet\n"); return -1; } - bswap_buf((uint32_t*)(packet_data), (const uint32_t*)(packet_data), packet_remaining >> 2); + bswap_buf((uint32_t*)(s->packet_data), (const uint32_t*)(s->packet_data), s->packet_remaining >> 2); - fprintf (stderr, "packet_sizeleft=%d packet_remaining=%d\n", packet_sizeleft, packet_remaining); - } - else { - int s = PACKET_BUFFER_SIZE - packet_remaining; - s = min (s, packet_sizeleft); - s = s&~3; - uint8_t *p = packet_data + packet_remaining; - int r = fread (p, 1, s, fp); - if (r != s) { - fprintf (stderr, "unexpected eof while reading ape frame\n"); +// fprintf (stderr, "packet_sizeleft=%d packet_remaining=%d\n", packet_sizeleft, packet_remaining); + s->ptr = s->last_ptr = s->packet_data; + + nblocks = s->samples = bytestream_get_be32(&s->ptr); + //fprintf (stderr, "s->samples=%d (1)\n", s->samples); + n = bytestream_get_be32(&s->ptr); + if(n < 0 || n > 3){ + fprintf (stderr, "Incorrect offset passed\n"); return -1; } + s->ptr += n; + + s->currentframeblocks = nblocks; + //buf += 4; + if (s->samples <= 0) { + *data_size = 0; + bytes_used = s->packet_remaining; + goto error; + } + + memset(s->decoded0, 0, sizeof(s->decoded0)); + memset(s->decoded1, 0, sizeof(s->decoded1)); + + /* Initialize the frame decoder */ + init_frame_decoder(s); + } + else { + int sz = PACKET_BUFFER_SIZE - s->packet_remaining; + sz = min (sz, s->packet_sizeleft); + sz = sz&~3; + uint8_t *p = s->packet_data + s->packet_remaining; + int r = fread (p, 1, sz, fp); + //if (r != s) { + // fprintf (stderr, "unexpected eof while reading ape frame\n"); + // return -1; + //} bswap_buf((uint32_t*)p, (const uint32_t*)p, r >> 2); - packet_sizeleft -= r; - packet_remaining += r; - fprintf (stderr, "read more %d bytes for current packet, sizeleft=%d, packet_remaining=%d\n", r, packet_sizeleft, packet_remaining); + s->packet_sizeleft -= r; + s->packet_remaining += r; + //fprintf (stderr, "read more %d bytes for current packet, sizeleft=%d, packet_remaining=%d\n", r, packet_sizeleft, packet_remaining); } } - s->data_end = packet_data + packet_remaining; + s->data_end = s->packet_data + s->packet_remaining; - if (packet_remaining == 0 && !s->samples) { + if (s->packet_remaining == 0 && !s->samples) { *data_size = 0; return 0; } - if(!s->samples){ - s->ptr = s->last_ptr = packet_data; - - nblocks = s->samples = bytestream_get_be32(&s->ptr); - //fprintf (stderr, "s->samples=%d (1)\n", s->samples); - n = bytestream_get_be32(&s->ptr); - if(n < 0 || n > 3){ - fprintf (stderr, "Incorrect offset passed\n"); - return -1; - } - s->ptr += n; - - s->currentframeblocks = nblocks; - //buf += 4; - if (s->samples <= 0) { - *data_size = 0; - bytes_used = packet_remaining; - goto error; - } - - memset(s->decoded0, 0, sizeof(s->decoded0)); - memset(s->decoded1, 0, sizeof(s->decoded1)); - - /* Initialize the frame decoder */ - fprintf (stderr, "init frame decoder\n"); - init_frame_decoder(s); - } - else { - //fprintf (stderr, "s->samples=%d (2)\n", s->samples); - } - - if (!packet_remaining) { + if (!s->packet_remaining) { fprintf (stderr, "packetbuf is empty!!\n"); *data_size = 0; - bytes_used = packet_remaining; + bytes_used = s->packet_remaining; goto error; } @@ -1450,13 +1449,11 @@ ape_decode_frame(APEContext *s, void *data, int *data_size) s->error=0; - //fprintf (stderr, "unpack %d blocks\n", blockstodecode); if ((s->channels == 1) || (s->frameflags & APE_FRAMECODE_PSEUDO_STEREO)) ape_unpack_mono(s, blockstodecode); else ape_unpack_stereo(s, blockstodecode); - //fprintf (stderr, "s->samples=%d (3)\n", s->samples); if(s->error || s->ptr >= s->data_end){ s->samples=0; if (s->error) { @@ -1478,19 +1475,16 @@ ape_decode_frame(APEContext *s, void *data, int *data_size) s->samples -= blockstodecode; *data_size = blockstodecode * 2 * s->channels; - bytes_used = s->samples ? s->ptr - s->last_ptr : packet_remaining; + bytes_used = s->samples ? s->ptr - s->last_ptr : s->packet_remaining; // shift everything error: - if (bytes_used < packet_remaining) { - memmove (packet_data, packet_data+bytes_used, packet_remaining-bytes_used); + if (bytes_used < s->packet_remaining) { + memmove (s->packet_data, s->packet_data+bytes_used, s->packet_remaining-bytes_used); } - packet_remaining -= bytes_used; + s->packet_remaining -= bytes_used; s->ptr -= bytes_used; -// s->data_end -= bytes_used; s->last_ptr = s->ptr; - //fprintf (stderr, "bytes_used=%d, packet_remaining=%d\n", bytes_used, packet_remaining); - //fprintf (stderr, "ptr=%p, data_end=%p\n", s->ptr, s->data_end); return bytes_used; } @@ -1498,6 +1492,7 @@ error: static DB_playItem_t * ffap_insert (DB_playItem_t *after, const char *fname) { APEContext ape_ctx; + memset (&ape_ctx, 0, sizeof (ape_ctx)); FILE *fp = fopen (fname, "rb"); if (!fp) { return NULL; @@ -1570,6 +1565,9 @@ ffap_read_int16 (char *buffer, int size) { s -= remaining; uint8_t *buf = g_buffer + remaining; int n = ape_decode_frame (&ape_ctx, buf, &s); + if (n == -1) { + break; + } remaining += s; int sz = min (size, remaining); |