void AudioLoader::flushPacket() { AVPacket empty; do { _dataSize = FFMPEG_BUFFER_SIZE * sizeof(int16_t); empty.data = 0; empty.size = 0; decode_audio_frame(_audioCtx, _buffer, &_dataSize, &empty); copyFFmpegOutput(); } while (_dataSize > 0); }
AlgorithmStatus AudioLoader::process() { if (!parameter("filename").isConfigured()) { throw EssentiaException("AudioLoader: Trying to call process() on an AudioLoader algo which hasn't been correctly configured."); } // read frames until we get a good one do { int result = av_read_frame(_demuxCtx, &_packet); //E_DEBUG(EAlgorithm, "AudioLoader: called av_read_frame(), got result = " << result); if (result != 0) { // 0 = OK, < 0 = error or EOF if (result != AVERROR_EOF) { char errstring[1204]; av_strerror(result, errstring, sizeof(errstring)); ostringstream msg; msg << "AudioLoader: Error reading frame: " << errstring; E_WARNING(msg.str()); } // TODO: should try reading again on EAGAIN error? // https://github.com/FFmpeg/FFmpeg/blob/master/ffmpeg.c shouldStop(true); flushPacket(); closeAudioFile(); if (_computeMD5) { av_md5_final(_md5Encoded, _checksum); _md5.push(uint8_t_to_hex(_checksum, 16)); } else { string md5 = ""; _md5.push(md5); } return FINISHED; } } while (_packet.stream_index != _streamIdx); // compute md5 first if (_computeMD5) { av_md5_update(_md5Encoded, _packet.data, _packet.size); } // decode frames in packet while(_packet.size > 0) { if (!decodePacket()) break; copyFFmpegOutput(); } // neds to be freed !! av_free_packet(&_packet); return OK; }
void AudioLoader::flushPacket() { AVPacket empty; av_init_packet(&empty); do { _dataSize = FFMPEG_BUFFER_SIZE; empty.data = NULL; empty.size = 0; int len = decode_audio_frame(_audioCtx, _buffer, &_dataSize, &empty); if (len < 0) { char errstring[1204]; av_strerror(len, errstring, sizeof(errstring)); ostringstream msg; msg << "AudioLoader: decoding error while flushing a packet:" << errstring; E_WARNING(msg.str()); } copyFFmpegOutput(); } while (_dataSize > 0); }
AlgorithmStatus AudioLoader::process() { if (!parameter("filename").isConfigured()) { throw EssentiaException("AudioLoader: Trying to call process() on an AudioLoader algo which hasn't been correctly configured."); } // read frames until we get a good one do { int result = av_read_frame(_demuxCtx, &_packet); //E_DEBUG(EAlgorithm, "AudioLoader: called av_read_frame(), got result = " << result); if (result != 0) { shouldStop(true); flushPacket(); closeAudioFile(); return FINISHED; } } while (_packet.stream_index != _streamIdx); decodePacket(); copyFFmpegOutput(); return OK; }