[M120 Migration][hbbtv] Audio tracks count notification
[platform/framework/web/chromium-efl.git] / media / filters / hls_codec_detector.h
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.
4
5 #ifndef MEDIA_FILTERS_HLS_CODEC_DETECTOR_H_
6 #define MEDIA_FILTERS_HLS_CODEC_DETECTOR_H_
7
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"
16
17 namespace media {
18
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 {
22  public:
23   struct ContainerAndCodecs {
24     std::string container;
25     std::string codecs;
26   };
27   using CodecCallback = HlsDemuxerStatusCb<ContainerAndCodecs>;
28   virtual ~HlsCodecDetector() = 0;
29
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;
36 };
37
38 class MEDIA_EXPORT HlsCodecDetectorImpl : public HlsCodecDetector {
39  public:
40   ~HlsCodecDetectorImpl() override;
41
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_);
46
47   void DetermineContainerAndCodec(std::unique_ptr<HlsDataSourceStream> stream,
48                                   CodecCallback cb) override;
49   void DetermineContainerOnly(std::unique_ptr<HlsDataSourceStream> stream,
50                               CodecCallback cb) override;
51
52  private:
53   void OnStreamFetched(bool container_only,
54                        HlsDataSourceProvider::ReadResult stream);
55   void DetermineContainer(bool container_only,
56                           const uint8_t* data,
57                           size_t size);
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);
64
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;
71
72   SEQUENCE_CHECKER(sequence_checker_);
73   base::WeakPtrFactory<HlsCodecDetectorImpl> weak_factory_{this};
74 };
75
76 }  // namespace media
77
78 #endif  // MEDIA_FILTERS_HLS_CODEC_DETECTOR_H_