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 #include "avmuxer_demo_base.h"
16 #include <unistd.h>
17 #include <iostream>
18 #include <fstream>
19 #include "avcodec_errors.h"
20
21 namespace {
22 constexpr int MODE_ZERO = 0;
23 constexpr int MODE_ONE = 1;
24 constexpr int MODE_TWO = 2;
25 constexpr int MODE_THREE = 3;
26 constexpr int MODE_FOUR = 4;
27 constexpr int MODE_FIVE = 5;
28 constexpr int MODE_SIX = 6;
29 constexpr int CONFIG_BUFFER_SZIE = 0x1FFF;
30 }
31
32 namespace OHOS {
33 namespace MediaAVCodec {
34 const AudioTrackParam *AVMuxerDemoBase::audioParams_ = nullptr;
35 const VideoTrackParam *AVMuxerDemoBase::videoParams_ = nullptr;
36 const VideoTrackParam *AVMuxerDemoBase::coverParams_ = nullptr;
37 std::string AVMuxerDemoBase::videoType_ = std::string("");
38 std::string AVMuxerDemoBase::audioType_ = std::string("");
39 std::string AVMuxerDemoBase::coverType_ = std::string("");
40 std::string AVMuxerDemoBase::format_ = std::string("");
41 Plugins::OutputFormat AVMuxerDemoBase::outputFormat_ = Plugins::OutputFormat::DEFAULT;
42 bool AVMuxerDemoBase::hasSetMode_ = false;
43 using namespace OHOS::Media;
44
AVMuxerDemoBase()45 AVMuxerDemoBase::AVMuxerDemoBase()
46 {
47 }
48
OpenFile(const std::string & filePath)49 std::shared_ptr<std::ifstream> OpenFile(const std::string &filePath)
50 {
51 auto file = std::make_shared<std::ifstream>();
52 file->open(filePath, std::ios::in | std::ios::binary);
53 if (file->is_open()) {
54 return file;
55 }
56
57 return nullptr;
58 }
59
SelectFormatMode()60 void AVMuxerDemoBase::SelectFormatMode()
61 {
62 int num;
63 std::cout<<"\nplease select muxer type: 0.mp4 1.m4a 2.amr 3.mp3 4.wav 5.aac"<<std::endl;
64 std::cin>>num;
65 switch (num) {
66 case MODE_ZERO:
67 format_ = "mp4";
68 outputFormat_ = Plugins::OutputFormat::MPEG_4;
69 break;
70 case MODE_ONE:
71 format_ = "m4a";
72 outputFormat_ = Plugins::OutputFormat::M4A;
73 break;
74 case MODE_TWO:
75 format_ = "amr";
76 outputFormat_ = Plugins::OutputFormat::AMR;
77 break;
78 case MODE_THREE:
79 format_ = "mp3";
80 outputFormat_ = Plugins::OutputFormat::MP3;
81 break;
82 case MODE_FOUR:
83 format_ = "wav";
84 outputFormat_ = Plugins::OutputFormat::WAV;
85 break;
86 case MODE_FIVE:
87 format_ = "aac";
88 outputFormat_ = Plugins::OutputFormat::AAC;
89 break;
90 default:
91 format_ = "mp4";
92 outputFormat_ = Plugins::OutputFormat::MPEG_4;
93 break;
94 }
95 }
96
SelectAudioMode()97 void AVMuxerDemoBase::SelectAudioMode()
98 {
99 int num;
100 std::cout<<"\nplease select audio file: 0.noAudio 1.aac 2.mpeg 3.amrnb 4.amrwb 5.g711mu 6.raw"<<std::endl;
101 std::cin>>num;
102 switch (num) {
103 case MODE_ZERO:
104 audioType_ = "noAudio";
105 audioParams_ = nullptr;
106 break;
107 case MODE_ONE:
108 audioType_ = "aac";
109 audioParams_ = &g_audioAacPar;
110 break;
111 case MODE_TWO:
112 audioType_ = "mpeg";
113 audioParams_ = &g_audioMpegPar;
114 break;
115 case MODE_THREE:
116 audioType_ = "amr";
117 audioParams_ = &g_audioAmrNbPar;
118 break;
119 case MODE_FOUR:
120 audioType_ = "amr";
121 audioParams_ = &g_audioAmrWbPar;
122 break;
123 case MODE_FIVE:
124 audioType_ = "wav";
125 audioParams_ = &g_audioG711MUPar;
126 break;
127 case MODE_SIX:
128 audioType_ = "wav";
129 audioParams_ = &g_audioRawPar;
130 break;
131 default:
132 audioType_ = "noAudio";
133 audioParams_ = nullptr;
134 std::cout<<"do not support audio type index: "<<num<<", set to noAudio"<<std::endl;
135 break;
136 }
137 }
138
SelectVideoMode()139 void AVMuxerDemoBase::SelectVideoMode()
140 {
141 int num;
142 std::cout<<"please select video file:0.noVideo 1.h264 2.mpeg4 3.h265 4.hdr vivid"<<std::endl;
143 std::cin>>num;
144 switch (num) {
145 case MODE_ZERO:
146 videoType_ = "noVideo";
147 videoParams_ = nullptr;
148 break;
149 case MODE_ONE:
150 videoType_ = "h264";
151 videoParams_ = &g_videoH264Par;
152 break;
153 case MODE_TWO:
154 videoType_ = "mpeg4";
155 videoParams_ = &g_videoMpeg4Par;
156 break;
157 case MODE_THREE:
158 videoType_ = "h265";
159 videoParams_ = &g_videoH265Par;
160 break;
161 case MODE_FOUR:
162 videoType_ = "hdr-vivid";
163 videoParams_ = &g_videoHdrPar;
164 break;
165 default:
166 videoType_ = "noVideo";
167 videoParams_ = nullptr;
168 std::cout<<"do not support video type index: "<<", set to noVideo"<<num<<std::endl;
169 break;
170 }
171 }
172
SelectCoverMode()173 void AVMuxerDemoBase::SelectCoverMode()
174 {
175 int num;
176 std::cout<<"please select cover file:0.NoCover 1.jpg 2.png 3.bmp"<<std::endl;
177 std::cin>>num;
178 switch (num) {
179 case MODE_ZERO:
180 coverType_ = "noCover";
181 coverParams_ = nullptr;
182 break;
183 case MODE_ONE:
184 coverType_ = "jpg";
185 coverParams_ = &g_jpegCoverPar;
186 break;
187 case MODE_TWO:
188 coverType_ = "png";
189 coverParams_ = &g_pngCoverPar;
190 break;
191 case MODE_THREE:
192 coverType_ = "bmp";
193 coverParams_ = &g_bmpCoverPar;
194 break;
195 default:
196 coverType_ = "noCover";
197 coverParams_ = nullptr;
198 std::cout<<"do not support cover type index: "<<", set to noCover"<<num<<std::endl;
199 break;
200 }
201 }
202
SelectMode()203 int AVMuxerDemoBase::SelectMode()
204 {
205 if (hasSetMode_) {
206 return 0;
207 }
208 SelectFormatMode();
209 SelectAudioMode();
210 SelectVideoMode();
211 SelectCoverMode();
212
213 hasSetMode_ = true;
214 return 0;
215 }
216
SelectModeAndOpenFile()217 int AVMuxerDemoBase::SelectModeAndOpenFile()
218 {
219 if (SelectMode() != 0) {
220 return -1;
221 }
222
223 if (audioParams_ != nullptr) {
224 audioFile_ = OpenFile(audioParams_->fileName);
225 if (audioFile_ == nullptr) {
226 std::cout<<"open audio file failed! file name:"<<audioParams_->fileName<<std::endl;
227 return -1;
228 }
229 std::cout<<"open audio file success! file name:"<<audioParams_->fileName<<std::endl;
230 }
231
232 if (videoParams_ != nullptr) {
233 videoFile_ = OpenFile(videoParams_->fileName);
234 if (videoFile_ == nullptr) {
235 std::cout<<"open video file failed! file name:"<<videoParams_->fileName<<std::endl;
236 Reset();
237 return -1;
238 }
239 std::cout<<"video file success! file name:"<<videoParams_->fileName<<std::endl;
240 }
241
242 if (coverParams_ != nullptr) {
243 coverFile_ = OpenFile(coverParams_->fileName);
244 if (coverFile_ == nullptr) {
245 std::cout<<"open cover file failed! file name:"<<coverParams_->fileName<<std::endl;
246 Reset();
247 return -1;
248 }
249 std::cout<<"cover file success! file name:"<<coverParams_->fileName<<std::endl;
250 }
251 return 0;
252 }
253
Reset()254 void AVMuxerDemoBase::Reset()
255 {
256 if (outFd_ > 0) {
257 close(outFd_);
258 outFd_ = -1;
259 }
260 if (audioFile_ != nullptr) {
261 audioFile_->close();
262 audioFile_ = nullptr;
263 }
264 if (videoFile_ != nullptr) {
265 videoFile_->close();
266 videoFile_ = nullptr;
267 }
268 if (coverFile_ != nullptr) {
269 coverFile_->close();
270 coverFile_ = nullptr;
271 }
272 }
273
RunCase()274 void AVMuxerDemoBase::RunCase()
275 {
276 if (SelectModeAndOpenFile() != 0) {
277 return;
278 }
279
280 DoRunMuxer();
281
282 Reset();
283 }
284
RunMultiThreadCase()285 void AVMuxerDemoBase::RunMultiThreadCase()
286 {
287 std::cout<<"==== start AVMuxerDemoBase::RunMultiThreadCase ==="<<std::endl;
288 if (SelectModeAndOpenFile() != 0) {
289 return;
290 }
291
292 DoRunMultiThreadCase();
293
294 Reset();
295 }
296
WriteSingleTrackSample(uint32_t trackId,std::shared_ptr<std::ifstream> file)297 void AVMuxerDemoBase::WriteSingleTrackSample(uint32_t trackId, std::shared_ptr<std::ifstream> file)
298 {
299 if (file == nullptr) {
300 std::cout<<"AVMuxerDemoBase::WriteTrackSample file is nullptr"<<std::endl;
301 return;
302 }
303 std::shared_ptr<AVBuffer> buffer = nullptr;
304 bool ret = ReadSampleDataInfo(file, buffer);
305 while (ret) {
306 if (DoWriteSample(trackId, buffer) != AVCS_ERR_OK) {
307 std::cout<<"WriteSample failed"<<std::endl;
308 break;
309 }
310 ret = ReadSampleDataInfo(file, buffer);
311 }
312 }
313
WriteSingleTrackSampleByBufferQueue(sptr<AVBufferQueueProducer> bufferQueue,std::shared_ptr<std::ifstream> file)314 void AVMuxerDemoBase::WriteSingleTrackSampleByBufferQueue(sptr<AVBufferQueueProducer> bufferQueue,
315 std::shared_ptr<std::ifstream> file)
316 {
317 if (file == nullptr) {
318 std::cout<<"AVMuxerDemoBase::WriteSingleTrackSampleByBufferQueue file is nullptr"<<std::endl;
319 return;
320 }
321 std::shared_ptr<AVBuffer> buffer = nullptr;
322 if (bufferQueue == nullptr) {
323 std::cout<<"AVMuxerDemoBase::WriteSingleTrackSampleByBufferQueue buffer queue is nullptr"<<std::endl;
324 return;
325 }
326 bool ret = ReadSampleDataInfoByBufferQueue(file, buffer, bufferQueue);
327 while (ret) {
328 if (bufferQueue->PushBuffer(buffer, true) != Status::OK) {
329 std::cout<<"BufferQueue PushBuffer failed"<<std::endl;
330 break;
331 }
332 ret = ReadSampleDataInfoByBufferQueue(file, buffer, bufferQueue);
333 }
334 }
335
ReadSampleDataInfo(std::shared_ptr<std::ifstream> file,std::shared_ptr<AVBuffer> & buffer)336 bool AVMuxerDemoBase::ReadSampleDataInfo(std::shared_ptr<std::ifstream> file,
337 std::shared_ptr<AVBuffer> &buffer)
338 {
339 int64_t pts = 0;
340 uint32_t flags = 0;
341 int32_t size = 0;
342 if (file->eof()) {
343 return false;
344 }
345 file->read(reinterpret_cast<char*>(&pts), sizeof(pts));
346
347 if (file->eof()) {
348 return false;
349 }
350 file->read(reinterpret_cast<char*>(&flags), sizeof(flags));
351
352 if (file->eof()) {
353 return false;
354 }
355 file->read(reinterpret_cast<char*>(&size), sizeof(size));
356
357 if (file->eof()) {
358 return false;
359 }
360 if (buffer == nullptr || buffer->memory_ == nullptr || buffer->memory_->GetCapacity() < size) {
361 auto alloc = AVAllocatorFactory::CreateSharedAllocator(MemoryFlag::MEMORY_READ_WRITE);
362 buffer = AVBuffer::CreateAVBuffer(alloc, size);
363 }
364 file->read(reinterpret_cast<char*>(buffer->memory_->GetAddr()), size);
365 buffer->pts_ = pts;
366 buffer->flag_ = flags;
367 buffer->memory_->SetSize(size);
368 return true;
369 }
370
ReadSampleDataInfoByBufferQueue(std::shared_ptr<std::ifstream> file,std::shared_ptr<AVBuffer> & buffer,sptr<AVBufferQueueProducer> bufferQueue)371 bool AVMuxerDemoBase::ReadSampleDataInfoByBufferQueue(std::shared_ptr<std::ifstream> file,
372 std::shared_ptr<AVBuffer> &buffer, sptr<AVBufferQueueProducer> bufferQueue)
373 {
374 int64_t pts = 0;
375 uint32_t flags = 0;
376 int32_t size = 0;
377 if (file->eof()) {
378 return false;
379 }
380 file->read(reinterpret_cast<char*>(&pts), sizeof(pts));
381
382 if (file->eof()) {
383 return false;
384 }
385 file->read(reinterpret_cast<char*>(&flags), sizeof(flags));
386
387 if (file->eof()) {
388 return false;
389 }
390 file->read(reinterpret_cast<char*>(&size), sizeof(size));
391
392 if (file->eof()) {
393 return false;
394 }
395 if (bufferQueue == nullptr) {
396 return false;
397 }
398 AVBufferConfig config;
399 config.size = size;
400 config.memoryType = MemoryType::VIRTUAL_MEMORY;
401 bufferQueue->RequestBuffer(buffer, config, -1);
402 file->read(reinterpret_cast<char*>(buffer->memory_->GetAddr()), size);
403 buffer->pts_ = pts;
404 buffer->flag_ = flags;
405 buffer->memory_->SetSize(size);
406 return true;
407 }
408
WriteAvTrackSample()409 void AVMuxerDemoBase::WriteAvTrackSample()
410 {
411 if (audioFile_ == nullptr || videoFile_ == nullptr) {
412 return;
413 }
414 std::shared_ptr<AVBuffer> audioBuffer = nullptr;
415 std::shared_ptr<AVBuffer> videoBuffer = nullptr;
416 bool audioRet = ReadSampleDataInfo(audioFile_, audioBuffer);
417 bool videoRet = ReadSampleDataInfo(videoFile_, videoBuffer);
418 bool isOver = false;
419 while (!isOver && (audioRet || videoRet)) {
420 int ret = AVCS_ERR_OK;
421 if (audioRet && videoRet && audioBuffer->pts_ <= videoBuffer->pts_) {
422 ret = DoWriteSample(audioTrackId_, audioBuffer);
423 audioRet = ReadSampleDataInfo(audioFile_, audioBuffer);
424 } else if (audioRet && videoRet) {
425 ret = DoWriteSample(videoTrackId_, videoBuffer);
426 videoRet = ReadSampleDataInfo(videoFile_, videoBuffer);
427 } else if (audioRet) {
428 ret = DoWriteSample(audioTrackId_, audioBuffer);
429 isOver = true;
430 } else {
431 ret = DoWriteSample(videoTrackId_, videoBuffer);
432 isOver = true;
433 }
434 if (ret != AVCS_ERR_OK) {
435 std::cout<<"WriteSample failed"<<std::endl;
436 break;
437 }
438 }
439 }
440
WriteAvTrackSampleByBufferQueue()441 void AVMuxerDemoBase::WriteAvTrackSampleByBufferQueue()
442 {
443 if (audioFile_ == nullptr || videoFile_ == nullptr) {
444 std::cout<<"WriteAvTrackSampleByBufferQueue file is null"<<std::endl;
445 return;
446 }
447 if (audioBufferQueue_ == nullptr || videoBufferQueue_ == nullptr) {
448 std::cout<<"WriteAvTrackSampleByBufferQueue buffer queue is null"<<std::endl;
449 return;
450 }
451 std::shared_ptr<AVBuffer> audioBuffer = nullptr;
452 std::shared_ptr<AVBuffer> videoBuffer = nullptr;
453 bool audioRet = ReadSampleDataInfoByBufferQueue(audioFile_, audioBuffer, audioBufferQueue_);
454 bool videoRet = ReadSampleDataInfoByBufferQueue(videoFile_, videoBuffer, videoBufferQueue_);
455 bool isOver = false;
456 Status ret = Status::OK;
457 while (!isOver && (audioRet || videoRet)) {
458 if (audioRet && videoRet && audioBuffer->pts_ <= videoBuffer->pts_) {
459 ret = audioBufferQueue_->PushBuffer(audioBuffer, true);
460 audioRet = ReadSampleDataInfoByBufferQueue(audioFile_, audioBuffer, audioBufferQueue_);
461 } else if (audioRet && videoRet) {
462 ret = videoBufferQueue_->PushBuffer(videoBuffer, true);
463 videoRet = ReadSampleDataInfoByBufferQueue(videoFile_, videoBuffer, videoBufferQueue_);
464 } else if (audioRet) {
465 ret = audioBufferQueue_->PushBuffer(audioBuffer, true);
466 isOver = true;
467 } else {
468 ret = videoBufferQueue_->PushBuffer(videoBuffer, true);
469 isOver = true;
470 }
471 if (ret != Status::OK) {
472 std::cout<<"BufferQueue PushBuffer failed"<<std::endl;
473 break;
474 }
475 }
476 }
477
WriteTrackSample()478 void AVMuxerDemoBase::WriteTrackSample()
479 {
480 if (audioFile_ != nullptr && videoFile_ != nullptr && audioTrackId_ >= 0 && videoTrackId_ >= 0) {
481 std::cout<<"AVMuxerDemoBase::WriteTrackSample write AUDIO and VIDEO sample"<<std::endl;
482 std::cout<<"audio trackId:"<<audioTrackId_<<" video trackId:"<<videoTrackId_<<std::endl;
483 WriteAvTrackSample();
484 } else if (audioFile_ != nullptr && audioTrackId_ >= 0) {
485 std::cout<<"AVMuxerDemoBase::WriteTrackSample write AUDIO sample"<<std::endl;
486 WriteSingleTrackSample(audioTrackId_, audioFile_);
487 } else if (videoFile_ != nullptr && videoTrackId_ >= 0) {
488 std::cout<<"AVMuxerDemoBase::WriteTrackSample write VIDEO sample"<<std::endl;
489 WriteSingleTrackSample(videoTrackId_, videoFile_);
490 } else {
491 std::cout<<"AVMuxerDemoBase::WriteTrackSample don't write AUDIO and VIDEO track!!"<<std::endl;
492 }
493 }
494
WriteTrackSampleByBufferQueue()495 void AVMuxerDemoBase::WriteTrackSampleByBufferQueue()
496 {
497 if (audioFile_ != nullptr && videoFile_ != nullptr && audioTrackId_ >= 0 && videoTrackId_ >= 0) {
498 std::cout<<"AVMuxerDemoBase::WriteTrackSampleByBufferQueue write AUDIO and VIDEO sample"<<std::endl;
499 std::cout<<"audio trackId:"<<audioTrackId_<<" video trackId:"<<videoTrackId_<<std::endl;
500 WriteAvTrackSampleByBufferQueue();
501 } else if (audioFile_ != nullptr && audioTrackId_ >= 0) {
502 std::cout<<"AVMuxerDemoBase::WriteTrackSampleByBufferQueue write AUDIO sample"<<std::endl;
503 WriteSingleTrackSampleByBufferQueue(audioBufferQueue_, audioFile_);
504 } else if (videoFile_ != nullptr && videoTrackId_ >= 0) {
505 std::cout<<"AVMuxerDemoBase::WriteTrackSampleByBufferQueue write VIDEO sample"<<std::endl;
506 WriteSingleTrackSampleByBufferQueue(videoBufferQueue_, videoFile_);
507 } else {
508 std::cout<<"AVMuxerDemoBase::WriteTrackSampleByBufferQueue don't write AUDIO and VIDEO track!!"<<std::endl;
509 }
510 }
511
MulThdWriteTrackSample(AVMuxerDemoBase * muxerBase,uint32_t trackId,std::shared_ptr<std::ifstream> file)512 void AVMuxerDemoBase::MulThdWriteTrackSample(AVMuxerDemoBase *muxerBase, uint32_t trackId,
513 std::shared_ptr<std::ifstream> file)
514 {
515 muxerBase->WriteSingleTrackSample(trackId, file);
516 }
517
MulThdWriteTrackSampleByBufferQueue(AVMuxerDemoBase * muxerBase,sptr<AVBufferQueueProducer> bufferQueue,std::shared_ptr<std::ifstream> file)518 void AVMuxerDemoBase::MulThdWriteTrackSampleByBufferQueue(AVMuxerDemoBase *muxerBase,
519 sptr<AVBufferQueueProducer> bufferQueue, std::shared_ptr<std::ifstream> file)
520 {
521 muxerBase->WriteSingleTrackSampleByBufferQueue(bufferQueue, file);
522 }
523
WriteCoverSample()524 void AVMuxerDemoBase::WriteCoverSample()
525 {
526 if (coverParams_ == nullptr) {
527 return;
528 }
529 std::cout<<"AVMuxerDemoBase::WriteCoverSample"<<std::endl;
530 if (coverFile_ == nullptr) {
531 std::cout<<"AVMuxerDemoBase::WriteCoverSample coverFile_ is nullptr!"<<std::endl;
532 return;
533 }
534
535 coverFile_->seekg(0, std::ios::end);
536 int32_t size = coverFile_->tellg();
537 coverFile_->seekg(0, std::ios::beg);
538 if (size <= 0) {
539 std::cout<<"AVMuxerDemoBase::WriteCoverSample coverFile_ size is 0!"<<std::endl;
540 return;
541 }
542
543 auto alloc = AVAllocatorFactory::CreateSharedAllocator(MemoryFlag::MEMORY_READ_WRITE);
544 std::shared_ptr<AVBuffer> avMemBuffer = AVBuffer::CreateAVBuffer(alloc, size);
545 coverFile_->read(reinterpret_cast<char*>(avMemBuffer->memory_->GetAddr()), size);
546 avMemBuffer->pts_ = 0;
547 avMemBuffer->memory_->SetSize(size);
548 if (DoWriteSample(coverTrackId_, avMemBuffer) != AVCS_ERR_OK) {
549 std::cout<<"WriteCoverSample error"<<std::endl;
550 }
551 }
552
AddVideoTrack(const VideoTrackParam * param)553 int AVMuxerDemoBase::AddVideoTrack(const VideoTrackParam *param)
554 {
555 if (param == nullptr) {
556 std::cout<<"AVMuxerDemoBase::AddVideoTrack video is not select!"<<std::endl;
557 return -1;
558 }
559 std::shared_ptr<Meta> videoParams = std::make_shared<Meta>();
560 videoParams->Set<Tag::MIME_TYPE>(param->mimeType);
561 videoParams->Set<Tag::VIDEO_WIDTH>(param->width);
562 videoParams->Set<Tag::VIDEO_HEIGHT>(param->height);
563 videoParams->Set<Tag::VIDEO_FRAME_RATE>(param->frameRate);
564 videoParams->Set<Tag::VIDEO_DELAY>(param->videoDelay);
565 if (param == &g_videoHdrPar) {
566 videoParams->Set<Tag::VIDEO_COLOR_PRIMARIES>(static_cast<Plugins::ColorPrimary>(param->colorPrimaries));
567 videoParams->Set<Tag::VIDEO_COLOR_TRC>(static_cast<Plugins::TransferCharacteristic>(param->colorTransfer));
568 videoParams->Set<Tag::VIDEO_COLOR_MATRIX_COEFF>(
569 static_cast<Plugins::MatrixCoefficient>(param->colorMatrixCoeff));
570 videoParams->Set<Tag::VIDEO_COLOR_RANGE>(static_cast<bool>(param->colorRange));
571 videoParams->Set<Tag::VIDEO_IS_HDR_VIVID>(static_cast<bool>(param->isHdrVivid));
572 }
573 int extSize = 0;
574 videoFile_->read(reinterpret_cast<char*>(&extSize), sizeof(extSize));
575 if (extSize > 0 && extSize < CONFIG_BUFFER_SZIE) {
576 std::vector<uint8_t> buffer(extSize);
577 videoFile_->read(reinterpret_cast<char*>(buffer.data()), extSize);
578 videoParams->Set<Tag::MEDIA_CODEC_CONFIG>(buffer);
579 } else {
580 std::cout<<"AVMuxerDemoBase::AddVideoTrack DoAddTrack failed!"<<std::endl;
581 }
582
583 if (DoAddTrack(videoTrackId_, videoParams) != AVCS_ERR_OK) {
584 return -1;
585 }
586 std::cout << "AVMuxerDemoBase::AddVideoTrack video trackId is: " << videoTrackId_ << std::endl;
587 videoBufferQueue_ = DoGetInputBufferQueue(videoTrackId_);
588 return 0;
589 }
590
AddAudioTrack(const AudioTrackParam * param)591 int AVMuxerDemoBase::AddAudioTrack(const AudioTrackParam *param)
592 {
593 if (param == nullptr) {
594 std::cout<<"AVMuxerDemoBase::AddAudioTrack audio is not select!"<<std::endl;
595 return -1;
596 }
597 std::shared_ptr<Meta> audioParams = std::make_shared<Meta>();
598 audioParams->Set<Tag::MIME_TYPE>(param->mimeType);
599 audioParams->Set<Tag::AUDIO_SAMPLE_RATE>(param->sampleRate);
600 audioParams->Set<Tag::AUDIO_CHANNEL_COUNT>(param->channels);
601 audioParams->Set<Tag::AUDIO_SAMPLE_PER_FRAME>(param->frameSize);
602 if (param == &g_audioAacPar) {
603 audioParams->Set<Tag::MEDIA_PROFILE>(Plugins::AACProfile::AAC_PROFILE_LC);
604 audioParams->Set<Tag::AUDIO_AAC_IS_ADTS>(0);
605 } else if (param == &g_audioG711MUPar) {
606 audioParams->Set<Tag::AUDIO_SAMPLE_FORMAT>(Plugins::AudioSampleFormat::SAMPLE_U8);
607 audioParams->Set<Tag::MEDIA_BITRATE>(705600); // 705600 g711mu bit rate
608 } else if (param == &g_audioRawPar) {
609 audioParams->Set<Tag::AUDIO_SAMPLE_FORMAT>(Plugins::AudioSampleFormat::SAMPLE_S16LE);
610 audioParams->Set<Tag::AUDIO_CHANNEL_LAYOUT>(Plugins::AudioChannelLayout::STEREO);
611 }
612
613 int extSize = 0;
614 audioFile_->read(reinterpret_cast<char*>(&extSize), sizeof(extSize));
615 if (extSize > 0 && extSize < CONFIG_BUFFER_SZIE) {
616 std::vector<uint8_t> buffer(extSize);
617 audioFile_->read(reinterpret_cast<char*>(buffer.data()), extSize);
618 audioParams->Set<Tag::MEDIA_CODEC_CONFIG>(buffer);
619 } else {
620 std::cout<<"AVMuxerDemoBase::AddAudioTrack error extSize:"<<extSize<<std::endl;
621 }
622
623 if (DoAddTrack(audioTrackId_, audioParams) != 0) {
624 std::cout<<"AVMuxerDemoBase::AddAudioTrack DoAddTrack failed!"<<std::endl;
625 return -1;
626 }
627 std::cout << "AVMuxerDemoBase::AddAudioTrack audio trackId is: " << audioTrackId_ << std::endl;
628 audioBufferQueue_ = DoGetInputBufferQueue(audioTrackId_);
629 return 0;
630 }
631
AddCoverTrack(const VideoTrackParam * param)632 int AVMuxerDemoBase::AddCoverTrack(const VideoTrackParam *param)
633 {
634 if (param == nullptr) {
635 std::cout<<"AVMuxerDemoBase::AddCoverTrack cover is not select!"<<std::endl;
636 return -1;
637 }
638 std::shared_ptr<Meta> coverParams = std::make_shared<Meta>();
639 coverParams->Set<Tag::MIME_TYPE>(param->mimeType);
640 coverParams->Set<Tag::VIDEO_WIDTH>(param->width);
641 coverParams->Set<Tag::VIDEO_HEIGHT>(param->height);
642
643 if (DoAddTrack(coverTrackId_, coverParams) != AVCS_ERR_OK) {
644 return -1;
645 }
646 std::cout << "AVMuxerDemoBase::AddCoverTrack video trackId is: " << coverTrackId_ << std::endl;
647 coverBufferQueue_ = DoGetInputBufferQueue(coverTrackId_);
648 return 0;
649 }
650
GetOutputFileName(std::string header)651 std::string AVMuxerDemoBase::GetOutputFileName(std::string header)
652 {
653 std::string outputFileName = header;
654 if (!audioType_.empty()) {
655 outputFileName += "_" + audioType_;
656 }
657 if (!videoType_.empty()) {
658 outputFileName += "_" + videoType_;
659 }
660 if (!coverType_.empty()) {
661 outputFileName += "_" + coverType_;
662 }
663 outputFileName += "." + format_;
664 return outputFileName;
665 }
666 } // MediaAVCodec
667 } // OHOS