diff --git a/src/core/libraries/avplayer/avplayer_source.cpp b/src/core/libraries/avplayer/avplayer_source.cpp index 4f637f1ba..0bbb662be 100644 --- a/src/core/libraries/avplayer/avplayer_source.cpp +++ b/src/core/libraries/avplayer/avplayer_source.cpp @@ -91,10 +91,6 @@ static AvPlayerStreamType CodecTypeToStreamType(AVMediaType codec_type) { } } -static f32 AVRationalToF32(const AVRational rational) { - return f32(rational.num) / rational.den; -} - bool AvPlayerSource::GetStreamInfo(u32 stream_index, AvPlayerStreamInfo& info) { info = {}; if (m_avformat_context == nullptr || stream_index >= m_avformat_context->nb_streams) { @@ -265,11 +261,11 @@ bool AvPlayerSource::Stop() { m_demuxer_thread.Stop(); if (m_current_audio_frame.has_value()) { - m_audio_buffers.Push(std::move(m_current_audio_frame.value())); + m_audio_buffers.Push(std::move(m_current_audio_frame->buffer)); m_current_audio_frame.reset(); } if (m_current_video_frame.has_value()) { - m_video_buffers.Push(std::move(m_current_video_frame.value())); + m_video_buffers.Push(std::move(m_current_video_frame->buffer)); m_current_video_frame.reset(); } @@ -281,12 +277,12 @@ bool AvPlayerSource::Stop() { } void AvPlayerSource::Pause() { - m_last_paused_time = std::chrono::high_resolution_clock::now(); + m_pause_time = std::chrono::high_resolution_clock::now(); m_is_paused = true; } void AvPlayerSource::Resume() { - m_stalled_time += std::chrono::high_resolution_clock::now() - m_last_paused_time; + m_pause_duration += std::chrono::high_resolution_clock::now() - m_pause_time; m_is_paused = false; } @@ -313,11 +309,10 @@ bool AvPlayerSource::GetVideoData(AvPlayerFrameInfoEx& video_info) { return false; } - const auto& last_frame = m_video_frames.Front(); + const auto& new_frame = m_video_frames.Front(); if (m_state.GetSyncMode() == AvPlayerAvSyncMode::Default) { - const auto current_time = - m_audio_stream_index.has_value() ? m_last_audio_packet_time : CurrentTime(); - if (0 < current_time && current_time < last_frame.info.timestamp) { + const auto current_time = CurrentTime(); + if (0 < current_time && current_time < new_frame.info.timestamp) { return false; } } @@ -325,11 +320,11 @@ bool AvPlayerSource::GetVideoData(AvPlayerFrameInfoEx& video_info) { auto frame = m_video_frames.Pop(); if (m_current_video_frame.has_value()) { // return the buffer to the queue - m_video_buffers.Push(std::move(m_current_video_frame.value())); + m_video_buffers.Push(std::move(m_current_video_frame->buffer)); m_video_buffers_cv.Notify(); } - m_current_video_frame = std::move(frame->buffer); video_info = frame->info; + m_current_video_frame = std::move(frame); return true; } @@ -345,11 +340,9 @@ bool AvPlayerSource::GetAudioData(AvPlayerFrameInfo& audio_info) { auto frame = m_audio_frames.Pop(); if (m_current_audio_frame.has_value()) { // return the buffer to the queue - m_audio_buffers.Push(std::move(m_current_audio_frame.value())); + m_audio_buffers.Push(std::move(m_current_audio_frame->buffer)); m_audio_buffers_cv.Notify(); } - m_current_audio_frame = std::move(frame->buffer); - m_last_audio_packet_time = frame->info.timestamp; audio_info = {}; audio_info.timestamp = frame->info.timestamp; @@ -357,6 +350,7 @@ bool AvPlayerSource::GetAudioData(AvPlayerFrameInfo& audio_info) { audio_info.details.audio.sample_rate = frame->info.details.audio.sample_rate; audio_info.details.audio.size = frame->info.details.audio.size; audio_info.details.audio.channel_count = frame->info.details.audio.channel_count; + m_current_audio_frame = std::move(frame); return true; } @@ -365,7 +359,8 @@ u64 AvPlayerSource::CurrentTime() { return 0; } using namespace std::chrono; - return duration_cast(high_resolution_clock::now() - m_start_time - m_stalled_time) + return duration_cast(high_resolution_clock::now() - m_start_time - + m_pause_duration) .count(); } @@ -568,7 +563,7 @@ Frame AvPlayerSource::PrepareVideoFrame(FrameBuffer buffer, const AVFrame& frame { .width = width, .height = height, - .aspect_ratio = AVRationalToF32(frame.sample_aspect_ratio), + .aspect_ratio = (float)av_q2d(frame.sample_aspect_ratio), .crop_left_offset = u32(frame.crop_left), .crop_right_offset = u32(frame.crop_right + (width - frame.width)), .crop_top_offset = u32(frame.crop_top), diff --git a/src/core/libraries/avplayer/avplayer_source.h b/src/core/libraries/avplayer/avplayer_source.h index edb0e680c..cb0cef8f6 100644 --- a/src/core/libraries/avplayer/avplayer_source.h +++ b/src/core/libraries/avplayer/avplayer_source.h @@ -188,8 +188,8 @@ private: AvPlayerQueue m_audio_frames; AvPlayerQueue m_video_frames; - std::optional m_current_video_frame; - std::optional m_current_audio_frame; + std::optional m_current_video_frame; + std::optional m_current_audio_frame; std::optional m_video_stream_index{}; std::optional m_audio_stream_index{}; @@ -214,9 +214,8 @@ private: SWSContextPtr m_sws_context{nullptr, &ReleaseSWSContext}; std::chrono::high_resolution_clock::time_point m_start_time{}; - std::chrono::high_resolution_clock::time_point m_last_paused_time{}; - std::chrono::high_resolution_clock::duration m_stalled_time{}; - u64 m_last_audio_packet_time{}; + std::chrono::high_resolution_clock::time_point m_pause_time{}; + std::chrono::high_resolution_clock::duration m_pause_duration{}; }; } // namespace Libraries::AvPlayer diff --git a/src/core/libraries/avplayer/avplayer_state.cpp b/src/core/libraries/avplayer/avplayer_state.cpp index 889884945..38811d853 100644 --- a/src/core/libraries/avplayer/avplayer_state.cpp +++ b/src/core/libraries/avplayer/avplayer_state.cpp @@ -429,7 +429,7 @@ void AvPlayerState::ProcessEvent() { } switch (event->event) { case AvEventType::WarningId: { - OnWarning(event->payload.error); + EmitEvent(AvPlayerEvents::WarningId, &event->payload.error); break; } case AvEventType::RevertState: {