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