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
