summaryrefslogtreecommitdiff
path: root/libavformat/hlsenc.c
Commit message (Collapse)AuthorAge
* avformat/hlsenc: Always treat numbers as decimalAndreas Rheinhardt2020-06-15
| | | | | | | | | | | c801ab43c36e8c4f88121aa09af26c77bcbd671b caused a regression: The stream number is now parsed with strtoll without a fixed basis; as a consequence, the "010" in a variant stream mapping like "a:010" is now treated as an octal number (i.e. as eight, not ten). This was not intended and may break some scripts, so this commit restores the old behaviour. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat/hlsenc, hlsplaylist: CosmeticsAndreas Rheinhardt2020-05-28
| | | | Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat/hlsenc: Avoid duplicating strings when parsingAndreas Rheinhardt2020-05-28
| | | | | | | | | | | | | | | | | | | Up until now, the HLS muxer uses av_strtok() to split an input string controlling parameters of the VariantStreams and then duplicates parts of this string containing parameters such as the language or the name of the VariantStream. But these parts are proper zero-terminated strings of their own that are never modified lateron, so one can simply use the substring as-is without creating a copy. This commit implements this. The same also happened for the string controlling the closed caption groups. Furthermore, add const to indicate that the pointers to these substrings are not used to modify them and also to indicate that these strings are not allocated on their own. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat/hlsenc: Don't unnecessarily duplicate baseurl stringAndreas Rheinhardt2020-05-28
| | | | | | | | Up until now, the HLS muxer duplicated a string for every VariantStream, although neither the original nor the copies are ever modified. So use the original directly and stop copying. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat/hlsenc: Don't segfault on uncommon namesAndreas Rheinhardt2020-05-17
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The parsing process of the AVOpt-enabled string controlling the mapping of input streams to variant streams is roughly as follows: Space and tab separate variant stream group maps while the entries in each variant stream group map are separated by ','. The parsing process of each variant stream group proceeded as follows: At first the number of occurences of "a:", "v:" and "s:" in each variant stream group is calculated so that one can can allocate an array of streams with this number of entries. Then the string is split along ',' and each substring is parsed. If such a substring starts with "a:", "s:" or "v:" it is treated as stream specifier and (if there is a correct number after ':') a stream of the variant stream is mapped to one of the actual input streams. Nothing actually guarantees that the number of streams allocated initially equals the number of streams that are mapped to an actual input stream. These numbers can differ if e.g. the name, the sgroup, agroup or ccgroup of the variant stream contain "a:", "s:" or "v:". The problem hereby is that the rest of the code presumes these numbers to be equal and segfaults if it isn't (because the corresponding input stream is NULL). This commit fixes this by modifying the initial counting process to only count occurences of "a:", "s:" or "v:" that are at the beginning or that immediately follow a ','. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat/hlsenc: free options fix memleak in hls_write_trailerSteven Liu2020-05-12
| | | | Signed-off-by: Steven Liu <liuqi05@kuaishou.com>
* avformat/hlsenc: fix filename memleak in hls_write_packetSteven Liu2020-05-12
| | | | Signed-off-by: Steven Liu <liuqi05@kuaishou.com>
* avformat/hlsenc: move number out of hls_startSteven Liu2020-05-12
| | | | Signed-off-by: Steven Liu <liuqi05@kuaishou.com>
* avformat/hlsenc: Simplify setting base_output_dirnameAndreas Rheinhardt2020-05-10
| | | | Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat/hlsenc: Simplify setting basename with av_asprintf()Andreas Rheinhardt2020-05-10
| | | | Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat/hlsenc: Simplify setting subtitle basename with av_asprintfAndreas Rheinhardt2020-05-10
| | | | Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat/hlsenc: Don't cast const awayAndreas Rheinhardt2020-05-10
| | | | Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat/hlsenc: Remove redundant initializationsAndreas Rheinhardt2020-05-10
| | | | | | | | | | | | | For every variantstream vs, vs->packets_written is set to one, only to be set to zero a few lines below. Given that the relevant structure has been zeroed during the allocation, this commit removes both assignments. A redundant initialization for vs->init_range_length has been removed as well a few lines below. Given that the relevant structure has been zeroed during the allocation, this commit removes both assignments. A redundant initialization for vs->init_range_length has been removed as well. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat/hlsenc: Don't reset AVIOContext pointer manually a second timeAndreas Rheinhardt2020-05-10
| | | | | | ff_format_io_close() already does it for us. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat/hlsenc: CosmeticsAndreas Rheinhardt2020-05-08
| | | | | | | Mainly includes reindentation and returning directly (i.e. without a goto fail when possible). Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat/hlsenc: Factor check out of loopAndreas Rheinhardt2020-05-08
| | | | | | The check will be true at most once anyway. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat/hlsenc: Localize initialization of subtitle streamsAndreas Rheinhardt2020-05-08
| | | | | | Before this commit, the checks were unnecessarily scattered. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat/hlsenc: Unconditionally free some stringsAndreas Rheinhardt2020-05-08
| | | | | | | | | | | | hls_init() would at first allocate the vtt_basename string, then allocate the vtt_m3u8_name string followed by several operations that may fail and then open the subtitles' output context. Yet upon freeing, these strings were only freed when the subtitles' output context existed, ensuring that they leak if something goes wrong between their allocation and the opening of the subtitles' output context. So drop the check for whether this output context exists. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat/hlsenc: Check some unchecked allocationsAndreas Rheinhardt2020-05-08
| | | | Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat/hlsenc: Add deinit functionAndreas Rheinhardt2020-05-08
| | | | | | | | | | | | | | | | This fixes memleaks in instances such as: a) When an allocation fails at one of the two places in hls_init() where the error is returned immediately without goto fail first. b) When an error happens when writing the header. c) When an allocation fails at one of the three places in hls_write_trailer() where the error is returned immediately without goto fail first. d) When one decides not to write the trailer at all (e.g. because of errors when writing packets). Furthermore, it removes code duplication and allows to return immediately, without goto fail first. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat/hlsenc: Avoid setting unused variablesAndreas Rheinhardt2020-05-08
| | | | | | | Several variables which are only used when the HLS_SINGLE_FILE flag is unset have been set even when this flag is set. This has been changed. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat/hlsenc: Remove redundant setting of output formatAndreas Rheinhardt2020-05-07
| | | | | | | | avformat_alloc_output_context2() already sets the oformat member, so that there is no reason to overwrite it again with the value it already has. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat/hlsenc: Improve checks for invalid stream mappingsAndreas Rheinhardt2020-05-06
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The mapping of streams to the various variant streams to be created by the HLS muxer is roughly as follows: Space and tab separate variant stream group maps while the entries in each variant stream group map are separated by ','. The parsing process of each variant stream group proceeded as follows: At first the number of occurences of "a:", "v:" and "s:" in each variant stream group is calculated so that one can can allocate an array of streams with this number of entries. Then each entry is checked and the check for stream numbers was deficient: It did check that there is a number beginning after the ":", but it did not check that the number extends until the next "," (or until the end). This means that an invalid variant stream group like v:0_v:1 will not be rejected; the problem is that the variant stream in this example is supposed to have two streams associated with it (because it contains two "v:"), yet only one stream is actually associated with it (because there is no ',' to start a second stream specifier). This discrepancy led to segfaults (null pointer dereferencing) in the rest of the code (when the nonexistent second stream associated to the variant stream was inspected). Furthermore, this commit also removes an instance of using atoi() whose behaviour on a range error is undefined. Fixes ticket #8652. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat/hlsenc: resend full url of the init fragment mp4Steven Liu2020-05-06
| | | | | | | | | fix ticket: 8651 because the init fragment mp4 file name is without base url name, so just modify it use the full url which splice after init function. Tested-by: matclayton Signed-off-by: Steven Liu <liuqi05@kuaishou.com>
* libavformat/hlsenc: Allow usage of 'periodic-rekey' with multi-variant streamsYaroslav Pogrebnyak2020-05-06
| | | | | | | | | | | | | | | | This patch adds possibility to use 'periodic-rekey' option with multi-variant streams to hlsenc muxer. All streams variants use parameters from the same key_info_file. There are 2 sets of encryption options that kind of overlaps and add complexity, so I tried to do the thing without changing too much code. There is a little duplication of the key_file, key_uri, iv_string, etc in the VariantStream since we copy it from hls to each variant stream, but generally all the code remains the same to minimise appearing of unexpected bugs. Refactoring could be done as a separate patch then as needed. Signed-off-by: Yaroslav Pogrebnyak <yyyaroslav@gmail.com>
* avformat/hlsenc: compute segment duration use current pts minus last segment ↵Steven Liu2020-05-06
| | | | | | | | | | | | | end pts segment duration is using vs duration which compute by frame per second, that can not fix problem of VFR video stream, so compute the duration when split the segment, set the segment target duration use current packet pts minus the prev segment end pts.. Reported-by: Zhao Jun <barryjzhao@tencent.com> Reviewed-by: Zhao Jun <barryjzhao@tencent.com> Signed-off-by: Steven Liu <liuqi05@kuaishou.com>
* avformat/hlsenc: add support for microseconds since epoch based sequence numberMarton Balint2020-05-01
| | | | | | | | | Sequence numbers of segments should be unique, if an encoder is using shorter than 1 second segments and it is restarted, then future segments will be using already used sequence numbers if initial sequence number is based on the number of seconds since epoch and not microseconds. Signed-off-by: Marton Balint <cus@passwd.hu>
* avformat/hlsenc: add hls_fmp4_init_resend optionSteven Liu2020-04-15
| | | | | | add option for resend init file after m3u8 refresh everytime. Signed-off-by: Steven Liu <lq@chinaffmpeg.org>
* avformat/hlsenc: return media_url directly if failed to get seperatorLimin Wang2020-04-10
| | | | | Fix ticket: 8606 Signed-off-by: Limin Wang <lance.lmwang@gmail.com>
* avformat/hlsenc: use av_asprintf()Limin Wang2020-04-08
| | | | Signed-off-by: Limin Wang <lance.lmwang@gmail.com>
* avformat/hlsenc: Factor out deleting files from deleting segmentsAndreas Rheinhardt2020-04-08
| | | | | | Removes code duplication. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat: add subtitle support in master playlist m3u8Limin Wang2020-04-08
| | | | | | | | | | | | | | | | | | | | | | | | | Test with the following command for the webvtt subtitle: $ ./ffmpeg -y -i input_with_subtitle.mkv \ -b:v:0 5250k -c:v h264 -pix_fmt yuv420p -profile:v main -level 4.1 \ -b:a:0 256k \ -c:s webvtt -c:a mp2 -ar 48000 -ac 2 -map 0:v -map 0:a:0 -map 0:s:0 \ -f hls -var_stream_map "v:0,a:0,s:0,sgroup:subtitle" \ -master_pl_name master.m3u8 -t 300 -hls_time 10 -hls_init_time 4 -hls_list_size \ 10 -master_pl_publish_rate 10 -hls_flags \ delete_segments+discont_start+split_by_time ./tmp/video.m3u8 Check the master m3u8: $ cat tmp/master.m3u8 #EXTM3U #EXT-X-VERSION:3 #EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subtitle",NAME="subtitle_0",DEFAULT=YES,URI="video_vtt.m3u8" #EXT-X-STREAM-INF:BANDWIDTH=6056600,RESOLUTION=1280x720,CODECS="avc1.4d4829,mp4a.40.33",SUBTITLES="subtitle" video.m3u8 Check the result by convert to mkv: $ ./ffmpeg -strict experimental -i ./tmp/master.m3u8 -c:v copy -c:a mp2 -c:s srt ./test.mkv Signed-off-by: Limin Wang <lance.lmwang@gmail.com>
* avformat/hlsenc: remove the first slash of the relative path line in the ↵Limin Wang2020-04-08
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | master m3u8 file Please testing with the following command: ./ffmpeg -y -i input.mkv \ -b:v:0 5250k -c:v h264 -pix_fmt yuv420p -profile:v main -level 4.1 \ -b:a:0 256k \ -c:a mp2 -ar 48000 -ac 2 -map 0:v -map 0:a:0\ -f hls -var_stream_map "v:0,a:0" \ -master_pl_name master.m3u8 -t 300 -hls_time 10 -hls_init_time 4 -hls_list_size \ 10 -master_pl_publish_rate 10 -hls_flags \ delete_segments+discont_start+split_by_time ./tmp/video.m3u8 then cat ./tmp/master.m3u8 before: #EXTM3U #EXT-X-VERSION:3 #EXT-X-STREAM-INF:BANDWIDTH=6056600,RESOLUTION=1280x720,CODECS="avc1.4d4829,mp4a.40.33" /video.m3u8 $ ./ffmpeg -i ./tmp/master.m3u8 -c:v copy -c:a mp2 ./test.mkv [hls @ 0x7f82f9000000] Skip ('#EXT-X-VERSION:3') [hls @ 0x7f82f9000000] Opening '/video.m3u8' for reading [hls @ 0x7f82f9000000] parse_playlist error No such file or directory [/video.m3u8] ./tmp/master.m3u8: No such file or directory after: #EXTM3U #EXT-X-VERSION:3 #EXT-X-STREAM-INF:BANDWIDTH=6056600,RESOLUTION=1280x720,CODECS="avc1.4d4829,mp4a.40.33" video.m3u8 Signed-off-by: Limin Wang <lance.lmwang@gmail.com>
* avformat/hlsenc: Use AVBPrint to avoid allocations of stringsAndreas Rheinhardt2020-04-08
| | | | | | when deleting old segments. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat/hlsenc: Fix memleak when deleting old segmentsAndreas Rheinhardt2020-04-08
| | | | | | | | | | | if the directory name of the segments contains "%v". This memleak is caused by masking the pointer that will eventually be freed by a variable of the same name in a smaller scope. Therefore the pointer that gets freed is always NULL when it is freed and the allocated data leaks. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avformat/hlsenc: set the options when open the key info filesSteven Liu2020-03-12
| | | | | | make the options same as segments for the http put method Signed-off-by: Steven Liu <liuqi05@kuaishou.com>
* avformat/hlsenc: Fix initial setting for start_ptsHongcheng Zhong2020-03-12
| | | | | | | | | | | This patch fixes Bug #8469 If x264 baseline profile is used with other profiles, start_pts will be initialized to audio stream's first pts, while the duration is calculated based on video stream's pts. In this patch the start_pts is initialized with the correct stream's first pts. Signed-off-by: Hongcheng Zhong <sj.hc_Zhong@sjtu.edu.cn> Reviewed-by: Steven Liu <liuqi05@kuaishou.com>
* avformat/hlsenc: allow a custom SDT and PAT periodMarton Balint2020-02-05
| | | | | | | The default is not to write SDT and PAT periodically, only in the beginning of every segment. After this patch the user might override this if needed. Signed-off-by: Marton Balint <cus@passwd.hu>
* avformat/hlsenc: fix hls_ts_options with mpegtsMarton Balint2020-01-31
| | | | | | Was broken since cdbf8847ea97a985dfd55432e1384bb7fe5d2d3b. Signed-off-by: Marton Balint <cus@passwd.hu>
* avformat/hlsenc: fix default AES key file url with variant streamsBela Bodecs2020-01-20
| | | | | | | | | | | | | | Currently when hls_enc is active and there are multiple variant stream outputs, default key file url construction does not work, because it is based on the FormatContext' url field. But in case of multiple variant streams, it contains the variant m3u8 output playlist url that contains the %v placeholder. So the result key file url will hold the %v placeholder causing run time error message about "could not write the key file". This patch correct this behaviour, and use the master playlist url for constructing the output key file url when master playlist is vailable. Signed-off-by: Bela Bodecs <bodecsb@vivanet.hu>
* avformat/hlsenc: program_date_time and append_list flags conflictBela Bodecs2020-01-20
| | | | | | | | | | | | | | | | | | | | | | When program_date_time flag is present, in m3u8 playlist file each segment has a corresponding EXT-X-PROGRAM-DATE-TIME value. The intial program-date-time value is the actual current time at init and each new segment increments this value by its duration. When append_list flags is also present, existing playlist parsing by hls_append_segment treats existing segments as new segments regarding the program-date-time calculation. But it should not do that, because this way all real the new segments' EXT-X-PROGRAM-DATE-TIME values will be shifted erroneously by the sum duration of existing segments. Instead it should have decremented the initial program-date-time value by its duration. This would ensure that the first new segment's program-date-time value had the current time as it is expected. This patch corrects this behaviour and prevent existing segments to increment the value of initial_prog_date_time variable but decrements it. Reviewed-by: Steven Liu <lq@onvideo.cn> Signed-off-by: Bela Bodecs <bodecsb@vivanet.hu>
* avformat/hlsenc: compare without the last directory separator in ↵Steven Liu2020-01-20
| | | | | | | | | | get_relative_url fix ticket: 8461 there is no problem before commit 75aea52a1051a22bdebd0b7a8098ac6479a529a0 Reviewed-by: Derek Buitenhuis <derek.buitenhuis@gmail.com> Signed-off-by: Steven Liu <lq@chinaffmpeg.org>
* avformat: remove unneeded avio_flush() calls before calling avio_close_dyn_buf()Marton Balint2020-01-07
| | | | | | avio_close_dyn_buf() also does avio_flush(). Signed-off-by: Marton Balint <cus@passwd.hu>
* avformat/hlsenc: use AV_OPT_TYPE_DICT for hls_ts_optionsMarton Balint2020-01-01
| | | | | | Simplifies code and avoids memory leaks. Signed-off-by: Marton Balint <cus@passwd.hu>
* avformat/hlsenc: Fix check for presence of webvtt muxerAndreas Rheinhardt2019-12-23
| | | | | Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com> Reviewed-by: Steven Liu <lq@onvideo.cn>
* avformat/hlsenc: Fix memleaks with repeating parametersAndreas Rheinhardt2019-12-23
| | | | | | | | | | | When a parameter like e.g. language is contained more than once in the part of var_stream_map pertaining to a single VariantStream, the later one just overwrites the pointer to the earlier one, leading to a memleak. This commit changes this by handling the situation gracefully: The earlier string is silently freed first, so that the last one wins. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com> Reviewed-by: Steven Liu <lq@onvideo.cn>
* avformat/hlsenc: Fix return value from localtime_r failureAndreas Rheinhardt2019-12-23
| | | | | | | | | "If an error is detected, localtime_r() shall return a null pointer and set errno to indicate the error." Yet in case this happened in hls_init(), AVERROR(ENOMEM) has been returned. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com> Reviewed-by: Steven Liu <lq@onvideo.cn>
* avformat/hlsenc: Fix potential segfault upon allocation failureAndreas Rheinhardt2019-12-23
| | | | | | | | | | | | | | | | | | | | | | | | | The hls muxer allocates an array of VariantStreams, a structure that contains pointers to objects that need to be freed on their own. This means that the number of allocated VariantStreams needs to be correct when they are freed; yet the number of VariantStreams is set in update_variant_stream_info() resp. parse_variant_stream_mapstring() before the allocation has been checked for success, so that upon error an attempt would be made to free the objects whose pointers are positioned at position NULL (the location of VariantStreams) + offsetof(VariantStream, the corresponding pointer). Furthermore d1fe1344 added another possibility for the first function to leave an inconsistent state behind: If an allocation of one of the objects referenced by the VariantStream fails, the VariantStream will be freed, but the number of allocated VariantStreams isn't reset, leading to the same problem as above. (This was done in the mistaken belief that the VariantStreams array would leak otherwise.) Essentially the same also happens for the number of cc-streams. It has been fixed, too. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com> Reviewed-by: Steven Liu <lq@onvideo.cn>
* avformat/hlsenc: Fix leak of options when writing packetsAndreas Rheinhardt2019-12-23
| | | | | | | | | | | | | | | | | | | | | Under certain circumstances hls_write_packet() would add options to an AVDictionary. Said dictionary was never explicitly freed, instead it was presumed that these options would be consumed when opening a new IO-context. This left several possibilities for memleaks: a) When no new IO-context would be opened at all. This is possible when using both the flags temp_file and single_file together with a file output. b) When an error happens before one actually tries to open the new IO-context. c) When the new IO-context does not consume all options. All three have been fixed; furthermore, the AVDictionary has been put into a smaller scope (namely the only part of hls_write_packet() where it is actually used). Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com> Reviewed-by: Steven Liu <lq@onvideo.cn>
* avformat/hlsenc: Fix leak of options when initializing muxing failsAndreas Rheinhardt2019-12-23
| | | | | | | | | | | | | | | | | hls_mux_init() currently leaks an AVDictionary if opening a dynamic buffer fails or if avformat_init_output fails. This has been fixed by moving the initialization resp. the freeing of the dictionary around: In the former case to a place after opening the dynamic buffer, in the latter to a place before the check for initialization failure so that it is done unconditionally. Furthermore, the dictionary is now only copied and freed if the options in it are actually used (namely when in SEGMENT_TYPE_FMP4 mode). Finally, a similar situation in hls_start() has been fixed, too. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com> Reviewed-by: Steven Liu <lq@onvideo.cn>