FFmpeg: libavformat/flvenc.c Source File
Go to the documentation of this file. 1 /*
2 * FLV muxer
3 * Copyright (c) 2003 The FFmpeg Project
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
41
42
57 };
58
71 };
72
80
86
94
102
107
114
116
120
125
130
132 {
135
142 "FLV only supports wideband (16kHz) Speex audio\n");
144 }
148 }
150 } else {
152 case 48000:
153 // 48khz mp3 is stored with 44k1 samplerate identifer
156 break;
157 } else {
159 }
160 case 44100:
162 break;
163 case 22050:
165 break;
166 case 11025:
168 break;
169 case 16000: // nellymoser only
170 case 8000: // nellymoser only
171 case 5512: // not MP3
174 break;
175 }
176 default:
179 "FLV does not support sample rate %d, "
180 "choose from (44100, 22050, 11025)\n", par->
sample_rate);
182 }
183 }
184
187
191 break;
194 break;
197 break;
200 break;
203 break;
209 else
211 break;
214 break;
217 break;
218 case 0:
220 break;
221 default:
225 }
226
228 }
229
231 {
232 size_t len = strlen(str);
234 // Avoid avio_write() if put_amf_string(pb, "") is inlined.
236 return;
238 }
239
240 // FLV timestamps are 32 bits signed, RTMP timestamps should be 32-bit unsigned
243 avio_w8(pb, (ts >> 24) & 0x7F);
244 }
245
247 {
249 /* ub[4] FrameType = 1, ub[4] CodecId */
256 avio_w8(pb, 2);
/* AVC end of sequence */
257 avio_wb24(pb, 0);
/* Always 0 for AVC EOS. */
259 }
260
262 {
265 }
266
268 {
270 }
271
273 {
276 }
277
279 {
282 }
283
285 {
289 int metadata_count = 0;
292
293 /* write meta_tag */
296 avio_wb24(pb, 0);
// size of data part (sum of all parts below)
299
300 /* now data of data_size size */
301
302 /* first event name as a string */
305
306 /* mixed array (hash) with size and string/type/data tuples */
312 if (write_duration_filesize) {
313 metadata_count += 2; // +2 for duration and file size
314 }
316
317 if (write_duration_filesize) {
320 // fill in the guessed duration, it'll be corrected later if incorrect
322 }
323
327
330
333
337 metadata_count++;
338 }
339
342 }
343
347
350
353
356
359 }
360
364 }
365
368 if( !strcmp(
tag->key,
"width")
369 ||!strcmp(
tag->key,
"height")
370 ||!strcmp(
tag->key,
"videodatarate")
371 ||!strcmp(
tag->key,
"framerate")
372 ||!strcmp(
tag->key,
"videocodecid")
373 ||!strcmp(
tag->key,
"audiodatarate")
374 ||!strcmp(
tag->key,
"audiosamplerate")
375 ||!strcmp(
tag->key,
"audiosamplesize")
376 ||!strcmp(
tag->key,
"stereo")
377 ||!strcmp(
tag->key,
"audiocodecid")
378 ||!strcmp(
tag->key,
"duration")
379 ||!strcmp(
tag->key,
"onMetaData")
380 ||!strcmp(
tag->key,
"datasize")
381 ||!strcmp(
tag->key,
"lasttimestamp")
382 ||!strcmp(
tag->key,
"totalframes")
383 ||!strcmp(
tag->key,
"hasAudio")
384 ||!strcmp(
tag->key,
"hasVideo")
385 ||!strcmp(
tag->key,
"hasCuePoints")
386 ||!strcmp(
tag->key,
"hasMetadata")
387 ||!strcmp(
tag->key,
"hasKeyframes")
388 ){
390 continue;
391 }
395 metadata_count++;
396 }
397
398 if (write_duration_filesize) {
402 }
403
406
409 metadata_count++;
410
413 metadata_count++;
414
417 metadata_count++;
418
421 metadata_count++;
422
425 metadata_count++;
426
431 metadata_count++;
432
437 metadata_count++;
438
443 metadata_count++;
444
449 metadata_count++;
450
455 metadata_count++;
456
461 metadata_count++;
462
465 metadata_count++;
466
468 }
469
472
473 /* write total size of tag */
475
476 avio_seek(pb, metadata_count_pos, SEEK_SET);
478
484 }
485
487 {
495
499 int flags_size = 5;
502 if (side_data)
504
507 if (side_data)
509
510 /*
511 * Reference Enhancing FLV
512 * https://github.com/veovera/enhanced-rtmp/blob/main/enhanced-rtmp.pdf
513 * */
519
526 }
527
530
532
534
536
541 }
542
547 }
548
553 }
554
557
558 if (lightMetadata) {
561
564
567
570 }
571
578
581
584
587
590
593
596
599 }
603
606 }
609 }
612
613 total_size =
avio_tell(pb) - metadata_size_pos - 10;
614 avio_seek(pb, metadata_size_pos, SEEK_SET);
617 avio_wb32(pb, total_size + 11);
// previous tag size
619 }
620 }
621
624 {
627 "%s codec %s not compatible with flv\n",
631 }
632
637
651 avio_w8(pb, 0);
// AAC sequence header
652
655 int samplerate_index;
659
660 for (samplerate_index = 0; samplerate_index < 16;
661 samplerate_index++)
664 break;
665
668 put_bits(&pbc, 4, samplerate_index);
//sample rate index
670 put_bits(&pbc, 1, 0);
//frame length - 1024 samples
671 put_bits(&pbc, 1, 0);
//does not depend on core coder
672 put_bits(&pbc, 1, 0);
//is not extension
674
677
680 }
682 } else {
689 } else {
691 avio_w8(pb, 0);
// AVC sequence header
693 }
694
701 else
703 }
705 avio_seek(pb, -data_size - 10, SEEK_CUR);
708 avio_wb32(pb, data_size + 11);
// previous tag size
709 }
710 }
711
713 {
715
716 if (!position) {
719 }
720
723
728 } else {
732 }
733
735
736 return 0;
737 }
738
740 {
744
746 metadata_size += 2 + 13; /* filepositions String */
747 metadata_size += 2 + 5; /* times String */
748 metadata_size += 3; /* Object end */
749
751
752 if (metadata_size < 0)
753 return metadata_size;
754
758
761
764
765 return 0;
766 }
767
769 {
772
777 }
778
779 for (
i = 0;
i <
s->nb_streams;
i++) {
781
784 if (
s->streams[
i]->avg_frame_rate.den &&
785 s->streams[
i]->avg_frame_rate.num) {
787 }
790 "at most one video stream is supported in flv\n");
792 }
796
802
805 "use vstrict=-1 / -strict -1 to use it anyway.\n");
807 }
810 "Muxing VP6 in flv will produce flipped video on playback.\n");
811 }
812 break;
816 "at most one audio stream is supported in flv\n");
818 }
824 "16-bit big-endian audio in flv is valid but most likely unplayable (hardware dependent); use s16le\n");
825 break;
830 break;
836 }
838 break;
839 default:
843 }
846 }
847
849
850 return 0;
851 }
852
854 {
858
865
866 for (
i = 0;
i <
s->nb_streams;
i++)
867 if (
s->streams[
i]->codecpar->codec_tag == 5) {
868 avio_w8(pb, 8);
// message type
874 }
875
878 } else {
880 }
881
882 for (
i = 0;
i <
s->nb_streams;
i++) {
884 }
885
887 return 0;
888 }
889
891 {
898
899 if (build_keyframes_idx) {
901
904
907
910
913
917
919 if (res < 0) {
920 goto end;
921 }
927 }
928
933 }
934
937
939 }
940
941 end:
944 } else {
945 /* Add EOS tag */
946 for (
i = 0;
i <
s->nb_streams;
i++) {
951 }
952 }
953
955
956 if (build_keyframes_idx) {
960 }
963 /* update information */
966 } else {
968 }
971 } else {
973 }
974 }
975 }
976
977 return 0;
978 }
979
981 {
985 unsigned ts;
989 int flags = -1, flags_size,
ret = 0;
991
995 }
996
999 flags_size = 2;
1003 flags_size = 5;
1004 else
1005 flags_size = 1;
1006
1008 flags_size += 3;
1009
1013 size_t side_size;
1019 memcpy(par->
extradata, side, side_size);
1021 }
1023 }
1024
1027
1030 "Packets are not in the proper order with respect to DTS\n");
1032 }
1039 }
1040 }
1041
1043
1047 }
1048
1051
1055
1057
1059 break;
1062
1064
1066 break;
1070 break;
1071 default:
1073 }
1074
1076 /* check if extradata looks like mp4 formatted */
1088 "use the audio bitstream filter 'aac_adtstoasc' to fix it "
1089 "('-bsf:a aac_adtstoasc' option with ffmpeg)\n");
1091 }
1093 }
1094
1095 /* check Speex packet duration */
1098 "8 frames per packet. Adobe Flash "
1099 "Player cannot handle this!\n");
1100
1103
1104 if (
size + flags_size >= 1<<24) {
1106 size + flags_size, 1<<24);
1109 }
1110
1114
1117 int data_size;
1120 // legacy FFmpeg magic?
1133 } else {
1134 // just pass the metadata through
1136 }
1137 /* write total size of tag */
1138 data_size =
avio_tell(pb) - metadata_size_pos;
1139 avio_seek(pb, metadata_size_pos - 10, SEEK_SET);
1141 avio_seek(pb, data_size + 10 - 3, SEEK_CUR);
1143 } else {
1154 } else {
1156 }
1162 else
1170 }
1171
1173
1177 }
1178
1190 }
1191 break;
1192
1195 break;
1196
1197 default:
1199 break;
1200 }
1201 }
1204
1206 }
1207
1210 {
1214 }
1221 return 1;
1222 }
1223
1225 {
1228
1229 while (filepos) {
1232 filepos = next;
1233 }
1236 }
1237
1239 {
"flvflags",
"FLV muxer flags", offsetof(
FLVContext,
flags),
AV_OPT_TYPE_FLAGS, {.i64 = 0}, INT_MIN, INT_MAX,
AV_OPT_FLAG_ENCODING_PARAM, .unit =
"flvflags" },
1246 };
1247
1253 };
1254
1258 .p.mime_type = "video/x-flv",
1259 .p.extensions = "flv",
1269 .p.codec_tag = (
const AVCodecTag*
const []) {
1271 },
1275 };
static void error(const char *err)
int64_t metadata_totalsize
AVCodecParameters * audio_par
#define AMF_END_OF_OBJECT
#define AV_LOG_WARNING
Something somehow does not look correct.
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
@ AVIO_DATA_MARKER_BOUNDARY_POINT
A point in the output bytestream where a demuxer can start parsing (for non self synchronizing bytest...
Filter the word "frame" indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
enum AVMediaType codec_type
General type of the encoded data.
FLVFileposition * filepositions
This struct describes the properties of an encoded stream.
enum AVColorSpace color_space
@ AV_PKT_DATA_NEW_EXTRADATA
The AV_PKT_DATA_NEW_EXTRADATA is used to notify the codec or the format that the extradata buffer was...
int64_t delay
first dts delay (needed for AVC & Speex)
@ AV_PKT_DATA_MASTERING_DISPLAY_METADATA
Mastering display metadata (based on SMPTE-2086:2014).
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
unsigned MaxCLL
Max content light level (cd/m^2).
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
@ AVCOL_TRC_NB
Not part of ABI.
This structure stores auxiliary information for decoding, presenting, or otherwise processing the cod...
int64_t metadata_totalsize_pos
@ AVCOL_SPC_NB
Not part of ABI.
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
@ PacketTypeSequenceStart
int nb_channels
Number of channels in this layout.
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
int64_t lasttimestamp_offset
Content light level needed by to transmit HDR over HDMI (CTA-861.3).
enum AVColorPrimaries color_primaries
void avio_write_marker(AVIOContext *s, int64_t time, enum AVIODataMarkerType type)
Mark the written bytestream as a specific type.
int64_t lastkeyframelocation_offset
@ FLV_HEADER_FLAG_HASAUDIO
double lastkeyframetimestamp
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
@ AV_CODEC_ID_MP3
preferred ID for decoding MPEG audio layer 1, 2 or 3
#define FLV_AUDIO_CODECID_OFFSET
enum AVColorTransferCharacteristic color_trc
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
int64_t keyframe_position
int64_t lastkeyframelocation
AVCodecParameters * video_par
int64_t filepositions_count
This struct describes the properties of a single codec described by an AVCodecID.
@ AVCOL_PRI_NB
Not part of ABI.
static double av_q2d(AVRational a)
Convert an AVRational to a double.
#define av_assert0(cond)
assert() equivalent, that is always enabled.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
int nb_coded_side_data
Amount of entries in coded_side_data.
@ AVMEDIA_TYPE_DATA
Opaque data information usually continuous.
FLVFileposition * head_filepositions
int ff_format_shift_data(AVFormatContext *s, int64_t read_start, int shift_size)
Make shift_size amount of space at read_start by shifting data in the output at read_start until the ...
int ff_isom_write_vpcc(AVFormatContext *s, AVIOContext *pb, const uint8_t *data, int len, AVCodecParameters *par)
Writes VP codec configuration to the provided AVIOContext.
AVCodecParameters * codecpar
Codec parameters associated with this stream.
#define LIBAVUTIL_VERSION_INT
Describe the class of an AVClass context structure.
int ff_hevc_annexb2mp4_buf(const uint8_t *buf_in, uint8_t **buf_out, int *size, int filter_ps, int *ps_count)
Writes Annex B formatted HEVC NAL units to a data buffer.
const char * av_default_item_name(void *ptr)
Return the context name.
@ FLV_FRAME_VIDEO_INFO_CMD
video info/command frame
int ff_avc_parse_nal_units_buf(const uint8_t *buf_in, uint8_t **buf, int *size)
@ FLV_FRAME_KEY
key frame (for AVC, a seekable frame)
void avio_w8(AVIOContext *s, int b)
AVChannelLayout ch_layout
Audio only.
@ AV_PKT_DATA_CONTENT_LIGHT_LEVEL
Content light level (based on CTA-861.3).
#define AV_OPT_FLAG_ENCODING_PARAM
A generic parameter which can be set by the user for muxing or encoding.
int sample_rate
Audio only.
double keyframe_timestamp
AVCodecID
Identify the syntax and semantics of the bitstream.
@ FLV_SAMPLERATE_SPECIAL
signifies 5512Hz and 8000Hz in the case of NELLYMOSER
const AVPacketSideData * av_packet_side_data_get(const AVPacketSideData *sd, int nb_sd, enum AVPacketSideDataType type)
Get side information from a side data array.
int64_t keyframes_info_offset
int extradata_size
Size of the extradata content in bytes.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
int ff_isom_write_avcc(AVIOContext *pb, const uint8_t *data, int len)
int ff_standardize_creation_time(AVFormatContext *s)
Standardize creation_time metadata in AVFormatContext to an ISO-8601 timestamp string.
@ FLV_FRAME_INTER
inter frame (for AVC, a non-seekable frame)
#define AV_NOPTS_VALUE
Undefined timestamp value.
#define MKBETAG(a, b, c, d)
int profile
Codec-specific bitstream restrictions that the stream conforms to.
@ AVIO_DATA_MARKER_SYNC_POINT
A point in the output bytestream where a decoder can start decoding (i.e.
int ff_isom_write_av1c(AVIOContext *pb, const uint8_t *buf, int size, int write_seq_header)
Writes AV1 extradata (Sequence Header and Metadata OBUs) to the provided AVIOContext.
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
void avio_wb32(AVIOContext *s, unsigned int val)
AVCodecParameters * data_par
int flags
A combination of AV_PKT_FLAG values.
#define FF_COMPLIANCE_UNOFFICIAL
Allow unofficial extensions.
@ FLV_HEADER_FLAG_HASVIDEO
const char * avcodec_get_name(enum AVCodecID id)
Get the name of a codec.
int ff_isom_write_hvcc(AVIOContext *pb, const uint8_t *data, int size, int ps_array_completeness)
Writes HEVC extradata (parameter sets, declarative SEI NAL units) to the provided AVIOContext.
static av_always_inline uint64_t av_double2int(double f)
Reinterpret a double as a 64-bit integer.
#define i(width, name, range_min, range_max)
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
uint8_t * av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type, size_t *size)
Get side information from packet.
int64_t keyframe_index_size
#define av_builtin_constant_p
#define AV_TIME_BASE
Internal time base represented as integer.
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
int64_t metadata_size_pos
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
AVPacketSideData * coded_side_data
Additional data associated with the entire stream.
@ AMF_DATA_TYPE_MIXEDARRAY
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
@ AV_CODEC_ID_TEXT
raw UTF-8 text
const char * av_get_media_type_string(enum AVMediaType media_type)
Return a string describing the media_type enum, NULL if media_type is unknown.
int64_t lastkeyframetimestamp_offset
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
void avio_wb64(AVIOContext *s, uint64_t val)
const int ff_mpeg4audio_sample_rates[16]
int bits_per_coded_sample
The number of bits per sample in the codedwords.
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
@ FLV_CODECID_NELLYMOSER_8KHZ_MONO
void avio_wb24(AVIOContext *s, unsigned int val)
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
This structure stores compressed data.
unsigned MaxFALL
Max average light level per frame (cd/m^2).
@ FLV_CODECID_NELLYMOSER_16KHZ_MONO
void avio_wb16(AVIOContext *s, unsigned int val)
#define flags(name, subs,...)
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
const AVCodecDescriptor * avcodec_descriptor_get(enum AVCodecID id)
struct FLVFileposition * next
const AVDictionaryEntry * av_dict_iterate(const AVDictionary *m, const AVDictionaryEntry *prev)
Iterate over a dictionary.
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_RB16
Generated on Thu Sep 26 2024 23:14:57 for FFmpeg by
doxygen
1.8.17