1 // Copyright 2023 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef MEDIA_FILTERS_HLS_CODEC_DETECTOR_H_
6 #define MEDIA_FILTERS_HLS_CODEC_DETECTOR_H_
8 #include "base/functional/callback.h"
9 #include "base/sequence_checker.h"
10 #include "media/base/media_log.h"
11 #include "media/base/media_tracks.h"
12 #include "media/base/stream_parser.h"
13 #include "media/filters/hls_data_source_provider.h"
14 #include "media/filters/hls_demuxer_status.h"
15 #include "media/filters/hls_rendition.h"
19 // Helper class for parsing a hls segment to determine a container and codec
20 // list, which can be used to initialize the chunk demuxer.
21 class MEDIA_EXPORT HlsCodecDetector {
23 struct ContainerAndCodecs {
24 std::string container;
27 using CodecCallback = HlsDemuxerStatusCb<ContainerAndCodecs>;
28 virtual ~HlsCodecDetector() = 0;
30 virtual void DetermineContainerAndCodec(
31 std::unique_ptr<HlsDataSourceStream> stream,
32 CodecCallback cb) = 0;
33 virtual void DetermineContainerOnly(
34 std::unique_ptr<HlsDataSourceStream> stream,
35 CodecCallback cb) = 0;
38 class MEDIA_EXPORT HlsCodecDetectorImpl : public HlsCodecDetector {
40 ~HlsCodecDetectorImpl() override;
42 // The HlsRenditionHost owns the only implementation of HlsCodecDetector
43 // and uses it only on a single thread, where it is also deleted. Keeping
44 // a raw pointer to that HlsRenditionHost is therefore safe.
45 HlsCodecDetectorImpl(MediaLog* media_log, HlsRenditionHost* rendition_host_);
47 void DetermineContainerAndCodec(std::unique_ptr<HlsDataSourceStream> stream,
48 CodecCallback cb) override;
49 void DetermineContainerOnly(std::unique_ptr<HlsDataSourceStream> stream,
50 CodecCallback cb) override;
53 void OnStreamFetched(bool container_only,
54 HlsDataSourceProvider::ReadResult stream);
55 void DetermineContainer(bool container_only,
58 void ParserInit(const StreamParser::InitParameters& params);
59 bool OnNewConfigMP2T(std::unique_ptr<MediaTracks> tracks);
60 bool OnNewBuffers(const StreamParser::BufferQueueMap& buffers);
61 void OnEncryptedMediaInit(EmeInitDataType type,
62 const std::vector<uint8_t>& data);
63 void AddCodecToResponse(std::string codec);
65 std::unique_ptr<MediaLog> log_;
66 CodecCallback callback_;
67 std::unique_ptr<media::StreamParser> parser_;
68 std::string codec_response_;
69 std::string container_;
70 raw_ptr<HlsRenditionHost> rendition_host_ = nullptr;
72 SEQUENCE_CHECKER(sequence_checker_);
73 base::WeakPtrFactory<HlsCodecDetectorImpl> weak_factory_{this};
78 #endif // MEDIA_FILTERS_HLS_CODEC_DETECTOR_H_