diff mbox

[FFmpeg-devel] lavf/dashenc: update bitrates on dash_write_trailer

Message ID 1488530308-3488-1-git-send-email-przemyslaw.sobala@grupawp.pl
State Accepted
Headers show

Commit Message

Przemysław Sobala March 3, 2017, 8:38 a.m. UTC
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(-)

Comments

Przemysław Sobala March 8, 2017, 8:27 a.m. UTC | #1
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
Przemysław Sobala March 10, 2017, 3:27 p.m. UTC | #2
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
Michael Niedermayer March 11, 2017, 3:36 p.m. UTC | #3
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 mbox

Patch

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