1 /* 2 * Copyright (c) 2020-2021 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 /** 17 * @addtogroup format 18 * @{ 19 * 20 * @brief Defines format-related APIs. 21 * 22 * For example, you use this module to define custom data types and to initialize, create, 23 * destroy the muxer and demuxer, and set their parameters. Also, you can read demuxer data frames, 24 * select demuxer tracks, add muxer tracks, and write data frames into a container. 25 * 26 * @since 1.0 27 * @version 1.0 28 */ 29 30 /** 31 * @file format_interface.h 32 * 33 * @brief Declares format-related APIs. 34 * 35 * For example, you use the functions provided in this file to define custom data types and to initialize, 36 * create, destroy the muxer and demuxer, and set their parameters. Also, you can read demuxer data frames, 37 * select demuxer tracks, add muxer tracks, and write data frames into a container. 38 * 39 * @since 1.0 40 * @version 1.0 41 */ 42 43 #ifndef FORMAT_INTERFACE_H 44 #define FORMAT_INTERFACE_H 45 46 #include "format_type.h" 47 48 #ifdef __cplusplus 49 #if __cplusplus 50 extern "C" { 51 #endif 52 #endif /* __cplusplus */ 53 54 /** 55 * @brief Initializes the format. 56 * 57 * You can call this function to initialize the demuxer and muxer. 58 * This function should always be called before other format-specific functions, 59 * and it can be called only once within a process. 60 * 61 * @since 1.0 62 * @version 1.0 63 */ 64 void FormatInit(void); 65 66 /** 67 * @brief Deinitializes the format. 68 * 69 * You can call this function to deinitialize the demuxer and muxer. 70 * This function works in pair with {@link FormatInit}. 71 * 72 * @since 1.0 73 * @version 1.0 74 */ 75 void FormatDeInit(void); 76 77 /** 78 * @brief Creates a demuxer component and returns its context handle. 79 * 80 * This function returns the demuxer context handle without probing the container format or 81 * obtaining stream information. 82 * 83 * @param source Indicates the pointer to the format source of the demuxer. For details, see {@link FormatSource}. 84 * @param handle Indicates the double pointer to the demuxer context handle. 85 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise. 86 */ 87 int32_t FormatDemuxerCreate(const FormatSource *source, FormatHandle * const handle); 88 89 /** 90 * @brief Sets demuxer attributes. 91 * 92 * You can call this function to set the HTTP header, HTTP referer, and other extension items for the demuxer 93 * after {@link FormatDemuxerCreate} is called. 94 * 95 * @param handle Indicates the pointer to the demuxer context handle. 96 * @param trackId Identifies the track. If the value is an invalid value (<b>-1</b>), 97 * this parameter identifies the file or program. 98 * @param metaData Indicates the pointer to an array of key-value pairs representing parameter names and values. 99 * For details, see {@link ParameterItem}. 100 * @param metaDataCnt Indicates the number of key-value pairs in the array. 101 * This parameter works in pair with <b>metaData</b>. 102 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise. 103 * @since 1.0 104 * @version 1.0 105 */ 106 int32_t FormatDemuxerSetParameter(const FormatHandle handle, int32_t trackId, 107 const ParameterItem *metaData, int32_t metaDataCnt); 108 109 /** 110 * @brief Obtains demuxer attributes. 111 * 112 * You can call this function to obtain the HTTP header, HTTP referer, and other extension items for the demuxer 113 * after {@link FormatDemuxerCreate} is called. The demuxer will store the value in the <b>metaData</b> 114 * based on the key.If the demuxer has allocated memory for the <b>metaData</b> to store the value, 115 * the caller should manually free the memory. 116 * 117 * @param handle Indicates the pointer to the demuxer context handle. 118 * @param trackId Identifies the track. If the value is an invalid value (<b>-1</b>), 119 * this parameter identifies the file or program. 120 * @param metaData Indicates the pointer to the buffer for storing the parameters values 121 * that the demuxer has searched for based on the input key. For details, see {@link ParameterItem}. 122 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise. 123 * @since 1.0 124 * @version 1.0 125 */ 126 int32_t FormatDemuxerGetParameter(const FormatHandle handle, int32_t trackId, ParameterItem *metaData); 127 128 /** 129 * @brief Sets a callback for the demuxer. 130 * 131 * The callback will be invoked to notify the upper layer of internal events of the demuxer. 132 * 133 * @param handle Indicates the pointer to the demuxer context handle. 134 * @param callBack Indicates the pointer to the callback, as defined in {@link FormatCallback}. 135 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise. 136 * @since 1.0 137 * @version 1.0 138 */ 139 int32_t FormatDemuxerSetCallBack(const FormatHandle handle, const FormatCallback *callBack); 140 141 /** 142 * @brief Sets buffer information for the demuxer. 143 * 144 * If there is a buffer mechanism in the demuxer, you can call this function to set the maximum buffer size and time. 145 * Alternatively, you can disable the buffer mechanism by setting the buffer size and time to <b>0</b> in 146 * the <b>setting</b> parameter. If there is no buffer mechanism or the default setting is retained, 147 * you can skip this function. 148 * 149 * @param handle Indicates the pointer to the demuxer context handle. 150 * @param setting Indicates the pointer to the maximum demuxer buffer size and time, 151 * as defined in {@link FormatBufferSetting}. 152 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise. 153 */ 154 int32_t FormatDemuxerSetBufferConfig(const FormatHandle handle, const FormatBufferSetting *setting); 155 156 /** 157 * @brief Obtains the buffer information of the demuxer. 158 * 159 * If there is a buffer mechanism in the demuxer, you can call this function to obtain the maximum buffer size and time. 160 * 161 * @param handle Indicates the pointer to the demuxer context handle. 162 * @param setting Indicates the pointer to the maximum demuxer buffer size and time, 163 * as defined in {@link FormatBufferSetting}. 164 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise. 165 * @since 1.0 166 * @version 1.0 167 */ 168 int32_t FormatDemuxerGetBufferConfig(const FormatHandle handle, FormatBufferSetting *setting); 169 170 /** 171 * @brief Makes preparations for the demuxer. 172 * 173 * This function triggers the demuxer to probe the media file container format and parse stream information. 174 * You can obtain media file attributes only after this function is called. 175 * 176 * @param handle Indicates the pointer to the demuxer context handle. 177 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise. 178 * @since 1.0 179 * @version 1.0 180 */ 181 int32_t FormatDemuxerPrepare(const FormatHandle handle); 182 183 /** 184 * @brief Obtains the attributes of a media file. 185 * 186 * The attributes contain file, program, and stream attributes. 187 * This function should be called after {@link FormatDemuxerPrepare} is called. 188 * 189 * @param handle Indicates the pointer to the demuxer context handle. 190 * @param info Indicates the pointer to the source attributes, as defined in {@link FileInfo}. 191 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise. 192 * @since 1.0 193 * @version 1.0 194 */ 195 int32_t FormatDemuxerGetFileInfo(const FormatHandle handle, FileInfo *info); 196 197 /** 198 * @brief Selects a specified media track. 199 * 200 * The media tracks to select must belong to the same program. 201 * If you do not call this function, the default media tracks of the default program are selected. 202 * If <b>programId</b> is valid but <b>trackId</b> is invalid, the default media track of the specified program is used. 203 * 204 * @param handle Indicates the pointer to the demuxer context handle. 205 * @param programId Identifies the program. 206 * @param trackId Identifies the media track. If a valid value is passed, the media track must belong to 207 * the specified program. If an invalid value is passed, the default media track of the specified program is used. 208 * If multiple audio tracks are specified, the player determines which audio track to use. 209 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise. 210 * @since 1.0 211 * @version 1.0 212 */ 213 int32_t FormatDemuxerSelectTrack(const FormatHandle handle, int32_t programId, int32_t trackId); 214 215 /** 216 * @brief Unselects a specified media track from which the demuxer reads data frames. 217 * 218 * The demuxer can read all media tracks of the default program. You can call this function to 219 * unselect all or certain tracks of a specified program that the demuxer is expected not to read. 220 * If <b>trackId</b> is invalid, the demuxer will read none of the tracks of the specified program. 221 * 222 * @param handle Indicates the pointer to the demuxer context handle. 223 * @param programId Identifies the program. 224 * @param trackId Identifies the media track that the demuxer will unselect. 225 * This parameter works in pair with <b>programId</b>. If a valid value is passed, the media track must belong to 226 * the program specified by <b>programId</b>. If an invalid value is passed, and all media tracks of the specified 227 * program are unselected. 228 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise. 229 * @since 1.0 230 * @version 1.0 231 */ 232 int32_t FormatDemuxerUnselectTrack(const FormatHandle handle, int32_t programId, int32_t trackId); 233 234 /** 235 * @brief Starts the demuxer. 236 * 237 * After being started, the caller can read data frames from the demuxer. 238 * This function should be called after {@link FormatDemuxerPrepare} is called. 239 * 240 * @param handle Indicates the pointer to the demuxer context handle. 241 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise. 242 * @since 1.0 243 * @version 1.0 244 */ 245 int32_t FormatDemuxerStart(const FormatHandle handle); 246 247 /** 248 * @brief Obtains the ID of the media track selected by the demuxer for output. 249 * 250 * The demuxer automatically selects the default program and its media tracks. 251 * However, if the program and media tracks have changed after {@link FormatDemuxerSelectTrack} and 252 * {@link FormatDemuxerUnselectTrack} are called, you can obtain the currently selected program and media tracks 253 * by calling this function (<b>FormatDemuxerGetSelectedTrack</b>. 254 * 255 * @param handle Indicates the pointer to the demuxer context handle. 256 * @param programId Identifies the pointer to the program. 257 * @param trackId Identifies the array of selected media tracks. This parameter works in pair with <b>nums</b>. 258 * @param nums Indicates the pointer to the total number of selected media tracks. 259 * This parameter works in pair with <b>trackId</b>. 260 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise. 261 * @since 1.0 262 * @version 1.0 263 */ 264 int32_t FormatDemuxerGetSelectedTrack(const FormatHandle handle, int32_t *programId, int32_t trackId[], int32_t *nums); 265 266 /** 267 * @brief Reads data frames. 268 * 269 * After the data frames are read, 270 * you need to call {@link FormatDemuxerFreeFame} to free them. 271 * 272 * @param handle Indicates the pointer to the demuxer context handle. 273 * @param frame Indicates the pointer to the data structure {@link FormatFrame}. 274 * @param timeOutMs Indicates the time required for waiting data frame read. 275 * The value <b>0</b> indicates that data frames are immediately read without any wait. 276 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise. 277 * @since 1.0 278 * @version 1.0 279 */ 280 int32_t FormatDemuxerReadFrame(const FormatHandle handle, FormatFrame *frame, int32_t timeOutMs); 281 282 /** 283 * @brief Frees data frames. 284 * 285 * You can call this function to free the data frames obtained by calling {@link FormatDemuxerReadFrame}. 286 * 287 * @param handle Indicates the pointer to the demuxer context handle. 288 * @param frame Indicates the pointer to the data structure {@link FormatFrame}. 289 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise. 290 * @since 1.0 291 * @version 1.0 292 */ 293 int32_t FormatDemuxerFreeFrame(const FormatHandle handle, FormatFrame *frame); 294 295 /** 296 * @brief Seeks for a specified position for the demuxer. 297 * 298 * After being started, the demuxer seeks for a specified position to read data frames. 299 * You can specify the position close to the time specified by <b>streamIndex</b>. 300 * 301 * @param handle Indicates the pointer to the demuxer context handle. 302 * @param streamIndex Identifies the stream in the media file. 303 * @param timeStampUs Indicates the target position, in microseconds. 304 * @param mode Indicates the seek mode, as defined in {@link FormatSeekMode}. 305 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise. 306 * @since 1.0 307 * @version 1.0 308 */ 309 int32_t FormatDemuxerSeek(const FormatHandle handle, int32_t streamIndex, int64_t timeStampUs, FormatSeekMode mode); 310 311 /** 312 * @brief Stops the demuxer from working. 313 * 314 * After this function is called, the demuxer cannot resume decapsulation. 315 * 316 * @param handle Indicates the pointer to the demuxer context handle. 317 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise. 318 * @since 1.0 319 * @version 1.0 320 */ 321 int32_t FormatDemuxerStop(const FormatHandle handle); 322 323 /** 324 * @brief Destroys demuxer resources. 325 * 326 * This function works in pair with {@link FormatDemuxerCreate}. 327 * If you do not call this function, resource leakage may occur. 328 * 329 * @param handle Indicates the pointer to the demuxer context handle. 330 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise. 331 * @since 1.0 332 * @version 1.0 333 */ 334 int32_t FormatDemuxerDestroy(const FormatHandle handle); 335 336 /** 337 * @brief Creates a muxer and returns its context handle. 338 * 339 * @param handle Indicates the double pointer to the muxer context handle. 340 * @param outputConfig Indicates the pointer to the muxer output configuration, 341 * as defined in {@link FormatOutputConfig}. 342 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise. 343 * @since 1.0 344 * @version 1.0 345 */ 346 int32_t FormatMuxerCreate(FormatHandle * const handle, const FormatOutputConfig *outputConfig); 347 348 /** 349 * @brief Destroys a muxer and releases its resources created by calling {@link FormatMuxerCreate}. 350 * 351 * @param handle Indicates the pointer to the muxer context handle. 352 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise. 353 * @since 1.0 354 * @version 1.0 355 */ 356 int32_t FormatMuxerDestroy(const FormatHandle handle); 357 358 /** 359 * @brief Adds a media track source for the muxer. For details about track sources, see {@link TrackSource}. 360 * 361 * This function must be called after {@link FormatMuxerCreate} is successfully called and 362 * before {@link FormatMuxerStart} is called. 363 * 364 * @param handle Indicates the pointer to the muxer context handle. 365 * @param trackSource Indicates the pointer to the track source. 366 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise. 367 * @since 1.0 368 * @version 1.0 369 */ 370 int32_t FormatMuxerAddTrack(const FormatHandle handle, const TrackSource *trackSource); 371 372 /** 373 * @brief Sets a callback for the muxer. For details about the callback, see {@link FormatCallback}. 374 * 375 * This function should be called after {@link FormatMuxerCreate} is successfully called. 376 * 377 * @param handle Indicates the pointer to the muxer context handle. 378 * @param FormatCallback Indicates the pointer to the muxer callback to set. 379 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise. 380 * @since 1.0 381 * @version 1.0 382 */ 383 int32_t FormatMuxerSetCallBack(const FormatHandle handle, const FormatCallback *callBack); 384 385 /** 386 * @brief Sets the orientation of the video track for the muxer. 387 * 388 * This function should be called after {@link FormatMuxerAddTrack} is successfully called. 389 * The following degrees are supported: 0, 90, 180, and 270. 390 * 391 * @param handle Indicates the pointer to the muxer context handle. 392 * @param degrees Indicates the clockwise angle of the video track. 393 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise. 394 * @since 1.0 395 * @version 1.0 396 */ 397 int32_t FormatMuxerSetOrientation(const FormatHandle handle, int degrees); 398 399 /** 400 * @brief Sets the geographical information for the output file of the muxer. 401 * 402 * This function should be called after {@link FormatMuxerCreate} is successfully called. 403 * 404 * @param handle Indicates the pointer to the muxer context handle. 405 * @param latitude Indicates the latitude, within the range [-90,90]. 406 * @param longitude Indicates the longitude, within the range [-180,180]. 407 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise. 408 * @since 1.0 409 * @version 1.0 410 */ 411 int32_t FormatMuxerSetLocation(const FormatHandle handle, int latitude, int longitude); 412 413 /** 414 * @brief Sets the maximum size (in bytes) for the output file of the muxer. 415 * 416 * This function should be called after {@link FormatMuxerCreate} is successfully called. 417 * 418 * @param handle Indicates the pointer to the muxer context handle. 419 * @param bytes Indicates the maximum size of a file, in bytes. If the value is <b>0</b> or negative, 420 * the operation fails and the maximum size does not take effect. In this case, the maximum size of a single file 421 * supported by the current file system is used as the value of this parameter. 422 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise. 423 * @since 1.0 424 * @version 1.0 425 */ 426 int32_t FormatMuxerSetMaxFileSize(const FormatHandle handle, int64_t bytes); 427 428 /** 429 * @brief Sets the maximum duration (in seconds) for the output file. 430 * 431 * You need to call this function before calling {@link FormatMuxerStart}. If the maximum duration you set is valid 432 * and capturing is approaching 90% of that duration or the remaining duration is 1s, the message 433 * {@link MUXER_INFO_MAX_DURATION_APPROACHING} is reported via {@link OnInfo} of {@link FormatCallback}. If the output 434 * file has been set by calling {@link FormatMuxerCreate}, you need to call {@link FormatMuxerSetNextOutputFile} 435 * to set the next output file. Otherwise, the current output file will be overwritten when the capturing reaches 436 * the maximum duration you set. 437 * 438 * @param handle Indicates the pointer to the muxer context handle. 439 * @param duration Indicates the maximum duration to set, in seconds. If the value is <b>0</b> or negative, 440 * the operation fails. In this case, the default duration (60 seconds) will be used. 441 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise. 442 * @since 1.0 443 * @version 1.0 444 */ 445 int32_t FormatMuxerSetMaxFileDuration(const FormatHandle handle, int64_t durationUs); 446 447 /** 448 * @brief Manually splits a file. 449 * 450 * This function can be called after {@link FormatMuxerStart} is called. Once this function is called, 451 * the file is split based on the manual split type. After manual split is complete, file split will proceed to 452 * use the initially set split type. You can call this function again only after 453 * the {@link MUXER_INFO_FILE_SPLIT_FINISHED} event is reported. 454 * 455 * @param handle Indicates the pointer to the muxer context handle. 456 * @param type Indicates the file split type, as defined in {@link FileSplitType}. 457 * @param timestamp Indicates the file split timestamp. This parameter is not supported currently. 458 * The value <b>¨C1</b> indicates that the file is split at the time this function is called. 459 * @param duration Indicates the period from the file split time to the time the next output file starts. 460 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise. 461 * @since 1.0 462 * @version 1.0 463 */ 464 int32_t FormatMuxerSetFileSplitDuration(const FormatHandle handle, ManualSplitType type, 465 int64_t timestampUs, uint32_t durationUs); 466 467 /** 468 * @brief Starts the muxer. 469 * 470 * You can call this function to encapsulate media data after the muxer is created, media tracks are added, 471 * and related parameters are set. 472 * 473 * @param handle Indicates the pointer to the muxer context handle. 474 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise. 475 * @since 1.0 476 * @version 1.0 477 */ 478 int32_t FormatMuxerStart(FormatHandle handle); 479 480 /** 481 * @brief Writes data frames into the muxer. 482 * 483 * This function should be called after {@link FormatMuxerCreate} is successfully called. 484 * 485 * @param handle Indicates the pointer to the muxer context handle. 486 * @param frameData Indicates the pointer to the data structure {@link FormatFrame}. 487 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise. 488 * @since 1.0 489 * @version 1.0 490 */ 491 int32_t FormatMuxerWriteFrame(const FormatHandle handle, const FormatFrame *frameData); 492 493 /** 494 * @brief Sets the descriptor for the next output file. 495 * 496 * If {@link FormatMuxerCreate} is successfully called and the file descriptor involved is valid, you can call 497 * this function (<b>FormatMuxerSetNextOutputFile</b>) upon receiving the message 498 * {@link MUXER_INFO_MAX_FILESIZE_APPROACHING} or {@link MUXER_INFO_MAX_DURATION_APPROACHING}. 499 * 500 * @param handle Indicates the pointer to the muxer context handle. 501 * @param fd Indicates the file descriptor to set. 502 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise. 503 * @since 1.0 504 * @version 1.0 505 */ 506 int32_t FormatMuxerSetNextOutputFile(const FormatHandle handle, int32_t fd); 507 508 /** 509 * @brief Stops the muxer that was started by calling {@link FormatMuxerStart}. 510 * 511 * @param handle Indicates the pointer to the muxer context handle. 512 * @param block Indicates how to stop the muxer. The value <b>true</b> indicates that the muxer is stopped 513 * after all buffered data is processed, and <b>false</b> indicates that the buffered data is discarded and 514 * the muxer is immediately stopped. 515 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise. 516 * @since 1.0 517 * @version 1.0 518 */ 519 int32_t FormatMuxerStop(const FormatHandle handle, bool block); 520 521 /** 522 * @brief Sets muxer attributes. 523 * 524 * This is an extended function that can be used to add MP4-dedicated boxes and tags (such as <b>exif</b>). 525 * 526 * @param handle Indicates the pointer to the muxer context handle. 527 * @param trackId Identifies the media track. If the value is {@link FORMAT_INVALID_TRACK_ID}, 528 * this function sets the muxer attributes. 529 * @param item Indicates the pointer to the items carrying muxer attributes. You can specify multiple items at a time 530 * in this parameter, which works in pair with <b>itemNum</b>. 531 * @param itemNum Indicates the number of attributes set at a time. 532 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise. 533 * @since 1.0 534 * @version 1.0 535 */ 536 int32_t FormatMuxerSetParameter(const FormatHandle handle, int32_t trackId, const ParameterItem *item, 537 int32_t itemNum); 538 539 /** 540 * @brief Obtains muxer attributes. 541 * 542 * This is an extended function that can be used to obtain muxer or track attributes. 543 * The demuxer then obtains the muxer attributes based on the key contained in <b>item</b>. 544 * 545 * @param handle Indicates the pointer to the muxer context handle. 546 * @param trackId Identifies the media track. If the value is {@link FORMAT_INVALID_TRACK_ID}, 547 * this function obtains the muxer attributes. 548 * @param item Indicates the pointer to the items carrying muxer attributes. You can specify multiple items at a time 549 * in this parameter, which works in pair with <b>itemNum</b>. 550 * @param itemNum Indicates the number of attributes set at a time. 551 * @return Returns <b>0</b> if the operation is successful; returns a non-zero value if any requested attribute 552 * fails to be obtained or is not found. 553 * @since 1.0 554 * @version 1.0 555 */ 556 int32_t FormatMuxerGetParameter(const FormatHandle handle, int32_t trackId, ParameterItem *item, int32_t itemNum); 557 558 #ifdef __cplusplus 559 #if __cplusplus 560 } 561 #endif 562 #endif /* __cplusplus */ 563 564 #endif // FORMAT_INTERFACE_H 565 /** @} */