1/* 2 * Copyright (C) 2023 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#include <climits> 17#include <iostream> 18#include <vector> 19#include "avmuxer_demo_runner.h" 20#include "avdemuxer_demo_runner.h" 21#include "avcodec_audio_decoder_inner_demo.h" 22#include "avcodec_audio_encoder_inner_demo.h" 23#include "avcodec_audio_decoder_demo.h" 24#include "avcodec_audio_aac_encoder_demo.h" 25#include "avcodec_audio_avbuffer_aac_encoder_demo.h" 26#include "avcodec_audio_avbuffer_amrnb_encoder_demo.h" 27#include "avcodec_audio_avbuffer_amrwb_encoder_demo.h" 28#include "avcodec_audio_avbuffer_decoder_inner_demo.h" 29#include "avcodec_audio_flac_encoder_demo.h" 30#include "avcodec_audio_avbuffer_flac_encoder_demo.h" 31#include "avcodec_audio_avbuffer_g711mu_encoder_demo.h" 32#include "avcodec_audio_avbuffer_mp3_encoder_demo.h" 33#include "avcodec_audio_avbuffer_lbvc_decoder_inner_demo.h" 34#include "avcodec_audio_avbuffer_lbvc_encoder_inner_demo.h" 35#include "avcodec_audio_opus_encoder_demo.h" 36#include "avcodec_audio_g711mu_encoder_demo.h" 37#include "codeclist_demo.h" 38#include "avcodec_video_decoder_demo.h" 39#include "avcodec_video_decoder_inner_demo.h" 40#include "avcodec_audio_avbuffer_decoder_demo.h" 41#include "avcodec_e2e_demo.h" 42#include "avcodec_e2e_demo_api10.h" 43 44using namespace OHOS; 45using namespace OHOS::MediaAVCodec; 46using namespace OHOS::MediaAVCodec::AudioDemo; 47using namespace OHOS::MediaAVCodec::AudioBufferDemo; 48using namespace OHOS::MediaAVCodec::AudioFlacDemo; 49using namespace OHOS::MediaAVCodec::AudioFlacEncDemo; // AudioEncoderBufferDemo 50using namespace OHOS::MediaAVCodec::AudioOpusDemo; 51using namespace OHOS::MediaAVCodec::AudioG711muDemo; 52using namespace OHOS::MediaAVCodec::AudioAvbufferG711muDemo; 53using namespace OHOS::MediaAVCodec::AudioAvbufferMp3EncoderDemo; 54using namespace OHOS::MediaAVCodec::AudioAacDemo; 55using namespace OHOS::MediaAVCodec::AudioAacEncDemo; 56using namespace OHOS::MediaAVCodec::InnerAudioDemo; 57using namespace OHOS::MediaAVCodec::VideoDemo; 58using namespace OHOS::MediaAVCodec::InnerVideoDemo; 59using namespace OHOS::MediaAVCodec::E2EDemo; 60using namespace OHOS::MediaAVCodec::InnerAudioDecoderLbvcDemo; 61using namespace OHOS::MediaAVCodec::InnerAudioEncoderLbvcDemo; 62using namespace OHOS::MediaAVCodec::AudioAvbufferAmrNbDemo; 63using namespace OHOS::MediaAVCodec::AudioAvbufferAmrWbDemo; 64using namespace std; 65 66static int RunAudioDecoder() 67{ 68 cout << "Please select number for format (default AAC Decoder): " << endl; 69 cout << "0: AAC" << endl; 70 cout << "1: FLAC" << endl; 71 cout << "2: MP3" << endl; 72 cout << "3: VORBIS" << endl; 73 cout << "4: AMRNB" << endl; 74 cout << "5: AMRWB" << endl; 75 cout << "6: OPUS" << endl; 76 cout << "7: G711MU" << endl; 77 string mode; 78 AudioFormatType audioFormatType = TYPE_AAC; 79 (void)getline(cin, mode); 80 if (mode == "" || mode == "0") { 81 audioFormatType = TYPE_AAC; 82 } else if (mode == "1") { 83 audioFormatType = TYPE_FLAC; 84 } else if (mode == "2") { 85 audioFormatType = TYPE_MP3; 86 } else if (mode == "3") { 87 audioFormatType = TYPE_VORBIS; 88 } else if (mode == "4") { 89 audioFormatType = TYPE_AMRNB; 90 } else if (mode == "5") { 91 audioFormatType = TYPE_AMRWB; 92 } else if (mode == "6") { 93 audioFormatType = TYPE_OPUS; 94 } else if (mode == "7") { 95 audioFormatType = TYPE_G711MU; 96 } else { 97 cout << "no that selection" << endl; 98 return 0; 99 } 100 auto audioDec = std::make_unique<ADecDemo>(); 101 audioDec->RunCase(audioFormatType); 102 cout << "demo audio decoder end" << endl; 103 return 0; 104} 105 106static int RunAudioAVBufferDecoder() 107{ 108 cout << "Please select number for format (default AAC Decoder): " << endl; 109 cout << "0: AAC" << endl; 110 cout << "1: FLAC" << endl; 111 cout << "2: MP3" << endl; 112 cout << "3: VORBIS" << endl; 113 cout << "4: AMR-NB" << endl; 114 cout << "5: AMR-WB" << endl; 115 cout << "6: G711MU" << endl; 116 cout << "7: APE" << endl; 117 118 string mode; 119 AudioBufferFormatType audioFormatType = AudioBufferFormatType::TYPE_AAC; 120 (void)getline(cin, mode); 121 if (mode == "" || mode == "0") { 122 audioFormatType = AudioBufferFormatType::TYPE_AAC; 123 } else if (mode == "1") { 124 audioFormatType = AudioBufferFormatType::TYPE_FLAC; 125 } else if (mode == "2") { 126 audioFormatType = AudioBufferFormatType::TYPE_MP3; 127 } else if (mode == "3") { 128 audioFormatType = AudioBufferFormatType::TYPE_VORBIS; 129 } else if (mode == "4") { 130 audioFormatType = AudioBufferFormatType::TYPE_AMRNB; 131 } else if (mode == "5") { 132 audioFormatType = AudioBufferFormatType::TYPE_AMRWB; 133 } else if (mode == "6") { 134 audioFormatType = AudioBufferFormatType::TYPE_G711MU; 135 } else if (mode == "7") { 136 audioFormatType = AudioBufferFormatType::TYPE_APE; 137 } else { 138 cout << "no that selection" << endl; 139 return 0; 140 } 141 auto audioDec = std::make_unique<ADecBufferDemo>(); 142 audioDec->RunCase(audioFormatType); 143 cout << "demo audio decoder end" << endl; 144 return 0; 145} 146 147static int RunAudioAVBufferDecoderDrm() 148{ 149 cout << "RunAudioAVBufferDecoderDrm" << endl; 150 cout << "Please select number for format (default AAC Decoder): " << endl; 151 cout << "0: AAC" << endl; 152 cout << "1: FLAC" << endl; 153 cout << "2: MP3" << endl; 154 155 string mode; 156 AudioBufferFormatType audioFormatType = AudioBufferFormatType::TYPE_AAC; 157 (void)getline(cin, mode); 158 if (mode == "" || mode == "0") { 159 audioFormatType = AudioBufferFormatType::TYPE_AAC; 160 } else if (mode == "1") { 161 audioFormatType = AudioBufferFormatType::TYPE_FLAC; 162 } else if (mode == "2") { 163 audioFormatType = AudioBufferFormatType::TYPE_MP3; 164 } else { 165 cout << "no that selection" << endl; 166 return 0; 167 } 168 auto audioDec = std::make_unique<ADecBufferDemo>(); 169 audioDec->RunDrmCase(audioFormatType); 170 cout << "demo audio decoder end" << endl; 171 return 0; 172} 173 174static int RunAudioEncoder() 175{ 176 cout << "Please select number for format (default AAC Encoder): " << endl; 177 cout << "0: AAC\n" << "1: FLAC" << endl; 178 cout << "2: OPUS" << endl; 179 cout << "3: G711MU" << endl; 180 cout << "4: AAC-API11" << endl; 181 cout << "5: FLAC-API11" << endl; 182 cout << "6: G711MU-API11" << endl; 183 cout << "7: AMR-NB-API11" << endl; 184 cout << "8: AMR-WB-API11" << endl; 185 cout << "9: MP3-API11" << endl; 186 string mode; 187 (void)getline(cin, mode); 188 if (mode == "" || mode == "0") { 189 auto audioEnc = std::make_unique<AEncAacDemo>(); 190 audioEnc->RunCase(); 191 } else if (mode == "1") { 192 auto audioEnc = std::make_unique<AEncFlacDemo>(); 193 audioEnc->RunCase(); 194 } else if (mode == "2") { 195 auto audioEnc = std::make_unique<AEncOpusDemo>(); 196 audioEnc->RunCase(); 197 } else if (mode == "3") { 198 auto audioEnc = std::make_unique<AEncG711muDemo>(); 199 audioEnc->RunCase(); 200 } else if (mode == "4") { 201 auto audioEnc = std::make_unique<AudioBufferAacEncDemo>(); 202 audioEnc->RunCase(); 203 } else if (mode == "5") { 204 auto audioEnc = std::make_unique<AudioBufferFlacEncDemo>(); 205 audioEnc->RunCase(); 206 } else if (mode == "6") { 207 auto audioEnc = std::make_unique<AEncAvbufferG711muDemo>(); 208 audioEnc->RunCase(); 209 } else if (mode == "7") { 210 auto audioEnc = std::make_unique<AEncAvbufferAmrNbDemo>(); 211 audioEnc->RunCase(); 212 } else if (mode == "8") { 213 auto audioEnc = std::make_unique<AEncAvbufferAmrWbDemo>(); 214 audioEnc->RunCase(); 215 } else if (mode == "9") { 216 auto audioEnc = std::make_unique<AEncAvbufferMp3Demo>(); 217 audioEnc->RunCase(); 218 } else { 219 cout << "no that selection" << endl; 220 return 0; 221 } 222 cout << "demo audio encoder end" << endl; 223 return 0; 224} 225 226static int RunAudioInnerDecoder() 227{ 228 cout << "Please select number for format (default AAC Decoder): " << endl; 229 cout << "0: AAC" << endl; 230 cout << "1: FLAC" << endl; 231 cout << "2: MP3" << endl; 232 cout << "3: VORBIS" << endl; 233 cout << "4: DecoderInner-API11" << endl; 234 cout << "5: LBVC" << endl; 235 string mode; 236 (void)getline(cin, mode); 237 if (mode == "" || mode == "0") { 238 auto audioDec = std::make_unique<ADecInnerDemo>(); 239 audioDec->RunCase(); 240 } else if (mode == "1") { 241 auto audioDec = std::make_unique<ADecInnerDemo>(); 242 audioDec->RunCase(); 243 } else if (mode == "2") { 244 auto audioDec = std::make_unique<ADecInnerDemo>(); 245 audioDec->RunCase(); 246 } else if (mode == "3") { 247 auto audioDec = std::make_unique<ADecInnerDemo>(); 248 audioDec->RunCase(); 249 } else if (mode == "4") { 250 auto audioDec = std::make_unique<AudioDecInnerAvBufferDemo>(); 251 audioDec->RunCase(); 252 } else if (mode == "5") { 253 auto audioDec = std::make_unique<AudioDecInnerAvBufferLbvcDemo>(); 254 audioDec->RunCase(); 255 } else { 256 cout << "no that selection" << endl; 257 return 0; 258 } 259 cout << "demo audio decoder end" << endl; 260 return 0; 261} 262 263static int RunAudioInnerEncoder() 264{ 265 cout << "Please select number for format (default AAC Encoder): " << endl; 266 cout << "0: AAC" << endl; 267 cout << "1: FLAC" << endl; 268 cout << "2: LBVC" << endl; 269 string mode; 270 (void)getline(cin, mode); 271 if (mode == "" || mode == "0") { 272 auto audioEnc = std::make_unique<AEnInnerDemo>(); 273 audioEnc->RunCase(); 274 } else if (mode == "1") { 275 auto audioEnc = std::make_unique<AEnInnerDemo>(); 276 audioEnc->RunCase(); 277 } else if (mode == "2") { 278 auto audioEnc = std::make_unique<AudioEncInnerAvBufferLbvcDemo>(); 279 audioEnc->RunCase(); 280 } else { 281 cout << "no that selection" << endl; 282 return 0; 283 } 284 cout << "demo audio encoder end" << endl; 285 return 0; 286} 287 288static int RunCodecList() 289{ 290 auto codecList = std::make_unique<CodecListDemo>(); 291 if (codecList == nullptr) { 292 cout << "codec list is null" << endl; 293 return 0; 294 } 295 codecList->RunCase(); 296 cout << "codec list end" << endl; 297 return 0; 298} 299 300static int RunVideoDecoder() 301{ 302 cout << "Please select number for output mode (default buffer mode): " << endl; 303 cout << "0: buffer" << endl; 304 cout << "1: surface file" << endl; 305 cout << "2: surface render" << endl; 306 cout << "3: switch surface" << endl; 307 308 string mode; 309 (void)getline(cin, mode); 310 if (mode != "0" && mode != "1" && mode != "2" && mode != "3") { 311 cout << "parameter invalid" << endl; 312 return 0; 313 } 314 315 auto videoDec = std::make_unique<VDecDemo>(); 316 if (videoDec == nullptr) { 317 cout << "video decoder is null" << endl; 318 return 0; 319 } 320 videoDec->RunCase(mode); 321 cout << "demo video decoder end" << endl; 322 return 0; 323} 324 325static int RunVideoDecoderDrm() 326{ 327 cout << "RunVideoDecoderDrm: " << endl; 328 cout << "Please select number for output mode (default buffer mode): " << endl; 329 cout << "0: buffer" << endl; 330 cout << "1: surface file" << endl; 331 cout << "2: surface render" << endl; 332 333 string mode; 334 (void)getline(cin, mode); 335 if (mode != "0" && mode != "1" && mode != "2") { 336 cout << "parameter invalid" << endl; 337 return 0; 338 } 339 340 auto videoDec = std::make_unique<VDecDemo>(); 341 if (videoDec == nullptr) { 342 cout << "video decoder is null" << endl; 343 return 0; 344 } 345 videoDec->RunDrmCase(); 346 cout << "demo video decoder end" << endl; 347 return 0; 348} 349 350static int RunVideoInnerDecoder() 351{ 352 cout << "Please select number for output mode (default buffer mode): " << endl; 353 cout << "0: buffer" << endl; 354 cout << "1: surface file" << endl; 355 cout << "2: surface render" << endl; 356 357 string mode; 358 (void)getline(cin, mode); 359 if (mode != "0" && mode != "1" && mode != "2") { 360 cout << "parameter invalid" << endl; 361 return 0; 362 } 363 364 auto videoDec = std::make_unique<VDecInnerDemo>(); 365 if (videoDec == nullptr) { 366 cout << "video decoder is null" << endl; 367 return 0; 368 } 369 videoDec->RunCase(mode); 370 cout << "demo video decoder end" << endl; 371 return 0; 372} 373 374static int RunE2EDemo() 375{ 376 cout << "Please select number for api version (default api11): " << endl; 377 cout << "0: api11" << endl; 378 cout << "1: api10" << endl; 379 380 string mode; 381 (void)getline(cin, mode); 382 if (mode != "0" && mode != "1") { 383 cout << "parameter invalid" << endl; 384 return 0; 385 } 386 const char *path = "/data/test/media/input.mp4"; 387 if (mode == "0") { 388 auto e2eDemo = std::make_unique<AVCodecE2EDemo>(path); 389 if (e2eDemo == nullptr) { 390 cout << "e2eDemo is null" << endl; 391 return 0; 392 } 393 e2eDemo->Configure(); 394 e2eDemo->Start(); 395 e2eDemo->WaitForEOS(); 396 e2eDemo->Stop(); 397 } else if (mode == "1") { 398 auto e2eDemo = std::make_unique<AVCodecE2EDemoAPI10>(path); 399 if (e2eDemo == nullptr) { 400 cout << "e2eDemo is null" << endl; 401 return 0; 402 } 403 e2eDemo->Configure(); 404 e2eDemo->Start(); 405 e2eDemo->WaitForEOS(); 406 e2eDemo->Stop(); 407 } 408 cout << "e2eDemo end" << endl; 409 return 0; 410} 411 412static void OptionPrint() 413{ 414 cout << "Please select a demo scenario number(default Audio Decoder): " << endl; 415 cout << "0:Audio Decoder" << endl; 416 cout << "1:Audio Encoder" << endl; 417 cout << "2:Audio Inner Decoder" << endl; 418 cout << "3:Audio Inner Encoder" << endl; 419 cout << "4:muxer demo" << endl; 420 cout << "6:codeclist" << endl; 421 cout << "7:Video Decoder" << endl; 422 cout << "8:Video Inner Decoder" << endl; 423 cout << "9:demuxer demo" << endl; 424 cout << "10:Audio AVBuffer Decoder" << endl; 425 cout << "11:Video Decoder DRM" << endl; 426 cout << "12:E2E demo" << endl; 427 cout << "13:Audio AVBuffer Decoder with DRM" << endl; 428} 429 430int main() 431{ 432 OptionPrint(); 433 string mode; 434 (void)getline(cin, mode); 435 if (mode == "" || mode == "0") { 436 (void)RunAudioDecoder(); 437 } else if (mode == "1") { 438 (void)RunAudioEncoder(); 439 } else if (mode == "2") { 440 (void)RunAudioInnerDecoder(); 441 } else if (mode == "3") { 442 (void)RunAudioInnerEncoder(); 443 } else if (mode == "4") { 444 (void)AVMuxerDemoCase(); 445 } else if (mode == "6") { 446 (void)RunCodecList(); 447 } else if (mode == "7") { 448 (void)RunVideoDecoder(); 449 } else if (mode == "8") { 450 (void)RunVideoInnerDecoder(); 451 } else if (mode == "9") { 452 (void)AVSourceDemuxerDemoCase(); 453 } else if (mode == "10") { 454 (void)RunAudioAVBufferDecoder(); 455 } else if (mode == "11") { 456 (void)RunVideoDecoderDrm(); 457 } else if (mode == "12") { 458 (void)RunE2EDemo(); 459 } else if (mode == "13") { 460 (void)RunAudioAVBufferDecoderDrm(); 461 } else { 462 cout << "no that selection" << endl; 463 } 464 return 0; 465} 466