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