void *decodeAVAudioStream(StreamPtr stream, size_t *length) { char *outbuf = NULL; size_t buflen = 0; void *inbuf; size_t got; *length = 0; if(!stream || stream->CodecCtx->codec_type != AVMEDIA_TYPE_AUDIO) return NULL; while((inbuf=getAVAudioData(stream, &got)) != NULL && got > 0) { void *ptr; ptr = realloc(outbuf, NextPowerOf2(buflen+got)); if(ptr == NULL) break; outbuf = (char*)ptr; memcpy(&outbuf[buflen], inbuf, got); buflen += got; } outbuf = (char*)realloc(outbuf, buflen); *length = buflen; return outbuf; }
size_t FFmpeg_Decoder::readAVAudioData(void *data, size_t length) { size_t dec = 0; while(dec < length) { /* If there's no decoded data, find some */ if(mFramePos >= mFrameSize) { if(!getAVAudioData()) break; mFramePos = 0; mFrameSize = mFrame->nb_samples * (*mStream)->codec->channels * av_get_bytes_per_sample((*mStream)->codec->sample_fmt); } /* Get the amount of bytes remaining to be written, and clamp to * the amount of decoded data we have */ size_t rem = std::min<size_t>(length-dec, mFrameSize-mFramePos); /* Copy the data to the app's buffer and increment */ memcpy(data, mFrame->data[0]+mFramePos, rem); data = (char*)data + rem; dec += rem; mFramePos += rem; } /* Return the number of bytes we were able to get */ return dec; }
void FFmpeg_Decoder::readAll(std::vector<char> &output) { if(!mStream) fail("No audio stream"); while(getAVAudioData()) { size_t got = mFrame->nb_samples * (*mStream)->codec->channels * av_get_bytes_per_sample((*mStream)->codec->sample_fmt); const char *inbuf = reinterpret_cast<char*>(mFrame->data[0]); output.insert(output.end(), inbuf, inbuf+got); } }
void FFmpeg_Decoder::readAll(std::vector<char> &output) { if(!mStream) fail("No audio stream"); while(getAVAudioData()) { size_t got = mFrame->nb_samples * av_get_channel_layout_nb_channels(mOutputChannelLayout) * av_get_bytes_per_sample(mOutputSampleFormat); const char *inbuf = reinterpret_cast<char*>(mFrameData[0]); output.insert(output.end(), inbuf, inbuf+got); } }
size_t readAVAudioData(StreamPtr stream, void *data, size_t length) { size_t dec = 0; if(!stream || stream->CodecCtx->codec_type != AVMEDIA_TYPE_AUDIO) return 0; while(dec < length) { /* If there's no decoded data, find some */ if(stream->DecodedDataSize == 0) { if(getAVAudioData(stream, NULL) == NULL) break; } if(stream->DecodedDataSize > 0) { /* Get the amount of bytes remaining to be written, and clamp to * the amount of decoded data we have */ size_t rem = length-dec; if(rem > stream->DecodedDataSize) rem = stream->DecodedDataSize; /* Copy the data to the app's buffer and increment */ if(data != NULL) { memcpy(data, stream->DecodedData, rem); data = (char*)data + rem; } dec += rem; /* If there's any decoded data left, move it to the front of the * buffer for next time */ if(rem < stream->DecodedDataSize) memmove(stream->DecodedData, &stream->DecodedData[rem], stream->DecodedDataSize - rem); stream->DecodedDataSize -= rem; } } /* Return the number of bytes we were able to get */ return dec; }
size_t FFmpeg_Decoder::MyStream::readAVAudioData(void *data, size_t length) { size_t dec = 0; while(dec < length) { /* If there's no decoded data, find some */ if(mDecodedDataSize == 0) { if(getAVAudioData(NULL) == NULL) break; } if(mDecodedDataSize > 0) { /* Get the amount of bytes remaining to be written, and clamp to * the amount of decoded data we have */ size_t rem = length-dec; if(rem > mDecodedDataSize) rem = mDecodedDataSize; /* Copy the data to the app's buffer and increment */ if(data != NULL) { memcpy(data, mDecodedData, rem); data = (char*)data + rem; } dec += rem; /* If there's any decoded data left, move it to the front of the * buffer for next time */ if(rem < mDecodedDataSize) memmove(mDecodedData, &mDecodedData[rem], mDecodedDataSize - rem); mDecodedDataSize -= rem; } } /* Return the number of bytes we were able to get */ return dec; }