On Wed, May 20, 2015 at 2:09 AM, Vittorio Giovara
<[email protected]> wrote:
> Signed-off-by: Vittorio Giovara <[email protected]>
> ---
>  avconv.c     | 39 ++++++++++++++++++++++++++++-----------
>  avconv.h     |  4 ++++
>  avconv_opt.c |  9 +++++++++
>  3 files changed, 41 insertions(+), 11 deletions(-)
>
> diff --git a/avconv.c b/avconv.c
> index 0174854..64c2760 100644
> --- a/avconv.c
> +++ b/avconv.c
> @@ -190,6 +190,7 @@ static void avconv_cleanup(int ret)
>          av_freep(&ost->forced_keyframes);
>          av_freep(&ost->avfilter);
>          av_freep(&ost->logfile_prefix);
> +        av_freep(&ost->last_params);
>
>          avcodec_free_context(&ost->enc_ctx);
>
> @@ -335,7 +336,15 @@ static void write_frame(AVFormatContext *s, AVPacket 
> *pkt, OutputStream *ost)
>          }
>          ost->frame_number++;
>      }
> -
> +    if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
> +        uint8_t *s = av_packet_get_side_data(pkt, AV_PKT_DATA_CODING_PARAMS,
> +                                             NULL);
> +        if (s) {
> +            ost->params_recv = 1;
> +            memcpy(ost->last_params, s, sizeof(AVPacketCodingParams));
> +        } else
> +            ost->params_recv = 0;
> +    }
>      while (bsfc) {
>          AVPacket new_pkt = *pkt;
>          int a = av_bitstream_filter_filter(bsfc, avctx, NULL,
> @@ -620,10 +629,16 @@ static void do_video_stats(OutputStream *ost, int 
> frame_size)
>      enc = ost->enc_ctx;
>      if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
>          frame_number = ost->frame_number;
> -        fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, 
> enc->coded_frame->quality / (float)FF_QP2LAMBDA);
> -        if (enc->flags&CODEC_FLAG_PSNR)
> -            fprintf(vstats_file, "PSNR= %6.2f ", 
> psnr(enc->coded_frame->error[0] / (enc->width * enc->height * 255.0 * 
> 255.0)));
> -
> +        fprintf(vstats_file, "frame= %5d", frame_number);
> +        if (ost->params_recv) {
> +            fprintf(vstats_file, " q= %2.1f ",
> +                    ost->last_params->quality / (float)FF_QP2LAMBDA);
> +            if (enc->flags & CODEC_FLAG_PSNR) {
> +                double vpsnr = psnr(ost->last_params->error[0] /
> +                                    (enc->width * enc->height * 255.0 * 
> 255.0));
> +                fprintf(vstats_file, "PSNR= %6.2f ", vpsnr);
> +            }
> +        }
>          fprintf(vstats_file,"f_size= %6d ", frame_size);
>          /* compute pts value */
>          ti1 = ost->sync_opts * av_q2d(enc->time_base);
> @@ -634,7 +649,9 @@ static void do_video_stats(OutputStream *ost, int 
> frame_size)
>          avg_bitrate = (double)(ost->data_size * 8) / ti1 / 1000.0;
>          fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s 
> avg_br= %7.1fkbits/s ",
>                 (double)ost->data_size / 1024, ti1, bitrate, avg_bitrate);
> -        fprintf(vstats_file, "type= %c\n", 
> av_get_picture_type_char(enc->coded_frame->pict_type));
> +        if (ost->params_recv)
> +            fprintf(vstats_file, "type= %c\n",
> +                    av_get_picture_type_char(ost->last_params->pict_type));
>      }
>  }
>
> @@ -905,8 +922,8 @@ static void print_report(int is_last_report, int64_t 
> timer_start)
>          float q = -1;
>          ost = output_streams[i];
>          enc = ost->enc_ctx;
> -        if (!ost->stream_copy && enc->coded_frame)
> -            q = enc->coded_frame->quality / (float)FF_QP2LAMBDA;
> +        if (!ost->stream_copy && ost->params_recv)
> +            q = ost->last_params->quality / (float)FF_QP2LAMBDA;
>          if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
>              snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f 
> ", q);
>          }
> @@ -926,7 +943,7 @@ static void print_report(int is_last_report, int64_t 
> timer_start)
>                  for (j = 0; j < 32; j++)
>                      snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), 
> "%X", (int)lrintf(log2(qp_histogram[j] + 1)));
>              }
> -            if (enc->flags&CODEC_FLAG_PSNR) {
> +            if ((enc->flags & CODEC_FLAG_PSNR) && ost->params_recv) {
>                  int j;
>                  double error, error_sum = 0;
>                  double scale, scale_sum = 0;
> @@ -934,10 +951,10 @@ static void print_report(int is_last_report, int64_t 
> timer_start)
>                  snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), 
> "PSNR=");
>                  for (j = 0; j < 3; j++) {
>                      if (is_last_report) {
> -                        error = enc->error[j];
> +                        error = ost->last_params->error[j];
>                          scale = enc->width * enc->height * 255.0 * 255.0 * 
> frame_number;
>                      } else {
> -                        error = enc->coded_frame->error[j];
> +                        error = ost->last_params->error[j];
>                          scale = enc->width * enc->height * 255.0 * 255.0;
>                      }
>                      if (j)
> diff --git a/avconv.h b/avconv.h
> index 5fddf98..7c69a9c 100644
> --- a/avconv.h
> +++ b/avconv.h
> @@ -361,6 +361,10 @@ typedef struct OutputStream {
>      // number of frames/samples sent to the encoder
>      uint64_t frames_encoded;
>      uint64_t samples_encoded;
> +
> +    /* last coding parameters received */
> +    int params_recv;
> +    AVPacketCodingParams *last_params;
>  } OutputStream;
>
>  typedef struct OutputFile {
> diff --git a/avconv_opt.c b/avconv_opt.c
> index 29fc2be..79cddb5 100644
> --- a/avconv_opt.c
> +++ b/avconv_opt.c
> @@ -908,6 +908,15 @@ static OutputStream *new_output_stream(OptionsContext 
> *o, AVFormatContext *oc, e
>      ost->file_index = nb_output_files - 1;
>      ost->index      = idx;
>      ost->st         = st;
> +    if (type == AVMEDIA_TYPE_VIDEO) {
> +        ost->last_params = av_malloc(sizeof(AVPacketCodingParams));
> +        if (!ost->last_params) {
> +            av_log(NULL, AV_LOG_ERROR,
> +                   "Error allocating the encoding parameters buffer.\n");
> +            exit_program(1);
> +        }
> +    }
> +
>      st->codec->codec_type = type;
>      choose_encoder(o, oc, ost);
>
> --
> 1.9.5 (Apple Git-50.3)
>

any more comments on the idea/implementation?
-- 
Vittorio
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to