1/*
2 *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11#ifndef WEBRTC_MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODEC_INTERFACE_H_
12#define WEBRTC_MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODEC_INTERFACE_H_
13
14#include <vector>
15
16#include "webrtc/common_types.h"
17#include "webrtc/modules/include/module_common_types.h"
18#include "webrtc/modules/video_coding/include/video_error_codes.h"
19#include "webrtc/typedefs.h"
20#include "webrtc/video_decoder.h"
21#include "webrtc/video_encoder.h"
22#include "webrtc/video_frame.h"
23
24namespace webrtc {
25
26class RTPFragmentationHeader;  // forward declaration
27
28// Note: if any pointers are added to this struct, it must be fitted
29// with a copy-constructor. See below.
30struct CodecSpecificInfoVP8 {
31  bool hasReceivedSLI;
32  uint8_t pictureIdSLI;
33  bool hasReceivedRPSI;
34  uint64_t pictureIdRPSI;
35  int16_t pictureId;  // Negative value to skip pictureId.
36  bool nonReference;
37  uint8_t simulcastIdx;
38  uint8_t temporalIdx;
39  bool layerSync;
40  int tl0PicIdx;  // Negative value to skip tl0PicIdx.
41  int8_t keyIdx;  // Negative value to skip keyIdx.
42};
43
44struct CodecSpecificInfoVP9 {
45  bool has_received_sli;
46  uint8_t picture_id_sli;
47  bool has_received_rpsi;
48  uint64_t picture_id_rpsi;
49  int16_t picture_id;  // Negative value to skip pictureId.
50
51  bool inter_pic_predicted;  // This layer frame is dependent on previously
52                             // coded frame(s).
53  bool flexible_mode;
54  bool ss_data_available;
55
56  int tl0_pic_idx;  // Negative value to skip tl0PicIdx.
57  uint8_t temporal_idx;
58  uint8_t spatial_idx;
59  bool temporal_up_switch;
60  bool inter_layer_predicted;  // Frame is dependent on directly lower spatial
61                               // layer frame.
62  uint8_t gof_idx;
63
64  // SS data.
65  size_t num_spatial_layers;  // Always populated.
66  bool spatial_layer_resolution_present;
67  uint16_t width[kMaxVp9NumberOfSpatialLayers];
68  uint16_t height[kMaxVp9NumberOfSpatialLayers];
69  GofInfoVP9 gof;
70
71  // Frame reference data.
72  uint8_t num_ref_pics;
73  uint8_t p_diff[kMaxVp9RefPics];
74};
75
76struct CodecSpecificInfoGeneric {
77  uint8_t simulcast_idx;
78};
79
80struct CodecSpecificInfoH264 {};
81
82union CodecSpecificInfoUnion {
83  CodecSpecificInfoGeneric generic;
84  CodecSpecificInfoVP8 VP8;
85  CodecSpecificInfoVP9 VP9;
86  CodecSpecificInfoH264 H264;
87};
88
89// Note: if any pointers are added to this struct or its sub-structs, it
90// must be fitted with a copy-constructor. This is because it is copied
91// in the copy-constructor of VCMEncodedFrame.
92struct CodecSpecificInfo {
93  VideoCodecType codecType;
94  CodecSpecificInfoUnion codecSpecific;
95};
96
97}  // namespace webrtc
98
99#endif  // WEBRTC_MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODEC_INTERFACE_H_
100