diff options
author | Rodger Combs <rodger.combs@gmail.com> | 2017-09-26 14:12:19 -0300 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2017-09-26 14:12:19 -0300 |
commit | a9f51d19d6b58f9e75451d891a85a3617ab1fa56 (patch) | |
tree | 157a377b26b2796e65544ce097b7d37636505ab0 | |
parent | 5c9373385d1a1d940b84f71fb583dc5519b17b8a (diff) | |
parent | 01f1f017d831cf14617aaaeafcec3ae3a81efce7 (diff) | |
download | ffmpeg-a9f51d19d6b58f9e75451d891a85a3617ab1fa56.tar.gz |
Merge commit '01f1f017d831cf14617aaaeafcec3ae3a81efce7'
* commit '01f1f017d831cf14617aaaeafcec3ae3a81efce7':
dashenc: use avio_dynbuf instead of packet_write callback
Merged-by: Rodger Combs <rodger.combs@gmail.com>
-rw-r--r-- | libavformat/dashenc.c | 61 |
1 files changed, 37 insertions, 24 deletions
diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c index ab6bf21dbd..bde938f587 100644 --- a/libavformat/dashenc.c +++ b/libavformat/dashenc.c @@ -60,11 +60,10 @@ typedef struct AdaptationSet { typedef struct OutputStream { AVFormatContext *ctx; int ctx_inited, as_idx; - uint8_t iobuf[32768]; AVIOContext *out; int packets_written; char initfile[1024]; - int64_t init_start_pos; + int64_t init_start_pos, pos; int init_range_length; int nb_segments, segments_size, segment_index; Segment **segments; @@ -102,14 +101,6 @@ typedef struct DASHContext { const char *utc_timing_url; } DASHContext; -static int dash_write(void *opaque, uint8_t *buf, int buf_size) -{ - OutputStream *os = opaque; - if (os->out) - avio_write(os->out, buf, buf_size); - return buf_size; -} - // RFC 6381 static void set_codec_str(AVFormatContext *s, AVCodecParameters *par, char *str, int size) @@ -176,6 +167,28 @@ static void set_codec_str(AVFormatContext *s, AVCodecParameters *par, } } +static int flush_dynbuf(OutputStream *os, int *range_length) +{ + uint8_t *buffer; + + if (!os->ctx->pb) { + return AVERROR(EINVAL); + } + + // flush + av_write_frame(os->ctx, NULL); + avio_flush(os->ctx->pb); + + // write out to file + *range_length = avio_close_dyn_buf(os->ctx->pb, &buffer); + os->ctx->pb = NULL; + avio_write(os->out, buffer, *range_length); + av_free(buffer); + + // re-open buffer + return avio_open_dyn_buf(&os->ctx->pb); +} + static void dash_free(AVFormatContext *s) { DASHContext *c = s->priv_data; @@ -195,7 +208,7 @@ static void dash_free(AVFormatContext *s) if (os->ctx && os->ctx_inited) av_write_trailer(os->ctx); if (os->ctx && os->ctx->pb) - av_free(os->ctx->pb); + ffio_free_dyn_buf(&os->ctx->pb); ff_format_io_close(s, &os->out); if (os->ctx) avformat_free_context(os->ctx); @@ -696,9 +709,8 @@ static int dash_init(AVFormatContext *s) ctx->avoid_negative_ts = s->avoid_negative_ts; ctx->flags = s->flags; - ctx->pb = avio_alloc_context(os->iobuf, sizeof(os->iobuf), AVIO_FLAG_WRITE, os, NULL, dash_write, NULL); - if (!ctx->pb) - return AVERROR(ENOMEM); + if ((ret = avio_open_dyn_buf(&ctx->pb)) < 0) + return ret; if (c->single_file) { if (c->single_file_name) @@ -877,7 +889,6 @@ static int dash_flush(AVFormatContext *s, int final, int stream) for (i = 0; i < s->nb_streams; i++) { OutputStream *os = &c->streams[i]; char filename[1024] = "", full_path[1024], temp_path[1024]; - int64_t start_pos; int range_length, index_length = 0; if (!os->packets_written) @@ -896,14 +907,14 @@ static int dash_flush(AVFormatContext *s, int final, int stream) } if (!os->init_range_length) { - av_write_frame(os->ctx, NULL); - os->init_range_length = avio_tell(os->ctx->pb); + ret = flush_dynbuf(os, &range_length); + if (ret < 0) + break; + os->pos = os->init_range_length = range_length; if (!c->single_file) ff_format_io_close(s, &os->out); } - start_pos = avio_tell(os->ctx->pb); - if (!c->single_file) { ff_dash_fill_tmpl_params(filename, sizeof(filename), c->media_seg_name, i, os->segment_index, os->bit_rate, os->start_pts); snprintf(full_path, sizeof(full_path), "%s%s", c->dirname, filename); @@ -916,13 +927,13 @@ static int dash_flush(AVFormatContext *s, int final, int stream) snprintf(full_path, sizeof(full_path), "%s%s", c->dirname, os->initfile); } - av_write_frame(os->ctx, NULL); - avio_flush(os->ctx->pb); + ret = flush_dynbuf(os, &range_length); + if (ret < 0) + break; os->packets_written = 0; - range_length = avio_tell(os->ctx->pb) - start_pos; if (c->single_file) { - find_index_range(s, full_path, start_pos, &index_length); + find_index_range(s, full_path, os->pos, &index_length); } else { ff_format_io_close(s, &os->out); @@ -942,8 +953,10 @@ static int dash_flush(AVFormatContext *s, int final, int stream) " bandwidth=\"%d\"", os->bit_rate); } } - add_segment(os, filename, os->start_pts, os->max_pts - os->start_pts, start_pos, range_length, index_length); + add_segment(os, filename, os->start_pts, os->max_pts - os->start_pts, os->pos, range_length, index_length); av_log(s, AV_LOG_VERBOSE, "Representation %d media segment %d written to: %s\n", i, os->segment_index, full_path); + + os->pos += range_length; } if (c->window_size || (final && c->remove_at_exit)) { |