1 /* 2 * Copyright (C) 2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef TRANSCODER_H 17 #define TRANSCODER_H 18 19 #include <cstdint> 20 #include <string> 21 #include <map> 22 #include <set> 23 #include <parcel.h> 24 #include "meta/format.h" 25 #include "surface.h" 26 #include "recorder.h" 27 #include "av_common.h" 28 #include "codec_capability.h" 29 #include "media_core.h" 30 31 namespace OHOS { 32 namespace Media { 33 using ConfigMap = std::map<std::string, int32_t>; 34 35 /** 36 * @brief Enumerates transcodering error types. 37 * 38 * @since 5.0 39 * @version 5.0 40 */ 41 enum TransCoderErrorType : int32_t { 42 TRANSCODER_ERROR_INTERNAL 43 }; 44 45 enum TransCoderOnInfoType : int32_t { 46 /* return the current progress of transcoder automatically. */ 47 INFO_TYPE_TRANSCODER_COMPLETED = 0, 48 /* return the current progress of transcoder automatically. */ 49 INFO_TYPE_PROGRESS_UPDATE = 1, 50 }; 51 52 /** 53 * @brief Provides listeners for transcodering errors and information events. 54 * 55 * @since 5.0 56 * @version 5.0 57 */ 58 class TransCoderCallback { 59 public: 60 virtual ~TransCoderCallback() = default; 61 62 /** 63 * @brief Called when an error occurs during transcodering. This callback is used to report transcodering errors. 64 * 65 * @param errorType Indicates the error type. For details, see {@link TransCoderErrorType}. 66 * @param errorCode Indicates the error code. 67 * @since 1.0 68 * @version 1.0 69 */ 70 virtual void OnError(int32_t errorCode, const std::string &errorMsg) = 0; 71 72 /** 73 * @brief Called when an information event occurs during transcodering. This callback is used to report 74 * transcodering information. 75 * 76 * @param type Indicates the information type. For details, see {@link TransCoderInfoType}. 77 * @param extra Indicates other information, for example, the start time position of a transcodering file. 78 * @since 1.0 79 * @version 1.0 80 */ 81 virtual void OnInfo(int32_t type, int32_t extra) = 0; 82 }; 83 84 /** 85 * @brief Provides functions for audio and video transcodering. 86 * 87 * @since 1.0 88 * @version 1.0 89 */ 90 class TransCoder { 91 public: 92 virtual ~TransCoder() = default; 93 94 /** 95 * @brief Sets the output file format. 96 * 97 * This function must be called before {@link Prepare} and after after all required sources have been set. After 98 * this function called, no more source settings allowed. 99 * 100 * @param format Indicates the output file format. For details, see {@link OutputFormatType}. 101 * @return Returns {@link MSERR_OK} if the setting is successful; returns an error code otherwise. 102 * @since 1.0 103 * @version 1.0 104 */ 105 virtual int32_t SetOutputFormat(OutputFormatType format) = 0; 106 107 /** 108 * @brief Sets the encoder of the video to transcoder. 109 * 110 * If this function is not called, the output file does not contain the video track when the video source is 111 * YUV or RGB. 112 * This function must be called after {@link SetOutputFormat} but before {@link Prepare}. 113 * 114 * @param encoder Indicates the video encoder to set. For details, see {@link VideoCodecFormat}. 115 * @return Returns {@link MSERR_OK} if the setting is successful; returns an error code otherwise. 116 * @since 1.0 117 * @version 1.0 118 */ 119 virtual int32_t SetVideoEncoder(VideoCodecFormat encoder) = 0; 120 121 /** 122 * @brief Sets the encoding bit rate of the video to transcoder. 123 * 124 * This function must be called after {@link SetOutputFormat} but before {@link Prepare}. 125 * 126 * @param rate Indicates the encoding bit rate to set. 127 * @return Returns {@link MSERR_OK} if the setting is successful; returns an error code otherwise. 128 * @since 1.0 129 * @version 1.0 130 */ 131 virtual int32_t SetVideoEncodingBitRate(int32_t rate) = 0; 132 133 /** 134 * @brief Sets the encoding video size of the video to transcoder. 135 * 136 * This function must be called after {@link SetOutputFormat} but before {@link Prepare}. 137 * 138 * @param rate Indicates the encoding bit rate to set. 139 * @return Returns {@link MSERR_OK} if the setting is successful; returns an error code otherwise. 140 * @since 1.0 141 * @version 1.0 142 */ 143 virtual int32_t SetVideoSize(int32_t videoFrameWidth, int32_t videoFrameHeight) = 0; 144 145 /** 146 * @brief Sets the encoder of the audio to transcoder. 147 * 148 * If this function is not called, the output file does not contain the audio track. 149 * This function must be called after {@link SetOutputFormat} but before {@link Prepare}. 150 * 151 * @param encoder Indicates the audio encoder to set. 152 * @return Returns {@link MSERR_OK} if the setting is successful; returns an error code otherwise. 153 * @since 1.0 154 * @version 1.0 155 */ 156 virtual int32_t SetAudioEncoder(AudioCodecFormat encoder) = 0; 157 158 /** 159 * @brief Sets the encoding bit rate of the audio to transcoder. 160 * 161 * This function must be called after {@link SetOutputFormat} but before {@link Prepare}. 162 * 163 * @param bitRate Indicates the audio encoding bit rate, in bit/s. 164 * @return Returns {@link MSERR_OK} if the setting is successful; returns an error code otherwise. 165 * @since 1.0 166 * @version 1.0 167 */ 168 virtual int32_t SetAudioEncodingBitRate(int32_t bitRate) = 0; 169 170 /** 171 * @brief Sets the file descriptor (FD) of the input file. 172 * 173 * @param fd Indicates the FD of the file. 174 * @return Returns {@link MSERR_OK} if the setting is successful; returns an error code otherwise. 175 * @since 1.0 176 * @version 1.0 177 */ 178 virtual int32_t SetInputFile(int32_t fd, int64_t offset, int64_t size) = 0; 179 180 /** 181 * @brief Sets the file descriptor (FD) of the output file. 182 * 183 * This function must be called after {@link SetOutputFormat} but before {@link Prepare} 184 * 185 * @param fd Indicates the FD of the file. 186 * @return Returns {@link MSERR_OK} if the setting is successful; returns an error code otherwise. 187 * @since 1.0 188 * @version 1.0 189 */ 190 virtual int32_t SetOutputFile(int32_t fd) = 0; 191 192 /** 193 * @brief Registers a transcodering listener. 194 * 195 * This function must be called after {@link SetOutputFormat} but before {@link Prepare} 196 * 197 * @param callback Indicates the transcodering listener to register. For details, see {@link TransCoderCallback}. 198 * @return Returns {@link MSERR_OK} if the setting is successful; returns an error code otherwise. 199 * @since 1.0 200 * @version 1.0 201 */ 202 virtual int32_t SetTransCoderCallback(const std::shared_ptr<TransCoderCallback> &callback) = 0; 203 204 /** 205 * @brief Prepares for transcodering. 206 * 207 * This function must be called before {@link Start}. 208 * 209 * @return Returns {@link MSERR_OK} if the preparation is successful; returns an error code otherwise. 210 * @since 1.0 211 * @version 1.0 212 */ 213 virtual int32_t Prepare() = 0; 214 215 /** 216 * @brief Starts transcodering. 217 * 218 * This function must be called after {@link Prepare}. 219 * 220 * @return Returns {@link MSERR_OK} if the transcodering is started; returns an error code otherwise. 221 * @since 1.0 222 * @version 1.0 223 */ 224 virtual int32_t Start() = 0; 225 226 /** 227 * @brief Pauses transcodering. 228 * 229 * After {@link Start} is called, you can call this function to pause transcodering. 230 * 231 * @return Returns {@link MSERR_OK} if the transcodering is paused; returns an error code otherwise. 232 * @since 1.0 233 * @version 1.0 234 */ 235 virtual int32_t Pause() = 0; 236 237 /** 238 * @brief Resumes transcodering. 239 * 240 * You can call this function to resume transcodering after {@link Pause} is called. 241 * 242 * @return Returns {@link MSERR_OK} if the transcodering is resumed; returns an error code otherwise. 243 * @since 1.0 244 * @version 1.0 245 */ 246 virtual int32_t Resume() = 0; 247 248 /** 249 * @brief Cancel transcodering. 250 * 251 * @param block Indicates the stop mode. The value <b>true</b> indicates that the processing stops after all caches 252 * are processed, and <b>false</b> indicates that the processing stops immediately and all caches are discarded. 253 * After the transcodering stopped, all sources and parameters must be set again to restore transcodering. 254 * The function is like to {@link Reset}, except that the block parameter is allowed to be specified. 255 * @return Returns {@link MSERR_OK} if the transcodering is stopped; returns an error code otherwise. 256 * @since 1.0 257 * @version 1.0 258 */ 259 virtual int32_t Cancel() = 0; 260 261 /** 262 * @brief Releases transcodering resources. After this function called, none of interfaces of {@link Transcoder} 263 * can be used. 264 * 265 * @return Returns {@link MSERR_OK} if the transcodering is stopped; returns an error code otherwise. 266 * @since 1.0 267 * @version 1.0 268 */ 269 virtual int32_t Release() = 0; 270 }; 271 272 class __attribute__((visibility("default"))) TransCoderFactory { 273 public: 274 #ifdef UNSUPPORT_TRANSCODER CreateTransCoder()275 static std::shared_ptr<TransCoder> CreateTransCoder() 276 { 277 return nullptr; 278 } 279 #else 280 static std::shared_ptr<TransCoder> CreateTransCoder(); 281 #endif 282 private: 283 TransCoderFactory() = default; 284 ~TransCoderFactory() = default; 285 }; 286 } // namespace Media 287 } // namespace OHOS 288 #endif // TRANSCODER_H 289