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 MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODEC_INTERFACE_H_ 12 #define MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODEC_INTERFACE_H_ 13 14 #include <vector> 15 16 #include "absl/types/optional.h" 17 #include "api/video/video_frame.h" 18 #include "api/video_codecs/video_decoder.h" 19 #include "api/video_codecs/video_encoder.h" 20 #include "common_video/generic_frame_descriptor/generic_frame_info.h" 21 #include "modules/include/module_common_types.h" 22 #include "modules/video_coding/codecs/h264/include/h264_globals.h" 23 #include "modules/video_coding/codecs/vp9/include/vp9_globals.h" 24 #include "modules/video_coding/include/video_error_codes.h" 25 #include "rtc_base/deprecation.h" 26 #include "rtc_base/system/rtc_export.h" 27 28 namespace webrtc { 29 30 // Note: If any pointers are added to this struct, it must be fitted 31 // with a copy-constructor. See below. 32 // Hack alert - the code assumes that thisstruct is memset when constructed. 33 struct CodecSpecificInfoVP8 { 34 bool nonReference; 35 uint8_t temporalIdx; 36 bool layerSync; 37 int8_t keyIdx; // Negative value to skip keyIdx. 38 39 // Used to generate the list of dependency frames. 40 // |referencedBuffers| and |updatedBuffers| contain buffer IDs. 41 // Note that the buffer IDs here have a one-to-one mapping with the actual 42 // codec buffers, but the exact mapping (i.e. whether 0 refers to Last, 43 // to Golden or to Arf) is not pre-determined. 44 // More references may be specified than are strictly necessary, but not less. 45 // TODO(bugs.webrtc.org/10242): Remove |useExplicitDependencies| once all 46 // encoder-wrappers are updated. 47 bool useExplicitDependencies; 48 static constexpr size_t kBuffersCount = 3; 49 size_t referencedBuffers[kBuffersCount]; 50 size_t referencedBuffersCount; 51 size_t updatedBuffers[kBuffersCount]; 52 size_t updatedBuffersCount; 53 }; 54 static_assert(std::is_pod<CodecSpecificInfoVP8>::value, ""); 55 56 // Hack alert - the code assumes that thisstruct is memset when constructed. 57 struct CodecSpecificInfoVP9 { 58 bool first_frame_in_picture; // First frame, increment picture_id. 59 bool inter_pic_predicted; // This layer frame is dependent on previously 60 // coded frame(s). 61 bool flexible_mode; 62 bool ss_data_available; 63 bool non_ref_for_inter_layer_pred; 64 65 uint8_t temporal_idx; 66 bool temporal_up_switch; 67 bool inter_layer_predicted; // Frame is dependent on directly lower spatial 68 // layer frame. 69 uint8_t gof_idx; 70 71 // SS data. 72 size_t num_spatial_layers; // Always populated. 73 size_t first_active_layer; 74 bool spatial_layer_resolution_present; 75 uint16_t width[kMaxVp9NumberOfSpatialLayers]; 76 uint16_t height[kMaxVp9NumberOfSpatialLayers]; 77 GofInfoVP9 gof; 78 79 // Frame reference data. 80 uint8_t num_ref_pics; 81 uint8_t p_diff[kMaxVp9RefPics]; 82 83 RTC_DEPRECATED bool end_of_picture; 84 }; 85 static_assert(std::is_pod<CodecSpecificInfoVP9>::value, ""); 86 87 // Hack alert - the code assumes that thisstruct is memset when constructed. 88 struct CodecSpecificInfoH264 { 89 H264PacketizationMode packetization_mode; 90 uint8_t temporal_idx; 91 bool base_layer_sync; 92 bool idr_frame; 93 }; 94 static_assert(std::is_pod<CodecSpecificInfoH264>::value, ""); 95 96 union CodecSpecificInfoUnion { 97 CodecSpecificInfoVP8 VP8; 98 CodecSpecificInfoVP9 VP9; 99 CodecSpecificInfoH264 H264; 100 }; 101 static_assert(std::is_pod<CodecSpecificInfoUnion>::value, ""); 102 103 // Note: if any pointers are added to this struct or its sub-structs, it 104 // must be fitted with a copy-constructor. This is because it is copied 105 // in the copy-constructor of VCMEncodedFrame. 106 struct RTC_EXPORT CodecSpecificInfo { 107 CodecSpecificInfo(); 108 CodecSpecificInfo(const CodecSpecificInfo&); 109 ~CodecSpecificInfo(); 110 111 VideoCodecType codecType; 112 CodecSpecificInfoUnion codecSpecific; 113 bool end_of_picture = true; 114 absl::optional<GenericFrameInfo> generic_frame_info; 115 absl::optional<FrameDependencyStructure> template_structure; 116 }; 117 118 } // namespace webrtc 119 120 #endif // MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODEC_INTERFACE_H_ 121