@@ -42,13 +42,7 @@ IOutputStream& OutputFile::addVideoStream(const VideoCodec& videoDesc)
42
42
stream.codec ->level = videoDesc.getAVCodecContext ().level ;
43
43
stream.codec ->field_order = videoDesc.getAVCodecContext ().field_order ;
44
44
45
- // some codecs need/can use extradata to decode
46
- uint8_t * srcExtradata = videoDesc.getAVCodecContext ().extradata ;
47
- const int srcExtradataSize = videoDesc.getAVCodecContext ().extradata_size ;
48
- stream.codec ->extradata = (uint8_t *)av_malloc (srcExtradataSize + FF_INPUT_BUFFER_PADDING_SIZE);
49
- memcpy (stream.codec ->extradata , srcExtradata, srcExtradataSize);
50
- memset (((uint8_t *)stream.codec ->extradata ) + srcExtradataSize, 0 , FF_INPUT_BUFFER_PADDING_SIZE);
51
- stream.codec ->extradata_size = videoDesc.getAVCodecContext ().extradata_size ;
45
+ setOutputStream (stream, videoDesc);
52
46
53
47
// need to set the time_base on the AVCodecContext and the AVStream
54
48
// compensating the frame rate with the ticks_per_frame and keeping
@@ -75,6 +69,8 @@ IOutputStream& OutputFile::addAudioStream(const AudioCodec& audioDesc)
75
69
stream.codec ->sample_fmt = audioDesc.getAVCodecContext ().sample_fmt ;
76
70
stream.codec ->frame_size = audioDesc.getAVCodecContext ().frame_size ;
77
71
72
+ setOutputStream (stream, audioDesc);
73
+
78
74
// need to set the time_base on the AVCodecContext of the AVStream
79
75
av_reduce (&stream.codec ->time_base .num , &stream.codec ->time_base .den , audioDesc.getAVCodecContext ().time_base .num ,
80
76
audioDesc.getAVCodecContext ().time_base .den , INT_MAX);
@@ -319,4 +315,27 @@ void OutputFile::setupRemainingWrappingOptions()
319
315
}
320
316
}
321
317
}
318
+
319
+ void OutputFile::setOutputStream (AVStream& avStream, const ICodec& codec)
320
+ {
321
+ // depending on the format, place global headers in extradata instead of every keyframe
322
+ if (_formatContext.getAVOutputFormat ().flags & AVFMT_GLOBALHEADER) {
323
+ avStream.codec ->flags |= CODEC_FLAG_GLOBAL_HEADER;
324
+ }
325
+
326
+ // if the codec is experimental, allow it
327
+ if (codec.getAVCodec ().capabilities & CODEC_CAP_EXPERIMENTAL) {
328
+ LOG_WARN (" This codec is considered experimental by libav/ffmpeg:" << codec.getCodecName ());
329
+ avStream.codec ->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL;
330
+ }
331
+
332
+ // some codecs need/can use extradata to decode
333
+ uint8_t * srcExtradata = codec.getAVCodecContext ().extradata ;
334
+ const int srcExtradataSize = codec.getAVCodecContext ().extradata_size ;
335
+ avStream.codec ->extradata = (uint8_t *)av_malloc (srcExtradataSize + FF_INPUT_BUFFER_PADDING_SIZE);
336
+ memcpy (avStream.codec ->extradata , srcExtradata, srcExtradataSize);
337
+ memset (((uint8_t *)avStream.codec ->extradata ) + srcExtradataSize, 0 , FF_INPUT_BUFFER_PADDING_SIZE);
338
+ avStream.codec ->extradata_size = codec.getAVCodecContext ().extradata_size ;
339
+ }
340
+
322
341
}
0 commit comments