summaryrefslogtreecommitdiff
path: root/libavformat/movenc.c
Commit message (Collapse)AuthorAge
* avformat/movenc: allow Apple Lossless inside mp4Leo Izen2020-11-22
| | | | | | The 'alac' identifier has been registered to ISO and thus towards ISOBMFF at the MP4 registration authority. The existing non-MOV mux mode matches the official ALAC-in-MP4 specification.
* avformat/movenc: Avoid allocation for timecode trackAndreas Rheinhardt2020-10-05
| | | | Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat/movenc: Don't forget to free fragment buffersAndreas Rheinhardt2020-10-05
| | | | | | | | | | The buffers used when fragmented output is enabled have up until now not been freed in the deinit function; they leak e.g. if one errors out of mov_write_trailer() before one reaches the point where they are normally written out and freed. This can e.g. happen if allocating new vos_data fails at the beginning of mov_write_trailer(). Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat/movenc: Free old vos_data before overwriting itAndreas Rheinhardt2020-10-05
| | | | | | | | Otherwise the old data leaks whenever extradata needs to be rewritten (e.g. when encoding FLAC with our encoder that sends an updated extradata packet at the end). Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat/movenc: Don't free AVCodecParameters manuallyAndreas Rheinhardt2020-10-05
| | | | Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat/movenc: Make some AVCodecTag tables staticAndreas Rheinhardt2020-10-04
| | | | | | They are not used anywhere else. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat/movenc: Fix segfault when remuxing rtp hint streamAndreas Rheinhardt2020-10-04
| | | | | | | | | | | | | | | | When remuxing an rtp hint stream (or any stream with the tag "rtp "), the mov muxer treats this as one of the rtp hint tracks it creates internally when ordered to do so; yet this track lacks the AVFormatContext for the hinting rtp muxer, leading to segfaults in mov_write_udta_sdp() if a "trak" atom is written for this stream; if not, the stream's codecpar is freed by mov_free() as if the mov muxer owned it (it does for the internally created "rtp " tracks), but without resetting st->codecpar, leading to double-frees lateron. This commit therefore ignores said tag which makes rtp hint streams unremuxable. This fixes tickets #8181 and #8186. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat/movenc: handle tracks w/o AVStreams in calculate_mpeg4_bit_ratesJan Ekström2020-10-02
| | | | | | | The generated text streams for chapters lack an AVStream since they are but an internal concept within movenc. Fixes #8910
* avformat/movenc: Fix stack overflow when remuxing timecode tracksAndreas Rheinhardt2020-10-01
| | | | | | | | | | | | | | | | | | | | | | | There are two possible kinds of timecode tracks (with tag "tmcd") in the mov muxer: Tracks created internally by the muxer and timecode tracks sent by the user. If any of the latter exists, the former are deactivated. The former all belong to another track, the source track; the latter don't have a source track set, but the index of the source track is initially zeroed by av_mallocz_array(). This is a problem since 3d894db700cc1e360a7a75ab9ac8bf67ac6670a3: Said commit added a function that calculates the duration of tracks and the duration of timecode tracks is calculated by rescaling the duration (calculated by the very same function) of the source track. This gives an infinite recursion if the first track (the one that will be treated as source track for all timecode tracks) is a timecode track itself, leading to a stack overflow. This commit fixes this by not using the nonexistent source track when calculating the duration of timecode tracks not created internally by the mov muxer. Reviewed-by: Martin Storsjö <martin@martin.st> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat/movenc: Fix segfault upon allocation errorAndreas Rheinhardt2020-09-28
| | | | | Reviewed-by: Jan Ekström <jeebjp@gmail.com> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat/movenc: simplify ISML manifest bit rate logicJan Ekström2020-09-22
| | | | | The newly calculated average bit rate value is pretty much what is being done here.
* avformat/movenc: use more fall-back values for average bit rate fieldsJan Ekström2020-09-22
| | | | | | | | | If the average bit rate cannot be calculated, such as in the case of streamed fragmented mp4, utilize various available parameters in priority order. Tests are updated where the esds or btrt or ISML manifest boxes' output changes.
* avformat/movenc: implement writing of the btrt boxJan Ekström2020-09-22
| | | | | | | | | | | This is utilized by various media ingests to figure out the bit rate of the content you are pushing towards it, so write it for video, audio and subtitle tracks in case at least one nonzero value is available. It is only mentioned for timed metadata sample descriptions in QTFF, so limit it only to ISOBMFF (MODE_MP4) mode. Updates the FATE tests which have their results changed due to the 20 extra bytes being written per track.
* avformat/movenc: utilize bit rate helper function in ISML writingJan Ekström2020-09-21
| | | | | This way we have a single location in movenc which utilizes the CPB properties.
* avformat/movenc: split MPEG-4 bit rate value calculationJan Ekström2020-09-21
| | | | This can now be re-utilized in other places.
* avformat/movenc: write the colr atom by defaultMichael Bradshaw2020-08-21
| | | | | | | | | | | | | | | | | The write_colr flag has been marked as experimental for over 5 years. It should be safe to enable its behavior by default as follows: - Write the colr atom by default for mp4/mov if any of the following: - The primaries/trc/matrix are all specified, OR - There is an ICC profile, OR - The user specified +write_colr - Keep the write_colr flag for situations where the user wants to write the colr atom even if the color info is unspecified (e.g., http://ffmpeg.org/pipermail/ffmpeg-devel/2020-March/259334.html) This fixes https://trac.ffmpeg.org/ticket/7961 Signed-off-by: Michael Bradshaw <mjbshaw@google.com>
* lavf/movenc: Use a dynamic buffer when writing the mfra boxDerek Buitenhuis2020-06-28
| | | | | | | | | | | When doing streamed output, with e.g. +dash, if the mfra box ended up being larger than the AVIOContext write buffer, the (unchecked) seeking back to update the box size would silently fail and produce an invalid mfra box. This is similar to how other boxes are written in fragmented mode. Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
* avcodec, avformat: Remove unnecessary initializations of side data sizeAndreas Rheinhardt2020-06-22
| | | | | Reviewed-by: Anton Khirnov <anton@khirnov.net> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat/movenc: Write 'av01' as a compatible brand when muxing AV1Derek Buitenhuis2020-06-17
| | | | | | | | | This is a requirement of the AV1-ISOBMFF spec. Section 2.1. General Requirements & Brands states: * It SHALL have the av01 brand among the compatible brands array of the FileTypeBox Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
* avformat/movenc: fix remuxing eia-608 into mov from other containersPaul B Mahol2020-06-15
|
* movenc: Fix accidental leftover duplication from 1aec1fbcc595Martin Storsjö2020-05-22
| | | | Signed-off-by: Martin Storsjö <martin@martin.st>
* movenc: Fix conversion of the first frame for extradata-less H264/HEVCMartin Storsjö2020-05-22
| | | | | | | | | | | | | | | | | | | Move the copying of the frame to vos_data further up in the function, so that when writing the actual frame data for the first frame, it's clear that the stream really is in annex b format, for the cases where we create extradata from the first frame. Alternatively - we could invert the checks for bitstream format. If extradata is missing, we can't pretend that the bitstream is in mp4 form, because we can't even know the NAL unit length prefix size in that case. Also avoid creating extradata for AVC intra. If the track tag is an AVC intra tag, don't copy the frame into vos_data - this matches other existing cases of how vos_data and TAG_IS_AVCI interact in other places. Signed-off-by: Martin Storsjö <martin@martin.st>
* movenc: Use first H264/HEVC frame as extradata, if it is missingMartin Storsjö2020-05-20
| | | | | | | | | | | | | | | | | Sticking a full frame in the extradata works, as the code for writing the avcC/hvcC extracts the relevant parameter set NAL units - provided that they actually exist in the frame. Some encoders don't provide split out extradata directly on init (or at all). In particular, the MediaFoundation encoder wrapper doesn't always (depending on the actual encoder device) - this is the case for Qualcomm's HEVC encoder on SD835, and also on some QSV H264 encoders). This only works for cases where the moov hasn't already been written (e.g. when not writing fragmented mp4 with empty_moov, unless using the delay_moov option). Signed-off-by: Martin Storsjö <martin@martin.st>
* avformat/movenc: cosmeticsLimin Wang2020-04-26
| | | | | Signed-off-by: Limin Wang <lance.lmwang@gmail.com> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
* lavf/movenc: enable dvcC/dvvC box support from DOVI sidedataJun Zhao2020-04-23
| | | | | | enable dvcC/dvvC box support from DOVI sidedata. Signed-off-by: Jun Zhao <barryjzhao@tencent.com>
* avformat/movenc: cosmeticsLimin Wang2020-04-20
| | | | | Signed-off-by: Limin Wang <lance.lmwang@gmail.com> Signed-off-by: Josh de Kock <josh@itanimul.li>
* avformat/movenc: remove call to av_copy_packet_side_data() when ↵James Almer2020-04-15
| | | | | | | | | | | | concatenating eac3 syncframes This generates a potential memory leak, and mixes side data from the last packet with other properties from the first. Keep all the properties from the first packet only in the output packet instead. Signed-off-by: James Almer <jamrial@gmail.com>
* avformat/movenc: write the mdcv atom by defaultMichael Bradshaw2020-04-13
| | | | | | | | | | The mdcv atom isn't in ISO/IEC 14496-12:2015 but it is expected to be added soon. See: http://ffmpeg.org/pipermail/ffmpeg-devel/2020-April/259529.html The mdcv atom is already parsed in FFmpeg in mov.c. Signed-off-by: Michael Bradshaw <mjbshaw@google.com>
* avformat/movenc: remove the write_clli mov flagMichael Bradshaw2020-04-13
| | | | | | | | | The clli atom is expected to be standardized soon. See http://ffmpeg.org/pipermail/ffmpeg-devel/2020-April/259529.html We now write the clli atom by default. Signed-off-by: Michael Bradshaw <mjbshaw@google.com>
* avformat/movenc: stop guessing colr atom valuesMichael Bradshaw2020-04-13
|
* avformat/movenc: use enum values directly for colr atomMichael Bradshaw2020-04-13
| | | | | | | | | | | | | | | | | | | | | | | The switch cases were missing: - Primaries: bt470m, film, smpte428, and ebu3213. - TRCs: gamma22, gamma28, linear, log, log_sqrt, iec61966_2_4, bt1361, iec61966_2_1, bt2020_10bit, and bt2020_12bit. - Space: rgb, fcc, ycgco, bt2020_cl, smpte2085, chroma-derived-nc, chroma-derived-c, and ictcp. They also annoyingly remapped the following (which are functionally equivalent but can be treated differently by clients): - smpte240m primaries to smpte170m. - smpte170m TRC to bt709. - bt470bg color space to smpte170m. The enum values in FFmpeg are the same values as ITU-T H.273 and ISO/IEC 23001-8 so we can just use them directly, which is both simpler and preserves the user intent. Signed-off-by: Michael Bradshaw <mjbshaw@google.com>
* avformat/movenc: add write_clli flag to write clli atomMichael Bradshaw2020-04-01
| | | | | | | | | The clli atom isn't in ISO/IEC 14496-12:2015 so the flag is marked as experimental and the clli atom is not written by default. The clli atom is already parsed by FFmpeg in mov.c. Signed-off-by: Michael Bradshaw <mjbshaw@google.com>
* movenc: mark Opus encapsulation as stableLynne2020-03-27
| | | | | | | The specifications are de-facto frozen now as they've already been used in production for years, the author has indicated reluctance on IRC to change it further, and the only potential changes would, from what I understand, be forward-compatible.
* avformat/movenc: Reduce size of the allocated MOVIentry arrayJames Almer2020-03-26
| | | | | | | | Increasing it by 2048 entries per realloc is exessive. Reduces memory usage, especially on long, non fragmented output. Reviewed-by: Anton Khirnov <anton@khirnov.net> Signed-off-by: James Almer <jamrial@gmail.com>
* avformat/movenc: add ICC profile support to colr atomvectronic2020-03-10
| | | | | | | | | | | If 'write_colr' movflag is set, then movflag 'prefer_icc' can be used to first look for an AV_PKT_DATA_ICC_PROFILE entry to encode. If ICC profile doesn't exist, default behaviour enabled by 'write_colr' occurs. Signed-off-by: vectronic <hello.vectronic@gmail.com>
* avformat/av1: Avoid allocation + copying when filtering OBUsAndreas Rheinhardt2020-01-26
| | | | | | | | | | | | | | | | | | | | | | | | | | | Certain types of OBUs are stripped away before muxing into Matroska and ISOBMFF; there are two functions to do this: One that outputs by directly writing in an AVIOContext and one that returns a freshly allocated buffer with the units not stripped away copied into it. The latter option is bad for performance, especially when the input does already not contain any of the units intended to be stripped away (this covers typical remuxing scenarios). Therefore this commit changes this by avoiding allocating and copying when possible; it is possible if the OBUs to be retained are consecutively in the input buffer (without an OBU to be discarded between them). In this case, the caller receives the offset as well as the length of the part of the buffer that contains the units to be kept. This also avoids copying when e.g. the only unit to be discarded is a temporal delimiter at the front. For a 22.7mb/s file with average framesize 113 kB this improved the time for the calls to ff_av1_filter_obus_buf() when writing Matroska from 313319 decicycles to 2368 decicycles; for another file with 1.5mb/s (average framesize 7.3 kB) it improved from 34539 decicycles to 1922 decicyles. For these files the only units that needed to be stripped away were temporal unit delimiters at the front. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com> Signed-off-by: James Almer <jamrial@gmail.com>
* avformat/movenc: Check for reformatting errors when writing hint tracksAndreas Rheinhardt2020-01-26
| | | | | | | | If this is not done, the avio_write() calls will cause segfaults immediately afterwards on error. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com> Signed-off-by: James Almer <jamrial@gmail.com>
* avformat/movenc: allow ISMV timescale to be user-setGyan Doshi2020-01-25
| | | | | | | | As per the PIFF standard, the timescale of 10000000 is recommended but not mandatory, so don't override the user-set value. A warning is shown for non-recommended values.
* avformat/movenc, segafilmenc: Remove unnecessary avio_tell()Andreas Rheinhardt2020-01-17
| | | | | | | | | | | | | | When the faststart option for the mov/mp4 muxer is used, the current position (i.e. the size of the already written data pre-shifting) was evaluated twice: First in an initialization and then again later, overwriting the first value without having ever touched it. So remove the initialization. Also, the clone of this code in the Sega FILM muxer behaves the same and has been treated the same. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
* Revert "avformat/utils: make ff_ntp_time() accept a timestamp as input argument"James Almer2020-01-16
| | | | Signed-off-by: James Almer <jamrial@gmail.com>
* avformat/movenc: add a flag to enable CMAF compatabilityJames Almer2020-01-15
| | | | | | | Sets some required constrains and reports compatability with the relevant compatible brand. Signed-off-by: James Almer <jamrial@gmail.com>
* avformat/movenc: use AVProducerReferenceTime side data to write the prft atomJames Almer2020-01-15
| | | | | | | If not available, set flags to 24 (bits 4 and 5), to signal the wallclock value is read at the time of writing the atom. Signed-off-by: James Almer <jamrial@gmail.com>
* avformat/utils: make ff_ntp_time() accept a timestamp as input argumentJames Almer2020-01-15
| | | | | | Will be needed by the next patch. Signed-off-by: James Almer <jamrial@gmail.com>
* movenc: Write durations based on pts into mvhd/mdhd/tkhd/elstMartin Storsjö2020-01-10
| | | | | | | | | | | | | Keep all the existing data fields as they are (there's lots and lots of nontrivial calculation and heuristics based on them in their current form), but derive the duration as the difference between the pts of the first packet to the maximum pts+duration (not necessarily the last packet); use this duration in any box where the actual presentation duration is supposed to be. Fixes: 8420 Signed-off-by: Martin Storsjö <martin@martin.st>
* avformat: convert some avio_flush() calls to ↵Marton Balint2020-01-07
| | | | | | | | | | | | | | | | | avio_write_marker(AVIO_DATA_MARKER_FLUSH_POINT) Converting explicit avio_flush() calls helps us to buffer more data and avoid flushing the IO context too often which causes reduced IO throughput for non-streamed file output. The user can control FLUSH_POINT flushing behaviour using the -flush_packets option, the default typically means to flush unless a non-streamed file output is used, so this change should have no adverse effect on streaming even if it is assumed that after an avio_flush() the output buffer is clean so small seekbacks within the output buffer will work even when the IO context is not seekable. Signed-off-by: Marton Balint <cus@passwd.hu>
* avformat: remove avio_flush() calls from the end of write_header functionsMarton Balint2020-01-07
| | | | | | | | | | | | | | To make it consistent with other muxers. The user can still control the generic flushing behaviour after write_header (same way as after packets) using the -flush_packets option, the default typically means to flush unless a non-streamed file output is used. Therefore this change should have no adverse effect on streaming, even if it is assumed that the first packet has a clean buffer, so small seekbacks within the output buffer work even when the IO context is not seekable. Signed-off-by: Marton Balint <cus@passwd.hu>
* avformat/movenc: use iso6 major brand when signed CTS offsets are used in ↵James Almer2019-12-21
| | | | | | trun boxes Signed-off-by: James Almer <jamrial@gmail.com>
* avformat/movenc: ensure we don't write the major brand as a compatible brand ↵James Almer2019-12-21
| | | | | | more than once Signed-off-by: James Almer <jamrial@gmail.com>
* avformat/movenc: write the major brand also as the first compatible brandJames Almer2019-12-21
| | | | Signed-off-by: James Almer <jamrial@gmail.com>
* lavf/movenc: cosmeticsYuki Tsuchiya2019-12-12
| | | | | Signed-off-by: Yuki Tsuchiya <Yuki.Tsuchiya@sony.com> Signed-off-by: James Almer <jamrial@gmail.com>