[FFmpeg-devel] [PATCH] lavf/dashenc: update bitrates on dash_write_trailer
Przemysław Sobala
przemyslaw.sobala at gmail.com
Fri Mar 10 17:27:54 EET 2017
On Wed, Mar 8, 2017 at 9:27 AM, Przemysław Sobala <
przemyslaw.sobala at gmail.com> wrote:
> On Fri, Mar 3, 2017 at 9:38 AM, Przemysław Sobala <
> przemyslaw.sobala at gmail.com> wrote:
>
>> From: Przemysław Sobala <przemyslaw.sobala at gmail.com>
>>
>> Provides a way to change bandwidth parameter inside DASH manifest after a
>> non-CBR H.264 encoding.
>> Caller now is able to compute the bitrate by itself, after all packets
>> have been written, and then set that value in AVFormatContext->streams->codecpar->bit_rate
>> before calling av_write_trailer. As a result that value will be set in DASH
>> manifest.
>> ---
>> libavformat/dashenc.c | 42 ++++++++++++++++++++++++++++++------------
>> 1 file changed, 30 insertions(+), 12 deletions(-)
>>
>> diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c
>> index fa56505..011d2ea 100644
>> --- a/libavformat/dashenc.c
>> +++ b/libavformat/dashenc.c
>> @@ -561,6 +561,30 @@ static int write_manifest(AVFormatContext *s, int
>> final)
>> return 0;
>> }
>>
>> +static int set_bitrate(AVFormatContext *s)
>> +{
>> + DASHContext *c = s->priv_data;
>> + int i;
>> +
>> + for (i = 0; i < s->nb_streams; i++) {
>> + OutputStream *os = &c->streams[i];
>> +
>> + os->bit_rate = s->streams[i]->codecpar->bit_rate;
>> + if (os->bit_rate) {
>> + snprintf(os->bandwidth_str, sizeof(os->bandwidth_str),
>> + " bandwidth=\"%d\"", os->bit_rate);
>> + } else {
>> + int level = s->strict_std_compliance >= FF_COMPLIANCE_STRICT
>> ?
>> + AV_LOG_ERROR : AV_LOG_WARNING;
>> + av_log(s, level, "No bit rate set for stream %d\n", i);
>> + if (s->strict_std_compliance >= FF_COMPLIANCE_STRICT)
>> + return AVERROR(EINVAL);
>> + }
>> + }
>> +
>> + return 0;
>> +}
>> +
>> static int dash_init(AVFormatContext *s)
>> {
>> DASHContext *c = s->priv_data;
>> @@ -597,6 +621,10 @@ static int dash_init(AVFormatContext *s)
>> if (!c->streams)
>> return AVERROR(ENOMEM);
>>
>> + ret = set_bitrate(s);
>> + if (ret < 0)
>> + return ret;
>> +
>> for (i = 0; i < s->nb_streams; i++) {
>> OutputStream *os = &c->streams[i];
>> AVFormatContext *ctx;
>> @@ -604,18 +632,6 @@ static int dash_init(AVFormatContext *s)
>> AVDictionary *opts = NULL;
>> char filename[1024];
>>
>> - os->bit_rate = s->streams[i]->codecpar->bit_rate;
>> - if (os->bit_rate) {
>> - snprintf(os->bandwidth_str, sizeof(os->bandwidth_str),
>> - " bandwidth=\"%d\"", os->bit_rate);
>> - } else {
>> - int level = s->strict_std_compliance >= FF_COMPLIANCE_STRICT
>> ?
>> - AV_LOG_ERROR : AV_LOG_WARNING;
>> - av_log(s, level, "No bit rate set for stream %d\n", i);
>> - if (s->strict_std_compliance >= FF_COMPLIANCE_STRICT)
>> - return AVERROR(EINVAL);
>> - }
>> -
>> ctx = avformat_alloc_context();
>> if (!ctx)
>> return AVERROR(ENOMEM);
>> @@ -981,6 +997,8 @@ static int dash_write_trailer(AVFormatContext *s)
>> {
>> DASHContext *c = s->priv_data;
>>
>> + set_bitrate(s);
>> +
>> if (s->nb_streams > 0) {
>> OutputStream *os = &c->streams[0];
>> // If no segments have been written so far, try to do a crude
>> --
>> 2.7.4
>>
>>
> ping
>
>
ping, 7 days timeout
can anyone tak a look at this?
[
http://ffmpeg.org/developer.html#Always-wait-long-enough-before-pushing-changes
]
--
Regards
Przemysław Sobala
More information about the ffmpeg-devel
mailing list