fix ticket: #7021
Unified · Split
| @@ -765,7 +765,11 @@ static int hls_mux_init(AVFormatContext *s, VariantStream *vs) · 764 unmodified lines | ||
| 765 | 765 | if ((ret = avio_open_dyn_buf(&oc->pb)) < 0) |
| 766 | 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 | 773 | av_dict_free(&options); |
| 770 | 774 | if (ret < 0) { |
| 771 | 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 | 1403 | 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); | |
| 1402 | 1406 | } |
| 1403 | 1407 | |
| 1404 | 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 | 2181 | av_write_frame(vs->avf, NULL); /* Flush any buffered data */ |
| 2178 | 2182 | |
| 2179 | 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 | 2190 | if (hls->segment_type == SEGMENT_TYPE_FMP4) { |
| 2184 | 2191 | if (!vs->init_range_length) { |
| 2185 | 2192 | avio_flush(oc->pb); |
| @@ -2188,16 +2195,22 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) · 2 unmodified lines | ||
| 2188 | 2195 | vs->init_range_length = range_length; |
| 2189 | 2196 | avio_open_dyn_buf(&oc->pb); |
| 2190 | 2197 | 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 | + } | |
| 2193 | 2203 | } |
| 2194 | 2204 | } else { |
| 2205 | + if (!byterange_mode) { | |
| 2195 | 2206 | hlsenc_io_close(s, &oc->pb, oc->url); |
| 2207 | + } | |
| 2196 | 2208 | } |
| 2209 | + if (!byterange_mode) { | |
| 2197 | 2210 | if (vs->vtt_avf) { |
| 2198 | 2211 | hlsenc_io_close(s, &vs->vtt_avf->pb, vs->vtt_avf->url); |
| 2199 | 2212 | } |
| 2200 | − } | |
| 2213 | + } | |
| 2201 | 2214 | if ((hls->flags & HLS_TEMP_FILE) && oc->url[0]) { |
| 2202 | 2215 | if (!(hls->flags & HLS_SINGLE_FILE) || (hls->max_seg_size <= 0)) |
| 2203 | 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 | 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 | 2234 | ret = hlsenc_io_open(s, &vs->out, vs->avf->url, NULL); |
| 2214 | 2235 | if (ret < 0) { |
| 2215 | 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 | 2243 | return ret; |
| 2223 | 2244 | } |
| 2224 | 2245 | ff_format_io_close(s, &vs->out); |
| 2246 | + } | |
| 2225 | 2247 | } |
| 2226 | 2248 | |
| 2227 | 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 | 2251 | return AVERROR(ENOMEM); |
| 2230 | 2252 | } |
| 2231 | 2253 | |
| 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 | + } | |
| 2237 | 2262 | } |
| 2238 | 2263 | |
| 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 | + } | |
| 2241 | 2269 | |
| 2242 | 2270 | vs->fmp4_init_mode = 0; |
| 2243 | 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 | 2326 | if ( hls->segment_type == SEGMENT_TYPE_FMP4) { |
| 2299 | 2327 | int range_length = 0; |
| 2328 | + if (!(hls->flags & HLS_SINGLE_FILE)) { | |
| 2300 | 2329 | ret = hlsenc_io_open(s, &vs->out, vs->avf->url, NULL); |
| 2301 | 2330 | if (ret < 0) { |
| 2302 | 2331 | av_log(NULL, AV_LOG_ERROR, "Failed to open file '%s'\n", vs->avf->url); |
| 2303 | 2332 | goto failed; |
| 2304 | 2333 | } |
| 2305 | 2334 | write_styp(vs->out); |
| 2335 | + } | |
| 2306 | 2336 | ret = flush_dynbuf(vs, &range_length); |
| 2307 | 2337 | if (ret < 0) { |
| 2308 | 2338 | goto failed; |
| @@ -2313,7 +2343,11 @@ static int hls_write_trailer(struct AVFormatContext *s) · 4 unmodified lines | ||
| 2313 | 2343 | failed: |
| 2314 | 2344 | av_write_trailer(oc); |
| 2315 | 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 | 2351 | if (hls->segment_type != SEGMENT_TYPE_FMP4) |
| 2318 | 2352 | ff_format_io_close(s, &oc->pb); |
| 2319 | 2353 | |