int AUD_FFMPEGReader::decode(AVPacket* packet, AUD_Buffer& buffer) { // save packet parameters uint8_t *audio_pkg_data = packet->data; int audio_pkg_size = packet->size; int buf_size = buffer.getSize(); int buf_pos = 0; int read_length, data_size; AVPacket tmp_pkt; av_init_packet(&tmp_pkt); // as long as there is still data in the package while(audio_pkg_size > 0) { // resize buffer if needed if(buf_size - buf_pos < AVCODEC_MAX_AUDIO_FRAME_SIZE) { buffer.resize(buf_size + AVCODEC_MAX_AUDIO_FRAME_SIZE, true); buf_size += AVCODEC_MAX_AUDIO_FRAME_SIZE; } // read samples from the packet data_size = buf_size - buf_pos; tmp_pkt.data = audio_pkg_data; tmp_pkt.size = audio_pkg_size; read_length = avcodec_decode_audio3( m_codecCtx, (int16_t*)(((data_t*)buffer.getBuffer()) + buf_pos), &data_size, &tmp_pkt); // read error, next packet! if(read_length < 0) break; buf_pos += data_size; // move packet parameters audio_pkg_data += read_length; audio_pkg_size -= read_length; } return buf_pos; }
int AUD_FFMPEGReader::decode(AVPacket& packet, AUD_Buffer& buffer) { #ifdef FFMPEG_HAVE_DECODE_AUDIO4 AVFrame* frame = NULL; int got_frame; int read_length; uint8_t* orig_data = packet.data; int orig_size = packet.size; int buf_size = buffer.getSize(); int buf_pos = 0; while(packet.size > 0) { got_frame = 0; if(!frame) frame = avcodec_alloc_frame(); else avcodec_get_frame_defaults(frame); read_length = avcodec_decode_audio4(m_codecCtx, frame, &got_frame, &packet); if(read_length < 0) break; if(got_frame) { int data_size = av_samples_get_buffer_size(NULL, m_codecCtx->channels, frame->nb_samples, m_codecCtx->sample_fmt, 1); if(buf_size - buf_pos < data_size) { buffer.resize(buf_size + data_size, true); buf_size += data_size; } if(m_tointerleave) { int single_size = data_size / m_codecCtx->channels / frame->nb_samples; for(int channel = 0; channel < m_codecCtx->channels; channel++) { for(int i = 0; i < frame->nb_samples; i++) { memcpy(((data_t*)buffer.getBuffer()) + buf_pos + ((m_codecCtx->channels * i) + channel) * single_size, frame->data[channel] + i * single_size, single_size); } } } else memcpy(((data_t*)buffer.getBuffer()) + buf_pos, frame->data[0], data_size); buf_pos += data_size; } packet.size -= read_length; packet.data += read_length; } packet.data = orig_data; packet.size = orig_size; av_free(frame); return buf_pos; #else // save packet parameters uint8_t *audio_pkg_data = packet.data; int audio_pkg_size = packet.size; int buf_size = buffer.getSize(); int buf_pos = 0; int read_length, data_size; AVPacket tmp_pkt; av_init_packet(&tmp_pkt); // as long as there is still data in the package while(audio_pkg_size > 0) { // resize buffer if needed if(buf_size - buf_pos < AVCODEC_MAX_AUDIO_FRAME_SIZE) { buffer.resize(buf_size + AVCODEC_MAX_AUDIO_FRAME_SIZE, true); buf_size += AVCODEC_MAX_AUDIO_FRAME_SIZE; } // read samples from the packet data_size = buf_size - buf_pos; tmp_pkt.data = audio_pkg_data; tmp_pkt.size = audio_pkg_size; read_length = avcodec_decode_audio3( m_codecCtx, (int16_t*)(((data_t*)buffer.getBuffer()) + buf_pos), &data_size, &tmp_pkt); // read error, next packet! if(read_length < 0) break; buf_pos += data_size; // move packet parameters audio_pkg_data += read_length; audio_pkg_size -= read_length; } return buf_pos; #endif }