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
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
2313failed:2343failed:
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

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