|
@@ -297,71 +297,67 @@ fetch_packet() {
|
|
|
*/
|
|
*/
|
|
|
bool FfmpegAudioCursor::
|
|
bool FfmpegAudioCursor::
|
|
|
reload_buffer() {
|
|
reload_buffer() {
|
|
|
-
|
|
|
|
|
- while (_buffer_head == _buffer_tail) {
|
|
|
|
|
|
|
+ int got_frame = 0;
|
|
|
|
|
+ while (!got_frame) {
|
|
|
// If we're out of packets, generate silence.
|
|
// If we're out of packets, generate silence.
|
|
|
- if (_packet->data == 0) {
|
|
|
|
|
|
|
+ if (_packet->data == nullptr) {
|
|
|
_buffer_head = 0;
|
|
_buffer_head = 0;
|
|
|
_buffer_tail = _buffer_size;
|
|
_buffer_tail = _buffer_size;
|
|
|
memset(_buffer, 0, _buffer_size * 2);
|
|
memset(_buffer, 0, _buffer_size * 2);
|
|
|
return true;
|
|
return true;
|
|
|
- } else if (_packet_size > 0) {
|
|
|
|
|
- int bufsize = _buffer_size * 2;
|
|
|
|
|
- int got_frame;
|
|
|
|
|
|
|
+ } else if (_packet_size == 0) {
|
|
|
|
|
+ fetch_packet();
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- AVPacket *pkt;
|
|
|
|
|
|
|
+ AVPacket *pkt;
|
|
|
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 12, 100)
|
|
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 12, 100)
|
|
|
- pkt = av_packet_alloc();
|
|
|
|
|
|
|
+ pkt = av_packet_alloc();
|
|
|
#else
|
|
#else
|
|
|
- AVPacket _pkt;
|
|
|
|
|
- pkt = &_pkt;
|
|
|
|
|
- av_init_packet(pkt);
|
|
|
|
|
|
|
+ AVPacket _pkt;
|
|
|
|
|
+ pkt = &_pkt;
|
|
|
|
|
+ av_init_packet(pkt);
|
|
|
#endif
|
|
#endif
|
|
|
- pkt->data = _packet_data;
|
|
|
|
|
- pkt->size = _packet_size;
|
|
|
|
|
|
|
+ pkt->data = _packet_data;
|
|
|
|
|
+ pkt->size = _packet_size;
|
|
|
|
|
|
|
|
- int len = avcodec_decode_audio4(_audio_ctx, _frame, &got_frame, pkt);
|
|
|
|
|
- movies_debug("avcodec_decode_audio4 returned " << len);
|
|
|
|
|
|
|
+ int len = avcodec_decode_audio4(_audio_ctx, _frame, &got_frame, pkt);
|
|
|
|
|
+ movies_debug("avcodec_decode_audio4 returned " << len);
|
|
|
|
|
|
|
|
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 12, 100)
|
|
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 12, 100)
|
|
|
- av_packet_free(&pkt);
|
|
|
|
|
|
|
+ av_packet_free(&pkt);
|
|
|
#else
|
|
#else
|
|
|
- av_free_packet(pkt);
|
|
|
|
|
|
|
+ av_free_packet(pkt);
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
- bufsize = 0;
|
|
|
|
|
- if (got_frame) {
|
|
|
|
|
|
|
+ if (len < 0) {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ } else if (len == 0) {
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+ _packet_data += len;
|
|
|
|
|
+ _packet_size -= len;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ int bufsize;
|
|
|
#ifdef HAVE_SWRESAMPLE
|
|
#ifdef HAVE_SWRESAMPLE
|
|
|
- if (_resample_ctx) {
|
|
|
|
|
- // Resample the data to signed 16-bit sample format.
|
|
|
|
|
- bufsize = swr_convert(_resample_ctx, (uint8_t **)&_buffer, _buffer_size / 2, (const uint8_t**)_frame->extended_data, _frame->nb_samples);
|
|
|
|
|
- bufsize *= _audio_channels * 2;
|
|
|
|
|
- } else
|
|
|
|
|
|
|
+ if (_resample_ctx) {
|
|
|
|
|
+ // Resample the data to signed 16-bit sample format.
|
|
|
|
|
+ bufsize = swr_convert(_resample_ctx, (uint8_t **)&_buffer, _buffer_size / 2, (const uint8_t**)_frame->extended_data, _frame->nb_samples);
|
|
|
|
|
+ bufsize *= _audio_channels * 2;
|
|
|
|
|
+ } else
|
|
|
#endif
|
|
#endif
|
|
|
- {
|
|
|
|
|
- bufsize = _frame->linesize[0];
|
|
|
|
|
- memcpy(_buffer, _frame->data[0], bufsize);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ {
|
|
|
|
|
+ bufsize = _frame->linesize[0];
|
|
|
|
|
+ memcpy(_buffer, _frame->data[0], bufsize);
|
|
|
|
|
+ }
|
|
|
#if LIBAVUTIL_VERSION_INT > AV_VERSION_INT(52, 19, 100)
|
|
#if LIBAVUTIL_VERSION_INT > AV_VERSION_INT(52, 19, 100)
|
|
|
- av_frame_unref(_frame);
|
|
|
|
|
|
|
+ av_frame_unref(_frame);
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
- if (len < 0) {
|
|
|
|
|
- return false;
|
|
|
|
|
- } else if (len == 0){
|
|
|
|
|
- return true;
|
|
|
|
|
- }
|
|
|
|
|
- _packet_data += len;
|
|
|
|
|
- _packet_size -= len;
|
|
|
|
|
- if (bufsize > 0) {
|
|
|
|
|
- _buffer_head = 0;
|
|
|
|
|
- _buffer_tail = (bufsize/2);
|
|
|
|
|
- return true;
|
|
|
|
|
- }
|
|
|
|
|
- } else {
|
|
|
|
|
- fetch_packet();
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ if (bufsize > 0) {
|
|
|
|
|
+ _buffer_head = 0;
|
|
|
|
|
+ _buffer_tail = (bufsize/2);
|
|
|
|
|
+ return true;
|
|
|
}
|
|
}
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|