History

avformat/hlsenc: fix fmp4 single init file problem

fix ticket: #7021

Steven Liu committed 8 years ago

Commit c8f625f1 parent c6086691 file · +50 −16Browse files

Unified · Split

libavformat/hlsenc.c+50−16
@@ -765,7 +765,11 @@ static int hls_mux_init(AVFormatContext *s, VariantStream *vs) · 764 unmodified lines
765765 if ((ret = avio_open_dyn_buf(&oc->pb)) < 0)
766766 return ret;
767767
768− ret = hlsenc_io_open(s, &vs->out, vs->base_output_dirname, &options);
768+ if (byterange_mode) {
769+ ret = hlsenc_io_open(s, &vs->out, vs->basename, &options);
770+ } else {
771+ ret = hlsenc_io_open(s, &vs->out, vs->base_output_dirname, &options);
772+ }
769773 av_dict_free(&options);
770774 if (ret < 0) {
771775 av_log(s, AV_LOG_ERROR, "Failed to open segment '%s'\n", vs->fmp4_init_filename);
@@ -1397,8 +1401,8 @@ static int hls_window(AVFormatContext *s, int last, VariantStream *vs) · 625 unmodified lines
13971401 }
13981402
13991403 if ((hls->segment_type == SEGMENT_TYPE_FMP4) && (en == vs->segments)) {
1400− ff_hls_write_init_file(hls->m3u8_out, vs->fmp4_init_filename,
1401− hls->flags & HLS_SINGLE_FILE, en->size, en->pos);
1404+ ff_hls_write_init_file(hls->m3u8_out, (hls->flags & HLS_SINGLE_FILE) ? en->filename : vs->fmp4_init_filename,
1405+ hls->flags & HLS_SINGLE_FILE, vs->init_range_length, 0);
14021406 }
14031407
14041408 ret = ff_hls_write_file_entry(hls->m3u8_out, en->discont, byterange_mode,
@@ -2177,9 +2181,12 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) · 772 unmodified lines
21772181 av_write_frame(vs->avf, NULL); /* Flush any buffered data */
21782182
21792183 new_start_pos = avio_tell(vs->avf->pb);
2180− vs->size = new_start_pos - vs->start_pos;
2184+ if (hls->segment_type != SEGMENT_TYPE_FMP4) {
2185+ vs->size = new_start_pos - vs->start_pos;
2186+ } else {
2187+ vs->size = new_start_pos;
2188+ }
21812189
2182− if (!byterange_mode) {
21832190 if (hls->segment_type == SEGMENT_TYPE_FMP4) {
21842191 if (!vs->init_range_length) {
21852192 avio_flush(oc->pb);
@@ -2188,16 +2195,22 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) · 2 unmodified lines
21882195 vs->init_range_length = range_length;
21892196 avio_open_dyn_buf(&oc->pb);
21902197 vs->packets_written = 0;
2191− ff_format_io_close(s, &vs->out);
2192− hlsenc_io_close(s, &vs->out, vs->base_output_dirname);
2198+ vs->start_pos = range_length;
2199+ if (!byterange_mode) {
2200+ ff_format_io_close(s, &vs->out);
2201+ hlsenc_io_close(s, &vs->out, vs->base_output_dirname);
2202+ }
21932203 }
21942204 } else {
2205+ if (!byterange_mode) {
21952206 hlsenc_io_close(s, &oc->pb, oc->url);
2207+ }
21962208 }
2209+ if (!byterange_mode) {
21972210 if (vs->vtt_avf) {
21982211 hlsenc_io_close(s, &vs->vtt_avf->pb, vs->vtt_avf->url);
21992212 }
2200− }
2213+ }
22012214 if ((hls->flags & HLS_TEMP_FILE) && oc->url[0]) {
22022215 if (!(hls->flags & HLS_SINGLE_FILE) || (hls->max_seg_size <= 0))
22032216 if ((vs->avf->oformat->priv_class && vs->avf->priv_data) && hls->segment_type != SEGMENT_TYPE_FMP4)
@@ -2210,6 +2223,14 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) · 6 unmodified lines
22102223 }
22112224
22122225 if (hls->segment_type == SEGMENT_TYPE_FMP4) {
2226+ if (hls->flags & HLS_SINGLE_FILE) {
2227+ ret = flush_dynbuf(vs, &range_length);
2228+ if (ret < 0) {
2229+ av_free(old_filename);
2230+ return ret;
2231+ }
2232+ vs->size = range_length;
2233+ } else {
22132234 ret = hlsenc_io_open(s, &vs->out, vs->avf->url, NULL);
22142235 if (ret < 0) {
22152236 av_log(NULL, AV_LOG_ERROR, "Failed to open file '%s'\n",
@@ -2222,6 +2243,7 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) · 6 unmodified lines
22222243 return ret;
22232244 }
22242245 ff_format_io_close(s, &vs->out);
2246+ }
22252247 }
22262248
22272249 old_filename = av_strdup(vs->avf->url);
@@ -2229,15 +2251,21 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) · 1 unmodified line
22292251 return AVERROR(ENOMEM);
22302252 }
22312253
2232− ret = hls_append_segment(s, hls, vs, vs->duration, vs->start_pos, vs->size);
2233− vs->start_pos = new_start_pos;
2234− if (ret < 0) {
2235− av_free(old_filename);
2236− return ret;
2254+ if (vs->start_pos || hls->segment_type != SEGMENT_TYPE_FMP4) {
2255+ ret = hls_append_segment(s, hls, vs, vs->duration, vs->start_pos, vs->size);
2256+ vs->end_pts = pkt->pts;
2257+ vs->duration = 0;
2258+ if (ret < 0) {
2259+ av_free(old_filename);
2260+ return ret;
2261+ }
22372262 }
22382263
2239− vs->end_pts = pkt->pts;
2240− vs->duration = 0;
2264+ if (hls->segment_type != SEGMENT_TYPE_FMP4) {
2265+ vs->start_pos = new_start_pos;
2266+ } else {
2267+ vs->start_pos += vs->size;
2268+ }
22412269
22422270 vs->fmp4_init_mode = 0;
22432271 if (hls->flags & HLS_SINGLE_FILE) {
@@ -2297,12 +2325,14 @@ static int hls_write_trailer(struct AVFormatContext *s) · 53 unmodified lines
22972325 }
22982326 if ( hls->segment_type == SEGMENT_TYPE_FMP4) {
22992327 int range_length = 0;
2328+ if (!(hls->flags & HLS_SINGLE_FILE)) {
23002329 ret = hlsenc_io_open(s, &vs->out, vs->avf->url, NULL);
23012330 if (ret < 0) {
23022331 av_log(NULL, AV_LOG_ERROR, "Failed to open file '%s'\n", vs->avf->url);
23032332 goto failed;
23042333 }
23052334 write_styp(vs->out);
2335+ }
23062336 ret = flush_dynbuf(vs, &range_length);
23072337 if (ret < 0) {
23082338 goto failed;
@@ -2313,7 +2343,11 @@ static int hls_write_trailer(struct AVFormatContext *s) · 4 unmodified lines
23132343 failed:
23142344 av_write_trailer(oc);
23152345 if (oc->pb) {
2316− vs->size = avio_tell(vs->avf->pb) - vs->start_pos;
2346+ if (hls->segment_type != SEGMENT_TYPE_FMP4) {
2347+ vs->size = avio_tell(vs->avf->pb) - vs->start_pos;
2348+ } else {
2349+ vs->size = avio_tell(vs->avf->pb);
2350+ }
23172351 if (hls->segment_type != SEGMENT_TYPE_FMP4)
23182352 ff_format_io_close(s, &oc->pb);
23192353

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t