summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorGravatar Alexey Yakovenko <wakeroid@gmail.com>2009-09-12 14:40:39 +0200
committerGravatar Alexey Yakovenko <wakeroid@gmail.com>2009-09-12 14:40:39 +0200
commit9aa887d0ff32290b1ef7127fbaecb57a87abb327 (patch)
tree9398cb1a5f9c79af1e4c53598078fd7d3041d563 /plugins
parentd582a7965b8a8433b1c4982e5c0556eb1b53b09e (diff)
ffmpeg ape decoder WIP - working playback
Diffstat (limited to 'plugins')
-rw-r--r--plugins/ffap/ffap.c148
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);