/* TODO: decode more than 1024 samples at a time and mix both the mp4 and aac on stream r */ mm_word mp4_on_stream_request( mm_word length, mm_addr dest, mm_stream_formats format ) { int decoded = 0; int ret = 0; /* We'll always output 1024 (nah almost) samples */ if(length >=1024) { readOff = readBuffer; int read = 0; /* The decoder is always fed one aac frame */ if(trackSample < samples) { read = mp4ff_read_sample_v2(infile, track, trackSample++,readOff); dataLeft+=read; memset(readBuffer+dataLeft, 0, AAC_MAINBUF_SIZE - dataLeft); ret = AACDecode(decoder, &readOff, &dataLeft, dest); if(trackSample == samples && !Endof) Endof = MM_BUFFER_SIZE; decoded += 1024; // 1024 a channel } /* Either a sample read error occured , an decoding error occured or simply EOF */ if((!read && !Endof) || ret || (length >= Endof && Endof)) { mp4ff_close(infile); needsClosing = true; return 0; } } visualizeBuffer(dest); return decoded; }
ReadStatus MP4Reader::process(Packet*p) { packet=p; packet->stream_position=-1; packet->stream_length=stream_length; packet->flags=AAC_FLAG_FRAME; if (!(flags&FLAG_PARSED)) { return parse(); } packet->stream_position = mp4ff_get_sample_position(handle,track,frame); for (;frame<nframes;frame++) { FXint size = mp4ff_read_sample_getsize(handle,track,frame); if (size<=0) { packet->unref(); return ReadError; } if (packet->space()<size) { if (packet->size()) { engine->decoder->post(packet); packet=NULL; } return ReadOk; } FXint n = mp4ff_read_sample_v2(handle,track,frame,packet->ptr()); if (n<=0) { packet->unref(); return ReadError; } packet->wroteBytes(size); if (frame==nframes-1) packet->flags|=FLAG_EOS; } if (packet->size()) { engine->decoder->post(packet); packet=NULL; return ReadDone; } return ReadOk; }