Unified · Split
| @@ -2173,7 +2173,7 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) · 2172 unmodified lines | ||
| 2173 | 2173 | } |
| 2174 | 2174 | |
| 2175 | 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 | 2177 | int64_t new_start_pos; |
| 2178 | 2178 | char *old_filename = NULL; |
| 2179 | 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 | 2187 | vs->size = new_start_pos; |
| 2188 | 2188 | } |
| 2189 | 2189 | |
| 2190 | − if (hls->segment_type == SEGMENT_TYPE_FMP4) { | |
| 2191 | − if (!vs->init_range_length) { | |
| 2192 | − avio_flush(oc->pb); | |
| 2193 | − range_length = avio_close_dyn_buf(oc->pb, &buffer); | |
| 2194 | − avio_write(vs->out, buffer, range_length); | |
| 2195 | − vs->init_range_length = range_length; | |
| 2196 | − avio_open_dyn_buf(&oc->pb); | |
| 2197 | − vs->packets_written = 0; | |
| 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 { | |
| 2190 | + if (hls->segment_type == SEGMENT_TYPE_FMP4) { | |
| 2191 | + if (!vs->init_range_length) { | |
| 2192 | + avio_flush(oc->pb); | |
| 2193 | + range_length = avio_close_dyn_buf(oc->pb, &buffer); | |
| 2194 | + avio_write(vs->out, buffer, range_length); | |
| 2195 | + vs->init_range_length = range_length; | |
| 2196 | + avio_open_dyn_buf(&oc->pb); | |
| 2197 | + vs->packets_written = 0; | |
| 2198 | + vs->start_pos = range_length; | |
| 2205 | 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 | 2205 | if (!byterange_mode) { |
| 2206 | + hlsenc_io_close(s, &oc->pb, oc->url); | |
| 2207 | + } | |
| 2208 | + } | |
| 2209 | + if (!byterange_mode) { | |
| 2210 | 2210 | if (vs->vtt_avf) { |
| 2211 | 2211 | hlsenc_io_close(s, &vs->vtt_avf->pb, vs->vtt_avf->url); |
| 2212 | 2212 | } |
| 2213 | − } | |
| 2213 | + } | |
| 2214 | 2214 | if ((hls->flags & HLS_TEMP_FILE) && oc->url[0]) { |
| 2215 | 2215 | if (!(hls->flags & HLS_SINGLE_FILE) || (hls->max_seg_size <= 0)) |
| 2216 | 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 | 2232 | vs->size = range_length; |
| 2233 | 2233 | } else { |
| 2234 | − ret = hlsenc_io_open(s, &vs->out, vs->avf->url, NULL); | |
| 2235 | − if (ret < 0) { | |
| 2236 | − av_log(NULL, AV_LOG_ERROR, "Failed to open file '%s'\n", | |
| 2237 | − vs->avf->url); | |
| 2238 | − return ret; | |
| 2239 | − } | |
| 2240 | − write_styp(vs->out); | |
| 2241 | − ret = flush_dynbuf(vs, &range_length); | |
| 2242 | − if (ret < 0) { | |
| 2243 | − return ret; | |
| 2244 | − } | |
| 2245 | − ff_format_io_close(s, &vs->out); | |
| 2234 | + ret = hlsenc_io_open(s, &vs->out, vs->avf->url, NULL); | |
| 2235 | + if (ret < 0) { | |
| 2236 | + av_log(s, AV_LOG_ERROR, "Failed to open file '%s'\n", | |
| 2237 | + vs->avf->url); | |
| 2238 | + return ret; | |
| 2239 | + } | |
| 2240 | + write_styp(vs->out); | |
| 2241 | + ret = flush_dynbuf(vs, &range_length); | |
| 2242 | + if (ret < 0) { | |
| 2243 | + return ret; | |
| 2244 | + } | |
| 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 | 2316 | for (i = 0; i < hls->nb_varstreams; i++) { |
| 2317 | 2317 | vs = &hls->var_streams[i]; |
| 2318 | 2318 | |
| 2319 | − oc = vs->avf; | |
| 2320 | − vtt_oc = vs->vtt_avf; | |
| 2321 | − old_filename = av_strdup(vs->avf->url); | |
| 2319 | + oc = vs->avf; | |
| 2320 | + vtt_oc = vs->vtt_avf; | |
| 2321 | + old_filename = av_strdup(vs->avf->url); | |
| 2322 | 2322 | |
| 2323 | − if (!old_filename) { | |
| 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); | |
| 2323 | + if (!old_filename) { | |
| 2324 | + return AVERROR(ENOMEM); | |
| 2335 | 2325 | } |
| 2336 | − ret = flush_dynbuf(vs, &range_length); | |
| 2337 | − if (ret < 0) { | |
| 2338 | − goto failed; | |
| 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(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 | 2343 | failed: |
| 2344 | − av_write_trailer(oc); | |
| 2345 | − if (oc->pb) { | |
| 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 | − } | |
| 2351 | − if (hls->segment_type != SEGMENT_TYPE_FMP4) | |
| 2352 | − ff_format_io_close(s, &oc->pb); | |
| 2344 | + av_write_trailer(oc); | |
| 2345 | + if (oc->pb) { | |
| 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 | + } | |
| 2351 | + if (hls->segment_type != SEGMENT_TYPE_FMP4) | |
| 2352 | + ff_format_io_close(s, &oc->pb); | |
| 2353 | 2353 | |
| 2354 | − if ((hls->flags & HLS_TEMP_FILE) && oc->url[0]) { | |
| 2355 | − hls_rename_temp_file(s, oc); | |
| 2356 | − av_free(old_filename); | |
| 2357 | − old_filename = av_strdup(vs->avf->url); | |
| 2354 | + if ((hls->flags & HLS_TEMP_FILE) && oc->url[0]) { | |
| 2355 | + hls_rename_temp_file(s, oc); | |
| 2356 | + av_free(old_filename); | |
| 2357 | + old_filename = av_strdup(vs->avf->url); | |
| 2358 | 2358 | |
| 2359 | − if (!old_filename) { | |
| 2360 | − return AVERROR(ENOMEM); | |
| 2359 | + if (!old_filename) { | |
| 2360 | + return AVERROR(ENOMEM); | |
| 2361 | + } | |
| 2361 | 2362 | } |
| 2362 | − } | |
| 2363 | 2363 | |
| 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); | |
| 2366 | − } | |
| 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); | |
| 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) { | |
| 2371 | − if (vtt_oc->pb) | |
| 2372 | − av_write_trailer(vtt_oc); | |
| 2373 | − vs->size = avio_tell(vs->vtt_avf->pb) - vs->start_pos; | |
| 2374 | − ff_format_io_close(s, &vtt_oc->pb); | |
| 2375 | − } | |
| 2376 | − av_freep(&vs->basename); | |
| 2377 | − av_freep(&vs->base_output_dirname); | |
| 2378 | − avformat_free_context(oc); | |
| 2370 | + if (vtt_oc) { | |
| 2371 | + if (vtt_oc->pb) | |
| 2372 | + av_write_trailer(vtt_oc); | |
| 2373 | + vs->size = avio_tell(vs->vtt_avf->pb) - vs->start_pos; | |
| 2374 | + ff_format_io_close(s, &vtt_oc->pb); | |
| 2375 | + } | |
| 2376 | + av_freep(&vs->basename); | |
| 2377 | + av_freep(&vs->base_output_dirname); | |
| 2378 | + avformat_free_context(oc); | |
| 2379 | 2379 | |
| 2380 | − vs->avf = NULL; | |
| 2381 | − hls_window(s, 1, vs); | |
| 2380 | + vs->avf = NULL; | |
| 2381 | + hls_window(s, 1, vs); | |
| 2382 | 2382 | |
| 2383 | − av_freep(&vs->fmp4_init_filename); | |
| 2384 | − if (vtt_oc) { | |
| 2385 | − av_freep(&vs->vtt_basename); | |
| 2386 | − av_freep(&vs->vtt_m3u8_name); | |
| 2387 | − avformat_free_context(vtt_oc); | |
| 2388 | − } | |
| 2383 | + av_freep(&vs->fmp4_init_filename); | |
| 2384 | + if (vtt_oc) { | |
| 2385 | + av_freep(&vs->vtt_basename); | |
| 2386 | + av_freep(&vs->vtt_m3u8_name); | |
| 2387 | + avformat_free_context(vtt_oc); | |
| 2388 | + } | |
| 2389 | 2389 | |
| 2390 | − hls_free_segments(vs->segments); | |
| 2391 | − hls_free_segments(vs->old_segments); | |
| 2392 | − av_free(old_filename); | |
| 2393 | − av_freep(&vs->m3u8_name); | |
| 2394 | − av_freep(&vs->streams); | |
| 2395 | − av_freep(&vs->agroup); | |
| 2396 | − av_freep(&vs->ccgroup); | |
| 2397 | − av_freep(&vs->baseurl); | |
| 2390 | + hls_free_segments(vs->segments); | |
| 2391 | + hls_free_segments(vs->old_segments); | |
| 2392 | + av_free(old_filename); | |
| 2393 | + av_freep(&vs->m3u8_name); | |
| 2394 | + av_freep(&vs->streams); | |
| 2395 | + av_freep(&vs->agroup); | |
| 2396 | + av_freep(&vs->ccgroup); | |
| 2397 | + av_freep(&vs->baseurl); | |
| 2398 | 2398 | } |
| 2399 | 2399 | |
| 2400 | 2400 | for (i = 0; i < hls->nb_ccstreams; i++) { |
| @@ -2432,7 +2432,7 @@ static int hls_init(AVFormatContext *s) · 31 unmodified lines | ||
| 2432 | 2432 | ret = update_variant_stream_info(s); |
| 2433 | 2433 | if (ret < 0) { |
| 2434 | 2434 | av_log(s, AV_LOG_ERROR, "Variant stream info update failed with status %x\n", |
| 2435 | − ret); | |
| 2435 | + ret); | |
| 2436 | 2436 | goto fail; |
| 2437 | 2437 | } |
| 2438 | 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 | 2468 | ret = update_master_pl_info(s); |
| 2469 | 2469 | if (ret < 0) { |
| 2470 | 2470 | av_log(s, AV_LOG_ERROR, "Master stream info update failed with status %x\n", |
| 2471 | − ret); | |
| 2471 | + ret); | |
| 2472 | 2472 | goto fail; |
| 2473 | 2473 | } |
| 2474 | 2474 | } |
| @@ -2617,39 +2617,39 @@ static int hls_init(AVFormatContext *s) · 142 unmodified lines | ||
| 2617 | 2617 | goto fail; |
| 2618 | 2618 | } |
| 2619 | 2619 | } else { |
| 2620 | − vs->fmp4_init_filename = av_malloc(fmp4_init_filename_len); | |
| 2621 | − if (!vs->fmp4_init_filename ) { | |
| 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) | |
| 2620 | + vs->fmp4_init_filename = av_malloc(fmp4_init_filename_len); | |
| 2621 | + if (!vs->fmp4_init_filename ) { | |
| 2622 | + ret = AVERROR(ENOMEM); | |
| 2630 | 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) + | |
| 2634 | − strlen(vs->fmp4_init_filename) + 1; | |
| 2633 | + fmp4_init_filename_len = strlen(vs->m3u8_name) + | |
| 2634 | + strlen(vs->fmp4_init_filename) + 1; | |
| 2635 | 2635 | |
| 2636 | − vs->base_output_dirname = av_malloc(fmp4_init_filename_len); | |
| 2637 | − if (!vs->base_output_dirname) { | |
| 2638 | − ret = AVERROR(ENOMEM); | |
| 2639 | − goto fail; | |
| 2640 | − } | |
| 2636 | + vs->base_output_dirname = av_malloc(fmp4_init_filename_len); | |
| 2637 | + if (!vs->base_output_dirname) { | |
| 2638 | + ret = AVERROR(ENOMEM); | |
| 2639 | + goto fail; | |
| 2640 | + } | |
| 2641 | 2641 | |
| 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, | |
| 2642 | + av_strlcpy(vs->base_output_dirname, vs->m3u8_name, | |
| 2648 | 2643 | fmp4_init_filename_len); |
| 2649 | − } else { | |
| 2650 | − av_strlcpy(vs->base_output_dirname, vs->fmp4_init_filename, | |
| 2651 | − fmp4_init_filename_len); | |
| 2652 | − } | |
| 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); | |
| 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 | |