Message ID | 1488530308-3488-1-git-send-email-przemyslaw.sobala@grupawp.pl |
---|---|
State | Accepted |
Headers | show |
On Fri, Mar 3, 2017 at 9:38 AM, Przemysław Sobala < przemyslaw.sobala@gmail.com> wrote: > From: Przemysław Sobala <przemyslaw.sobala@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
On Wed, Mar 8, 2017 at 9:27 AM, Przemysław Sobala < przemyslaw.sobala@gmail.com> wrote: > On Fri, Mar 3, 2017 at 9:38 AM, Przemysław Sobala < > przemyslaw.sobala@gmail.com> wrote: > >> From: Przemysław Sobala <przemyslaw.sobala@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
On Fri, Mar 10, 2017 at 04:27:54PM +0100, Przemysław Sobala wrote: > On Wed, Mar 8, 2017 at 9:27 AM, Przemysław Sobala < > przemyslaw.sobala@gmail.com> wrote: > > > On Fri, Mar 3, 2017 at 9:38 AM, Przemysław Sobala < > > przemyslaw.sobala@gmail.com> wrote: > > > >> From: Przemysław Sobala <przemyslaw.sobala@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 > ] applied thx [...]
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
From: Przemysław Sobala <przemyslaw.sobala@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(-)