1 /* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
2 *
3 *  Use of this source code is governed by a BSD-style license
4 *  that can be found in the LICENSE file in the root of the source
5 *  tree. An additional intellectual property rights grant can be found
6 *  in the file PATENTS.  All contributing project authors may
7 *  be found in the AUTHORS file in the root of the source tree.
8 */
9 /*
10 * This file defines the interface for doing temporal layers with VP8.
11 */
12 #ifndef WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_TEMPORAL_LAYERS_H_
13 #define WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_TEMPORAL_LAYERS_H_
14 
15 #include "vpx/vpx_encoder.h"
16 
17 #include "webrtc/common.h"
18 #include "webrtc/common_video/include/video_image.h"
19 #include "webrtc/typedefs.h"
20 
21 namespace webrtc {
22 
23 struct CodecSpecificInfoVP8;
24 
25 class TemporalLayers {
26  public:
27   // Factory for TemporalLayer strategy. Default behaviour is a fixed pattern
28   // of temporal layers. See default_temporal_layers.cc
29   struct Factory {
FactoryFactory30     Factory() {}
~FactoryFactory31     virtual ~Factory() {}
32     virtual TemporalLayers* Create(int temporal_layers,
33                                    uint8_t initial_tl0_pic_idx) const;
34     static const ConfigOptionID identifier =
35         ConfigOptionID::kTemporalLayersFactory;
36   };
37 
~TemporalLayers()38   virtual ~TemporalLayers() {}
39 
40   // Returns the recommended VP8 encode flags needed. May refresh the decoder
41   // and/or update the reference buffers.
42   virtual int EncodeFlags(uint32_t timestamp) = 0;
43 
44   virtual bool ConfigureBitrates(int bitrate_kbit,
45                                  int max_bitrate_kbit,
46                                  int framerate,
47                                  vpx_codec_enc_cfg_t* cfg) = 0;
48 
49   virtual void PopulateCodecSpecific(bool base_layer_sync,
50                                      CodecSpecificInfoVP8* vp8_info,
51                                      uint32_t timestamp) = 0;
52 
53   virtual void FrameEncoded(unsigned int size, uint32_t timestamp, int qp) = 0;
54 
55   virtual int CurrentLayerId() const = 0;
56 
57   virtual bool UpdateConfiguration(vpx_codec_enc_cfg_t* cfg) = 0;
58 };
59 
60 // Factory for a temporal layers strategy that adaptively changes the number of
61 // layers based on input framerate so that the base layer has an acceptable
62 // framerate. See realtime_temporal_layers.cc
63 struct RealTimeTemporalLayersFactory : TemporalLayers::Factory {
~RealTimeTemporalLayersFactoryRealTimeTemporalLayersFactory64   virtual ~RealTimeTemporalLayersFactory() {}
65   virtual TemporalLayers* Create(int num_temporal_layers,
66                                  uint8_t initial_tl0_pic_idx) const;
67 };
68 
69 }  // namespace webrtc
70 #endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_TEMPORAL_LAYERS_H_
71