projects
/
dcpomatic.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Bump ffmpeg to 5.1.2 "Riemann"
[dcpomatic.git]
/
src
/
lib
/
ffmpeg_decoder.cc
diff --git
a/src/lib/ffmpeg_decoder.cc
b/src/lib/ffmpeg_decoder.cc
index 331ab313d762c99d6b1d383d3606953ac384ba35..d4a5d6c192884872dd35ca260576be73e4690418 100644
(file)
--- a/
src/lib/ffmpeg_decoder.cc
+++ b/
src/lib/ffmpeg_decoder.cc
@@
-219,14
+219,15
@@
FFmpegDecoder::pass ()
/** @param data pointer to array of pointers to buffers.
* Only the first buffer will be used for non-planar data, otherwise there will be one per channel.
*/
/** @param data pointer to array of pointers to buffers.
* Only the first buffer will be used for non-planar data, otherwise there will be one per channel.
*/
+static
shared_ptr<AudioBuffers>
shared_ptr<AudioBuffers>
-
FFmpegDecoder::deinterleave_audio (
AVFrame* frame)
+
deinterleave_audio(shared_ptr<FFmpegAudioStream> stream,
AVFrame* frame)
{
auto format = static_cast<AVSampleFormat>(frame->format);
/* XXX: can't we use swr_convert() to do the format conversion? */
{
auto format = static_cast<AVSampleFormat>(frame->format);
/* XXX: can't we use swr_convert() to do the format conversion? */
- int const channels = frame->channels;
+ int const channels = frame->ch
_layout.nb_ch
annels;
int const frames = frame->nb_samples;
int const total_samples = frames * channels;
auto audio = make_shared<AudioBuffers>(channels, frames);
int const frames = frame->nb_samples;
int const total_samples = frames * channels;
auto audio = make_shared<AudioBuffers>(channels, frames);
@@
-326,12
+327,12
@@
FFmpegDecoder::deinterleave_audio (AVFrame* frame)
case AV_SAMPLE_FMT_FLTP:
{
auto p = reinterpret_cast<float**> (frame->data);
case AV_SAMPLE_FMT_FLTP:
{
auto p = reinterpret_cast<float**> (frame->data);
- DCPOMATIC_ASSERT
(frame->channels <= channels
);
+ DCPOMATIC_ASSERT
(channels <= stream->channels()
);
/* Sometimes there aren't as many channels in the frame as in the stream */
/* Sometimes there aren't as many channels in the frame as in the stream */
- for (int i = 0; i <
frame->
channels; ++i) {
+ for (int i = 0; i < channels; ++i) {
memcpy (data[i], p[i], frames * sizeof(float));
}
memcpy (data[i], p[i], frames * sizeof(float));
}
- for (int i =
frame->channels; i < channels
; ++i) {
+ for (int i =
channels; i < stream->channels()
; ++i) {
audio->make_silent (i);
}
}
audio->make_silent (i);
}
}
@@
-450,7
+451,9
@@
void
FFmpegDecoder::process_audio_frame (shared_ptr<FFmpegAudioStream> stream)
{
auto frame = audio_frame (stream);
FFmpegDecoder::process_audio_frame (shared_ptr<FFmpegAudioStream> stream)
{
auto frame = audio_frame (stream);
- auto data = deinterleave_audio (frame);
+ auto data = deinterleave_audio(stream, frame);
+
+ auto const time_base = stream->stream(_format_context)->time_base;
ContentTime ct;
if (frame->pts == AV_NOPTS_VALUE) {
ContentTime ct;
if (frame->pts == AV_NOPTS_VALUE) {
@@
-464,8
+467,16
@@
FFmpegDecoder::process_audio_frame (shared_ptr<FFmpegAudioStream> stream)
} else {
ct = ContentTime::from_seconds (
frame->best_effort_timestamp *
} else {
ct = ContentTime::from_seconds (
frame->best_effort_timestamp *
- av_q2d
(stream->stream(_format_context)->
time_base))
+ av_q2d
(
time_base))
+ _pts_offset;
+ _pts_offset;
+ LOG_DEBUG_PLAYER(
+ "Process audio with timestamp %1 (BET %2, timebase %3/%4, (PTS offset %5)",
+ to_string(ct),
+ frame->best_effort_timestamp,
+ time_base.num,
+ time_base.den,
+ to_string(_pts_offset)
+ );
}
_next_time[stream] = ct + ContentTime::from_frames(data->frames(), stream->frame_rate());
}
_next_time[stream] = ct + ContentTime::from_frames(data->frames(), stream->frame_rate());
@@
-485,7
+496,7
@@
FFmpegDecoder::process_audio_frame (shared_ptr<FFmpegAudioStream> stream)
data->frames(),
stream->id(),
frame->best_effort_timestamp,
data->frames(),
stream->id(),
frame->best_effort_timestamp,
- av_q2d(
stream->stream(_format_context)->
time_base),
+ av_q2d(time_base),
to_string(_pts_offset)
);
}
to_string(_pts_offset)
);
}
@@
-508,6
+519,7
@@
FFmpegDecoder::decode_and_process_audio_packet (AVPacket* packet)
auto context = _codec_context[stream->index(_format_context)];
auto frame = audio_frame (stream);
auto context = _codec_context[stream->index(_format_context)];
auto frame = audio_frame (stream);
+ LOG_DEBUG_PLAYER("Send audio packet on stream %1", stream->index(_format_context));
int r = avcodec_send_packet (context, packet);
if (r < 0) {
LOG_WARNING("avcodec_send_packet returned %1 for an audio packet", r);
int r = avcodec_send_packet (context, packet);
if (r < 0) {
LOG_WARNING("avcodec_send_packet returned %1 for an audio packet", r);
@@
-516,6
+528,7
@@
FFmpegDecoder::decode_and_process_audio_packet (AVPacket* packet)
r = avcodec_receive_frame (context, frame);
if (r == AVERROR(EAGAIN)) {
/* More input is required */
r = avcodec_receive_frame (context, frame);
if (r == AVERROR(EAGAIN)) {
/* More input is required */
+ LOG_DEBUG_PLAYER_NC("EAGAIN after trying to receive audio frame");
return;
}
return;
}