Unified · Split
| @@ -2173,7 +2173,7 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) · 2172 unmodified lines | |||
| 2173 | } | 2173 | } |
| 2174 | 2174 | ||
| 2175 | if (vs->packets_written && can_split && av_compare_ts(pkt->pts - vs->start_pts, st->time_base, | 2175 | if (vs->packets_written && can_split && av_compare_ts(pkt->pts - vs->start_pts, st->time_base, |
| 2176 | end_pts, AV_TIME_BASE_Q) >= 0) { | 2176 | end_pts, AV_TIME_BASE_Q) >= 0) { |
| 2177 | int64_t new_start_pos; | 2177 | int64_t new_start_pos; |
| 2178 | char *old_filename = NULL; | 2178 | char *old_filename = NULL; |
| 2179 | int byterange_mode = (hls->flags & HLS_SINGLE_FILE) || (hls->max_seg_size > 0); | 2179 | int byterange_mode = (hls->flags & HLS_SINGLE_FILE) || (hls->max_seg_size > 0); |
| @@ -2187,30 +2187,30 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) · 7 unmodified lines | |||
| 2187 | vs->size = new_start_pos; | 2187 | vs->size = new_start_pos; |
| 2188 | } | 2188 | } |
| 2189 | 2189 | ||
| 2190 | if (hls->segment_type == SEGMENT_TYPE_FMP4) { | 2190 | if (hls->segment_type == SEGMENT_TYPE_FMP4) { |
| 2191 | if (!vs->init_range_length) { | 2191 | if (!vs->init_range_length) { |
| 2192 | avio_flush(oc->pb); | 2192 | avio_flush(oc->pb); |
| 2193 | range_length = avio_close_dyn_buf(oc->pb, &buffer); | 2193 | range_length = avio_close_dyn_buf(oc->pb, &buffer); |
| 2194 | avio_write(vs->out, buffer, range_length); | 2194 | avio_write(vs->out, buffer, range_length); |
| 2195 | vs->init_range_length = range_length; | 2195 | vs->init_range_length = range_length; |
| 2196 | avio_open_dyn_buf(&oc->pb); | 2196 | avio_open_dyn_buf(&oc->pb); |
| 2197 | vs->packets_written = 0; | 2197 | vs->packets_written = 0; |
| 2198 | vs->start_pos = range_length; | 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 | } | ||
| 2203 | } | ||
| 2204 | } else { | ||
| 2205 | if (!byterange_mode) { | 2199 | if (!byterange_mode) { |
| 2206 | hlsenc_io_close(s, &oc->pb, oc->url); | 2200 | ff_format_io_close(s, &vs->out); |
| 2201 | hlsenc_io_close(s, &vs->out, vs->base_output_dirname); | ||
| 2207 | } | 2202 | } |
| 2208 | } | 2203 | } |
| 2204 | } else { | ||
| 2209 | if (!byterange_mode) { | 2205 | if (!byterange_mode) { |
| 2206 | hlsenc_io_close(s, &oc->pb, oc->url); | ||
| 2207 | } | ||
| 2208 | } | ||
| 2209 | if (!byterange_mode) { | ||
| 2210 | if (vs->vtt_avf) { | 2210 | if (vs->vtt_avf) { |
| 2211 | 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); |
| 2212 | } | 2212 | } |
| 2213 | } | 2213 | } |
| 2214 | if ((hls->flags & HLS_TEMP_FILE) && oc->url[0]) { | 2214 | if ((hls->flags & HLS_TEMP_FILE) && oc->url[0]) { |
| 2215 | if (!(hls->flags & HLS_SINGLE_FILE) || (hls->max_seg_size <= 0)) | 2215 | if (!(hls->flags & HLS_SINGLE_FILE) || (hls->max_seg_size <= 0)) |
| 2216 | 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) |
| @@ -2231,18 +2231,18 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) · 14 unmodified lines | |||
| 2231 | } | 2231 | } |
| 2232 | vs->size = range_length; | 2232 | vs->size = range_length; |
| 2233 | } else { | 2233 | } else { |
| 2234 | ret = hlsenc_io_open(s, &vs->out, vs->avf->url, NULL); | 2234 | ret = hlsenc_io_open(s, &vs->out, vs->avf->url, NULL); |
| 2235 | if (ret < 0) { | 2235 | if (ret < 0) { |
| 2236 | av_log(NULL, AV_LOG_ERROR, "Failed to open file '%s'\n", | 2236 | av_log(s, AV_LOG_ERROR, "Failed to open file '%s'\n", |
| 2237 | vs->avf->url); | 2237 | vs->avf->url); |
| 2238 | return ret; | 2238 | return ret; |
| 2239 | } | 2239 | } |
| 2240 | write_styp(vs->out); | 2240 | write_styp(vs->out); |
| 2241 | ret = flush_dynbuf(vs, &range_length); | 2241 | ret = flush_dynbuf(vs, &range_length); |
| 2242 | if (ret < 0) { | 2242 | if (ret < 0) { |
| 2243 | return ret; | 2243 | return ret; |
| 2244 | } | 2244 | } |
| 2245 | ff_format_io_close(s, &vs->out); | 2245 | ff_format_io_close(s, &vs->out); |
| 2246 | } | 2246 | } |
| 2247 | } | 2247 | } |
| 2248 | 2248 | ||
| @@ -2316,85 +2316,85 @@ static int hls_write_trailer(struct AVFormatContext *s) · 67 unmodified lines | |||
| 2316 | for (i = 0; i < hls->nb_varstreams; i++) { | 2316 | for (i = 0; i < hls->nb_varstreams; i++) { |
| 2317 | vs = &hls->var_streams[i]; | 2317 | vs = &hls->var_streams[i]; |
| 2318 | 2318 | ||
| 2319 | oc = vs->avf; | 2319 | oc = vs->avf; |
| 2320 | vtt_oc = vs->vtt_avf; | 2320 | vtt_oc = vs->vtt_avf; |
| 2321 | old_filename = av_strdup(vs->avf->url); | 2321 | old_filename = av_strdup(vs->avf->url); |
| 2322 | 2322 | ||
| 2323 | if (!old_filename) { | 2323 | if (!old_filename) { |
| 2324 | return AVERROR(ENOMEM); | 2324 | return AVERROR(ENOMEM); |
| 2325 | } | ||
| 2326 | if ( hls->segment_type == SEGMENT_TYPE_FMP4) { | ||
| 2327 | int range_length = 0; | ||
| 2328 | if (!(hls->flags & HLS_SINGLE_FILE)) { | ||
| 2329 | ret = hlsenc_io_open(s, &vs->out, vs->avf->url, NULL); | ||
| 2330 | if (ret < 0) { | ||
| 2331 | av_log(NULL, AV_LOG_ERROR, "Failed to open file '%s'\n", vs->avf->url); | ||
| 2332 | goto failed; | ||
| 2333 | } | ||
| 2334 | write_styp(vs->out); | ||
| 2335 | } | 2325 | } |
| 2336 | ret = flush_dynbuf(vs, &range_length); | 2326 | if ( hls->segment_type == SEGMENT_TYPE_FMP4) { |
| 2337 | if (ret < 0) { | 2327 | int range_length = 0; |
| 2338 | goto failed; | 2328 | if (!(hls->flags & HLS_SINGLE_FILE)) { |
| 2329 | ret = hlsenc_io_open(s, &vs->out, vs->avf->url, NULL); | ||
| 2330 | if (ret < 0) { | ||
| 2331 | av_log(s, AV_LOG_ERROR, "Failed to open file '%s'\n", vs->avf->url); | ||
| 2332 | goto failed; | ||
| 2333 | } | ||
| 2334 | write_styp(vs->out); | ||
| 2335 | } | ||
| 2336 | ret = flush_dynbuf(vs, &range_length); | ||
| 2337 | if (ret < 0) { | ||
| 2338 | goto failed; | ||
| 2339 | } | ||
| 2340 | ff_format_io_close(s, &vs->out); | ||
| 2339 | } | 2341 | } |
| 2340 | ff_format_io_close(s, &vs->out); | ||
| 2341 | } | ||
| 2342 | 2342 | ||
| 2343 | failed: | 2343 | failed: |
| 2344 | av_write_trailer(oc); | 2344 | av_write_trailer(oc); |
| 2345 | if (oc->pb) { | 2345 | if (oc->pb) { |
| 2346 | if (hls->segment_type != SEGMENT_TYPE_FMP4) { | 2346 | if (hls->segment_type != SEGMENT_TYPE_FMP4) { |
| 2347 | vs->size = avio_tell(vs->avf->pb) - vs->start_pos; | 2347 | vs->size = avio_tell(vs->avf->pb) - vs->start_pos; |
| 2348 | } else { | 2348 | } else { |
| 2349 | vs->size = avio_tell(vs->avf->pb); | 2349 | vs->size = avio_tell(vs->avf->pb); |
| 2350 | } | 2350 | } |
| 2351 | if (hls->segment_type != SEGMENT_TYPE_FMP4) | 2351 | if (hls->segment_type != SEGMENT_TYPE_FMP4) |
| 2352 | ff_format_io_close(s, &oc->pb); | 2352 | ff_format_io_close(s, &oc->pb); |
| 2353 | 2353 | ||
| 2354 | if ((hls->flags & HLS_TEMP_FILE) && oc->url[0]) { | 2354 | if ((hls->flags & HLS_TEMP_FILE) && oc->url[0]) { |
| 2355 | hls_rename_temp_file(s, oc); | 2355 | hls_rename_temp_file(s, oc); |
| 2356 | av_free(old_filename); | 2356 | av_free(old_filename); |
| 2357 | old_filename = av_strdup(vs->avf->url); | 2357 | old_filename = av_strdup(vs->avf->url); |
| 2358 | 2358 | ||
| 2359 | if (!old_filename) { | 2359 | if (!old_filename) { |
| 2360 | return AVERROR(ENOMEM); | 2360 | return AVERROR(ENOMEM); |
| 2361 | } | ||
| 2361 | } | 2362 | } |
| 2362 | } | ||
| 2363 | 2363 | ||
| 2364 | /* after av_write_trailer, then duration + 1 duration per packet */ | 2364 | /* after av_write_trailer, then duration + 1 duration per packet */ |
| 2365 | hls_append_segment(s, hls, vs, vs->duration + vs->dpp, vs->start_pos, vs->size); | 2365 | hls_append_segment(s, hls, vs, vs->duration + vs->dpp, vs->start_pos, vs->size); |
| 2366 | } | 2366 | } |
| 2367 | 2367 | ||
| 2368 | sls_flag_file_rename(hls, vs, old_filename); | 2368 | sls_flag_file_rename(hls, vs, old_filename); |
| 2369 | 2369 | ||
| 2370 | if (vtt_oc) { | 2370 | if (vtt_oc) { |
| 2371 | if (vtt_oc->pb) | 2371 | if (vtt_oc->pb) |
| 2372 | av_write_trailer(vtt_oc); | 2372 | av_write_trailer(vtt_oc); |
| 2373 | vs->size = avio_tell(vs->vtt_avf->pb) - vs->start_pos; | 2373 | vs->size = avio_tell(vs->vtt_avf->pb) - vs->start_pos; |
| 2374 | ff_format_io_close(s, &vtt_oc->pb); | 2374 | ff_format_io_close(s, &vtt_oc->pb); |
| 2375 | } | 2375 | } |
| 2376 | av_freep(&vs->basename); | 2376 | av_freep(&vs->basename); |
| 2377 | av_freep(&vs->base_output_dirname); | 2377 | av_freep(&vs->base_output_dirname); |
| 2378 | avformat_free_context(oc); | 2378 | avformat_free_context(oc); |
| 2379 | 2379 | ||
| 2380 | vs->avf = NULL; | 2380 | vs->avf = NULL; |
| 2381 | hls_window(s, 1, vs); | 2381 | hls_window(s, 1, vs); |
| 2382 | 2382 | ||
| 2383 | av_freep(&vs->fmp4_init_filename); | 2383 | av_freep(&vs->fmp4_init_filename); |
| 2384 | if (vtt_oc) { | 2384 | if (vtt_oc) { |
| 2385 | av_freep(&vs->vtt_basename); | 2385 | av_freep(&vs->vtt_basename); |
| 2386 | av_freep(&vs->vtt_m3u8_name); | 2386 | av_freep(&vs->vtt_m3u8_name); |
| 2387 | avformat_free_context(vtt_oc); | 2387 | avformat_free_context(vtt_oc); |
| 2388 | } | 2388 | } |
| 2389 | 2389 | ||
| 2390 | hls_free_segments(vs->segments); | 2390 | hls_free_segments(vs->segments); |
| 2391 | hls_free_segments(vs->old_segments); | 2391 | hls_free_segments(vs->old_segments); |
| 2392 | av_free(old_filename); | 2392 | av_free(old_filename); |
| 2393 | av_freep(&vs->m3u8_name); | 2393 | av_freep(&vs->m3u8_name); |
| 2394 | av_freep(&vs->streams); | 2394 | av_freep(&vs->streams); |
| 2395 | av_freep(&vs->agroup); | 2395 | av_freep(&vs->agroup); |
| 2396 | av_freep(&vs->ccgroup); | 2396 | av_freep(&vs->ccgroup); |
| 2397 | av_freep(&vs->baseurl); | 2397 | av_freep(&vs->baseurl); |
| 2398 | } | 2398 | } |
| 2399 | 2399 | ||
| 2400 | for (i = 0; i < hls->nb_ccstreams; i++) { | 2400 | for (i = 0; i < hls->nb_ccstreams; i++) { |
| @@ -2432,7 +2432,7 @@ static int hls_init(AVFormatContext *s) · 31 unmodified lines | |||
| 2432 | ret = update_variant_stream_info(s); | 2432 | ret = update_variant_stream_info(s); |
| 2433 | if (ret < 0) { | 2433 | if (ret < 0) { |
| 2434 | av_log(s, AV_LOG_ERROR, "Variant stream info update failed with status %x\n", | 2434 | av_log(s, AV_LOG_ERROR, "Variant stream info update failed with status %x\n", |
| 2435 | ret); | 2435 | ret); |
| 2436 | goto fail; | 2436 | goto fail; |
| 2437 | } | 2437 | } |
| 2438 | //TODO: Updates needed to encryption functionality with periodic re-key when more than one variant streams are present | 2438 | //TODO: Updates needed to encryption functionality with periodic re-key when more than one variant streams are present |
| @@ -2468,7 +2468,7 @@ static int hls_init(AVFormatContext *s) · 29 unmodified lines | |||
| 2468 | ret = update_master_pl_info(s); | 2468 | ret = update_master_pl_info(s); |
| 2469 | if (ret < 0) { | 2469 | if (ret < 0) { |
| 2470 | av_log(s, AV_LOG_ERROR, "Master stream info update failed with status %x\n", | 2470 | av_log(s, AV_LOG_ERROR, "Master stream info update failed with status %x\n", |
| 2471 | ret); | 2471 | ret); |
| 2472 | goto fail; | 2472 | goto fail; |
| 2473 | } | 2473 | } |
| 2474 | } | 2474 | } |
| @@ -2617,39 +2617,39 @@ static int hls_init(AVFormatContext *s) · 142 unmodified lines | |||
| 2617 | goto fail; | 2617 | goto fail; |
| 2618 | } | 2618 | } |
| 2619 | } else { | 2619 | } else { |
| 2620 | vs->fmp4_init_filename = av_malloc(fmp4_init_filename_len); | 2620 | vs->fmp4_init_filename = av_malloc(fmp4_init_filename_len); |
| 2621 | if (!vs->fmp4_init_filename ) { | 2621 | if (!vs->fmp4_init_filename ) { |
| 2622 | ret = AVERROR(ENOMEM); | 2622 | ret = AVERROR(ENOMEM); |
| 2623 | goto fail; | ||
| 2624 | } | ||
| 2625 | av_strlcpy(vs->fmp4_init_filename, hls->fmp4_init_filename, | ||
| 2626 | fmp4_init_filename_len); | ||
| 2627 | if (hls->nb_varstreams > 1) { | ||
| 2628 | ret = append_postfix(vs->fmp4_init_filename, fmp4_init_filename_len, i); | ||
| 2629 | if (ret < 0) | ||
| 2630 | goto fail; | 2623 | goto fail; |
| 2631 | } | 2624 | } |
| 2625 | av_strlcpy(vs->fmp4_init_filename, hls->fmp4_init_filename, | ||
| 2626 | fmp4_init_filename_len); | ||
| 2627 | if (hls->nb_varstreams > 1) { | ||
| 2628 | ret = append_postfix(vs->fmp4_init_filename, fmp4_init_filename_len, i); | ||
| 2629 | if (ret < 0) | ||
| 2630 | goto fail; | ||
| 2631 | } | ||
| 2632 | 2632 | ||
| 2633 | fmp4_init_filename_len = strlen(vs->m3u8_name) + | 2633 | fmp4_init_filename_len = strlen(vs->m3u8_name) + |
| 2634 | strlen(vs->fmp4_init_filename) + 1; | 2634 | strlen(vs->fmp4_init_filename) + 1; |
| 2635 | 2635 | ||
| 2636 | vs->base_output_dirname = av_malloc(fmp4_init_filename_len); | 2636 | vs->base_output_dirname = av_malloc(fmp4_init_filename_len); |
| 2637 | if (!vs->base_output_dirname) { | 2637 | if (!vs->base_output_dirname) { |
| 2638 | ret = AVERROR(ENOMEM); | 2638 | ret = AVERROR(ENOMEM); |
| 2639 | goto fail; | 2639 | goto fail; |
| 2640 | } | 2640 | } |
| 2641 | 2641 | ||
| 2642 | av_strlcpy(vs->base_output_dirname, vs->m3u8_name, | 2642 | av_strlcpy(vs->base_output_dirname, vs->m3u8_name, |
| 2643 | fmp4_init_filename_len); | ||
| 2644 | p = strrchr(vs->base_output_dirname, '/'); | ||
| 2645 | if (p) { | ||
| 2646 | *(p + 1) = '\0'; | ||
| 2647 | av_strlcat(vs->base_output_dirname, vs->fmp4_init_filename, | ||
| 2648 | fmp4_init_filename_len); | 2643 | fmp4_init_filename_len); |
| 2649 | } else { | 2644 | p = strrchr(vs->base_output_dirname, '/'); |
| 2650 | av_strlcpy(vs->base_output_dirname, vs->fmp4_init_filename, | 2645 | if (p) { |
| 2651 | fmp4_init_filename_len); | 2646 | *(p + 1) = '\0'; |
| 2652 | } | 2647 | av_strlcat(vs->base_output_dirname, vs->fmp4_init_filename, |
| 2648 | fmp4_init_filename_len); | ||
| 2649 | } else { | ||
| 2650 | av_strlcpy(vs->base_output_dirname, vs->fmp4_init_filename, | ||
| 2651 | fmp4_init_filename_len); | ||
| 2652 | } | ||
| 2653 | } | 2653 | } |
| 2654 | } | 2654 | } |
| 2655 | 2655 | ||