• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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