Exemplo n.º 1
0
/*
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;
}
Exemplo n.º 2
0
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;
  }