fix ticket: #7021
Unified · Split
| @@ -765,7 +765,11 @@ static int hls_mux_init(AVFormatContext *s, VariantStream *vs) · 764 unmodified lines | |||
| 765 | if ((ret = avio_open_dyn_buf(&oc->pb)) < 0) | 765 | if ((ret = avio_open_dyn_buf(&oc->pb)) < 0) |
| 766 | return ret; | 766 | return ret; |
| 767 | 767 | ||
| 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 | } | ||
| 769 | av_dict_free(&options); | 773 | av_dict_free(&options); |
| 770 | if (ret < 0) { | 774 | if (ret < 0) { |
| 771 | av_log(s, AV_LOG_ERROR, "Failed to open segment '%s'\n", vs->fmp4_init_filename); | 775 | 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 | |||
| 1397 | } | 1401 | } |
| 1398 | 1402 | ||
| 1399 | if ((hls->segment_type == SEGMENT_TYPE_FMP4) && (en == vs->segments)) { | 1403 | if ((hls->segment_type == SEGMENT_TYPE_FMP4) && (en == vs->segments)) { |
| 1400 | ff_hls_write_init_file(hls->m3u8_out, vs->fmp4_init_filename, | 1404 | ff_hls_write_init_file(hls->m3u8_out, (hls->flags & HLS_SINGLE_FILE) ? en->filename : vs->fmp4_init_filename, |
| 1401 | hls->flags & HLS_SINGLE_FILE, en->size, en->pos); | 1405 | hls->flags & HLS_SINGLE_FILE, vs->init_range_length, 0); |
| 1402 | } | 1406 | } |
| 1403 | 1407 | ||
| 1404 | ret = ff_hls_write_file_entry(hls->m3u8_out, en->discont, byterange_mode, | 1408 | 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 | |||
| 2177 | av_write_frame(vs->avf, NULL); /* Flush any buffered data */ | 2181 | av_write_frame(vs->avf, NULL); /* Flush any buffered data */ |
| 2178 | 2182 | ||
| 2179 | new_start_pos = avio_tell(vs->avf->pb); | 2183 | 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 | } | ||
| 2181 | 2189 | ||
| 2182 | if (!byterange_mode) { | ||
| 2183 | if (hls->segment_type == SEGMENT_TYPE_FMP4) { | 2190 | if (hls->segment_type == SEGMENT_TYPE_FMP4) { |
| 2184 | if (!vs->init_range_length) { | 2191 | if (!vs->init_range_length) { |
| 2185 | avio_flush(oc->pb); | 2192 | avio_flush(oc->pb); |
| @@ -2188,16 +2195,22 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) · 2 unmodified lines | |||
| 2188 | vs->init_range_length = range_length; | 2195 | vs->init_range_length = range_length; |
| 2189 | avio_open_dyn_buf(&oc->pb); | 2196 | avio_open_dyn_buf(&oc->pb); |
| 2190 | vs->packets_written = 0; | 2197 | vs->packets_written = 0; |
| 2191 | ff_format_io_close(s, &vs->out); | 2198 | vs->start_pos = range_length; |
| 2192 | hlsenc_io_close(s, &vs->out, vs->base_output_dirname); | 2199 | if (!byterange_mode) { |
| 2200 | ff_format_io_close(s, &vs->out); | ||
| 2201 | hlsenc_io_close(s, &vs->out, vs->base_output_dirname); | ||
| 2202 | } | ||
| 2193 | } | 2203 | } |
| 2194 | } else { | 2204 | } else { |
| 2205 | if (!byterange_mode) { | ||
| 2195 | hlsenc_io_close(s, &oc->pb, oc->url); | 2206 | hlsenc_io_close(s, &oc->pb, oc->url); |
| 2207 | } | ||
| 2196 | } | 2208 | } |
| 2209 | if (!byterange_mode) { | ||
| 2197 | if (vs->vtt_avf) { | 2210 | if (vs->vtt_avf) { |
| 2198 | hlsenc_io_close(s, &vs->vtt_avf->pb, vs->vtt_avf->url); | 2211 | hlsenc_io_close(s, &vs->vtt_avf->pb, vs->vtt_avf->url); |
| 2199 | } | 2212 | } |
| 2200 | } | 2213 | } |
| 2201 | if ((hls->flags & HLS_TEMP_FILE) && oc->url[0]) { | 2214 | if ((hls->flags & HLS_TEMP_FILE) && oc->url[0]) { |
| 2202 | if (!(hls->flags & HLS_SINGLE_FILE) || (hls->max_seg_size <= 0)) | 2215 | if (!(hls->flags & HLS_SINGLE_FILE) || (hls->max_seg_size <= 0)) |
| 2203 | if ((vs->avf->oformat->priv_class && vs->avf->priv_data) && hls->segment_type != SEGMENT_TYPE_FMP4) | 2216 | 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 | |||
| 2210 | } | 2223 | } |
| 2211 | 2224 | ||
| 2212 | if (hls->segment_type == SEGMENT_TYPE_FMP4) { | 2225 | 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 { | ||
| 2213 | ret = hlsenc_io_open(s, &vs->out, vs->avf->url, NULL); | 2234 | ret = hlsenc_io_open(s, &vs->out, vs->avf->url, NULL); |
| 2214 | if (ret < 0) { | 2235 | if (ret < 0) { |
| 2215 | av_log(NULL, AV_LOG_ERROR, "Failed to open file '%s'\n", | 2236 | 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 | |||
| 2222 | return ret; | 2243 | return ret; |
| 2223 | } | 2244 | } |
| 2224 | ff_format_io_close(s, &vs->out); | 2245 | ff_format_io_close(s, &vs->out); |
| 2246 | } | ||
| 2225 | } | 2247 | } |
| 2226 | 2248 | ||
| 2227 | old_filename = av_strdup(vs->avf->url); | 2249 | old_filename = av_strdup(vs->avf->url); |
| @@ -2229,15 +2251,21 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) · 1 unmodified line | |||
| 2229 | return AVERROR(ENOMEM); | 2251 | return AVERROR(ENOMEM); |
| 2230 | } | 2252 | } |
| 2231 | 2253 | ||
| 2232 | ret = hls_append_segment(s, hls, vs, vs->duration, vs->start_pos, vs->size); | 2254 | if (vs->start_pos || hls->segment_type != SEGMENT_TYPE_FMP4) { |
| 2233 | vs->start_pos = new_start_pos; | 2255 | ret = hls_append_segment(s, hls, vs, vs->duration, vs->start_pos, vs->size); |
| 2234 | if (ret < 0) { | 2256 | vs->end_pts = pkt->pts; |
| 2235 | av_free(old_filename); | 2257 | vs->duration = 0; |
| 2236 | return ret; | 2258 | if (ret < 0) { |
| 2259 | av_free(old_filename); | ||
| 2260 | return ret; | ||
| 2261 | } | ||
| 2237 | } | 2262 | } |
| 2238 | 2263 | ||
| 2239 | vs->end_pts = pkt->pts; | 2264 | if (hls->segment_type != SEGMENT_TYPE_FMP4) { |
| 2240 | vs->duration = 0; | 2265 | vs->start_pos = new_start_pos; |
| 2266 | } else { | ||
| 2267 | vs->start_pos += vs->size; | ||
| 2268 | } | ||
| 2241 | 2269 | ||
| 2242 | vs->fmp4_init_mode = 0; | 2270 | vs->fmp4_init_mode = 0; |
| 2243 | if (hls->flags & HLS_SINGLE_FILE) { | 2271 | if (hls->flags & HLS_SINGLE_FILE) { |
| @@ -2297,12 +2325,14 @@ static int hls_write_trailer(struct AVFormatContext *s) · 53 unmodified lines | |||
| 2297 | } | 2325 | } |
| 2298 | if ( hls->segment_type == SEGMENT_TYPE_FMP4) { | 2326 | if ( hls->segment_type == SEGMENT_TYPE_FMP4) { |
| 2299 | int range_length = 0; | 2327 | int range_length = 0; |
| 2328 | if (!(hls->flags & HLS_SINGLE_FILE)) { | ||
| 2300 | ret = hlsenc_io_open(s, &vs->out, vs->avf->url, NULL); | 2329 | ret = hlsenc_io_open(s, &vs->out, vs->avf->url, NULL); |
| 2301 | if (ret < 0) { | 2330 | if (ret < 0) { |
| 2302 | av_log(NULL, AV_LOG_ERROR, "Failed to open file '%s'\n", vs->avf->url); | 2331 | av_log(NULL, AV_LOG_ERROR, "Failed to open file '%s'\n", vs->avf->url); |
| 2303 | goto failed; | 2332 | goto failed; |
| 2304 | } | 2333 | } |
| 2305 | write_styp(vs->out); | 2334 | write_styp(vs->out); |
| 2335 | } | ||
| 2306 | ret = flush_dynbuf(vs, &range_length); | 2336 | ret = flush_dynbuf(vs, &range_length); |
| 2307 | if (ret < 0) { | 2337 | if (ret < 0) { |
| 2308 | goto failed; | 2338 | goto failed; |
| @@ -2313,7 +2343,11 @@ static int hls_write_trailer(struct AVFormatContext *s) · 4 unmodified lines | |||
| 2313 | failed: | 2343 | failed: |
| 2314 | av_write_trailer(oc); | 2344 | av_write_trailer(oc); |
| 2315 | if (oc->pb) { | 2345 | 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 | } | ||
| 2317 | if (hls->segment_type != SEGMENT_TYPE_FMP4) | 2351 | if (hls->segment_type != SEGMENT_TYPE_FMP4) |
| 2318 | ff_format_io_close(s, &oc->pb); | 2352 | ff_format_io_close(s, &oc->pb); |
| 2319 | 2353 | ||