diff --git a/Libraries/LibMedia/CodedAudioFrameData.h b/Libraries/LibMedia/CodedAudioFrameData.h new file mode 100644 index 0000000000..56c67d7934 --- /dev/null +++ b/Libraries/LibMedia/CodedAudioFrameData.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2025, Gregory Bertilson + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +namespace Media { + +class CodedAudioFrameData { +public: + CodedAudioFrameData() + { + } +}; + +} diff --git a/Libraries/LibMedia/CodedFrame.h b/Libraries/LibMedia/CodedFrame.h index 361f633cdf..ed322a97cf 100644 --- a/Libraries/LibMedia/CodedFrame.h +++ b/Libraries/LibMedia/CodedFrame.h @@ -8,13 +8,14 @@ #include #include +#include #include namespace Media { class CodedFrame final { public: - using AuxiliaryData = Variant; + using AuxiliaryData = Variant; CodedFrame(AK::Duration timestamp, ByteBuffer&& data, AuxiliaryData auxiliary_data) : m_timestamp(timestamp) diff --git a/Libraries/LibMedia/Containers/Matroska/MatroskaDemuxer.cpp b/Libraries/LibMedia/Containers/Matroska/MatroskaDemuxer.cpp index de3e3dc39d..80e6a85492 100644 --- a/Libraries/LibMedia/Containers/Matroska/MatroskaDemuxer.cpp +++ b/Libraries/LibMedia/Containers/Matroska/MatroskaDemuxer.cpp @@ -190,9 +190,18 @@ DecoderErrorOr MatroskaDemuxer::get_next_sample_for_track(Track trac status.block = TRY(status.iterator.next_block()); status.frame_index = 0; } - auto cicp = TRY(m_reader.track_for_track_number(track.identifier()))->video_track()->color_format.to_cicp(); + auto aux_data = [&] -> CodedFrame::AuxiliaryData { + if (track.type() == TrackType::Video) { + auto cicp = MUST(m_reader.track_for_track_number(track.identifier()))->video_track()->color_format.to_cicp(); + return CodedVideoFrameData(cicp); + } + if (track.type() == TrackType::Audio) { + return CodedAudioFrameData(); + } + VERIFY_NOT_REACHED(); + }(); auto sample_data = DECODER_TRY_ALLOC(ByteBuffer::copy(status.block->frame(status.frame_index++))); - return CodedFrame(status.block->timestamp(), move(sample_data), CodedVideoFrameData(cicp)); + return CodedFrame(status.block->timestamp(), move(sample_data), aux_data); } DecoderErrorOr MatroskaDemuxer::total_duration() diff --git a/Libraries/LibMedia/FFmpeg/FFmpegDemuxer.cpp b/Libraries/LibMedia/FFmpeg/FFmpegDemuxer.cpp index 9428016ecf..b42e2a2a01 100644 --- a/Libraries/LibMedia/FFmpeg/FFmpegDemuxer.cpp +++ b/Libraries/LibMedia/FFmpeg/FFmpegDemuxer.cpp @@ -181,18 +181,27 @@ DecoderErrorOr FFmpegDemuxer::get_next_sample_for_track(Track track) continue; } - auto color_primaries = static_cast(stream->codecpar->color_primaries); - auto transfer_characteristics = static_cast(stream->codecpar->color_trc); - auto matrix_coefficients = static_cast(stream->codecpar->color_space); - auto color_range = [stream] { - switch (stream->codecpar->color_range) { - case AVColorRange::AVCOL_RANGE_MPEG: - return VideoFullRangeFlag::Studio; - case AVColorRange::AVCOL_RANGE_JPEG: - return VideoFullRangeFlag::Full; - default: - return VideoFullRangeFlag::Unspecified; + auto auxiliary_data = [&]() -> CodedFrame::AuxiliaryData { + if (track.type() == TrackType::Video) { + auto color_primaries = static_cast(stream->codecpar->color_primaries); + auto transfer_characteristics = static_cast(stream->codecpar->color_trc); + auto matrix_coefficients = static_cast(stream->codecpar->color_space); + auto color_range = [stream] { + switch (stream->codecpar->color_range) { + case AVColorRange::AVCOL_RANGE_MPEG: + return VideoFullRangeFlag::Studio; + case AVColorRange::AVCOL_RANGE_JPEG: + return VideoFullRangeFlag::Full; + default: + return VideoFullRangeFlag::Unspecified; + } + }(); + return CodedVideoFrameData(CodingIndependentCodePoints(color_primaries, transfer_characteristics, matrix_coefficients, color_range)); } + if (track.type() == TrackType::Audio) { + return CodedAudioFrameData(); + } + VERIFY_NOT_REACHED(); }(); // Copy the packet data so that we have a permanent reference to it whilst the Sample is alive, which allows us @@ -202,7 +211,7 @@ DecoderErrorOr FFmpegDemuxer::get_next_sample_for_track(Track track) auto sample = CodedFrame( time_units_to_duration(m_packet->pts, stream->time_base), move(packet_data), - CodedVideoFrameData(CodingIndependentCodePoints(color_primaries, transfer_characteristics, matrix_coefficients, color_range))); + auxiliary_data); // Wipe the packet now that the data is safe. av_packet_unref(m_packet);