On 23/02/14 15:34, Reinhard Tartler wrote:
> The patch quoted below requires quite non-trivial changes to
> applications. Consider amide's http://amide.sourceforge.net/
> mpeg_encode_frame() function:
> 
> 
> gboolean mpeg_encode_frame(gpointer data, GdkPixbuf * pixbuf) {
>   encode_t * encode = data;
>   gint out_size;
> 
>   convert_rgb_pixbuf_to_yuv(encode->yuv, pixbuf);
> 
>   /* encode the image */
>   out_size = avcodec_encode_video(encode->context,
> encode->output_buffer, encode->output_buffer_size, encode->picture);
>   fwrite(encode->output_buffer, 1, out_size, encode->output_file);
> 
>   return TRUE;
> };
> 
> This application so far has successfully used libavcodec without the
> use of AVPackets. Can someone help with explaining to amide developers
> why exactly their code improves by using of avcodec_encode_video2
> instead? I'm not even sure if I got this patch right:
> 
> 
> --- amide-1.0.4.orig/src/mpeg_encode.c
> +++ amide-1.0.4/src/mpeg_encode.c
> @@ -268,7 +269,7 @@ gpointer mpeg_encode_setup(gchar * outpu
>      return NULL;
>    }
> 
> -  encode->picture= avcodec_alloc_frame();
> +  encode->picture= av_frame_alloc();
>    if (!encode->picture) {
>      g_warning("couldn't allocate memory for encode->picture");
>      encode_free(encode);
> @@ -360,14 +361,37 @@ gpointer mpeg_encode_setup(gchar * outpu
>  gboolean mpeg_encode_frame(gpointer data, GdkPixbuf * pixbuf) {
>    encode_t * encode = data;
>    gint out_size;
> +  AVPacket pkt;
> +  int ret, got_packet = 0;
> 
>    convert_rgb_pixbuf_to_yuv(encode->yuv, pixbuf);
> 
> -  /* encode the image */
> -  out_size = avcodec_encode_video(encode->context,
> encode->output_buffer, encode->output_buffer_size, encode->picture);
> -  fwrite(encode->output_buffer, 1, out_size, encode->output_file);
> +  av_init_packet(&pkt);
> +  pkt.data = encode->output_buffer;
> +  pkt.size = encode->output_buffer_size;
> 
> -  return TRUE;
> +  /* encode the image */
> +  ret = avcodec_encode_video2(encode->context, &pkt, encode->picture,
> &got_packet);
> +  if (!ret && got_packet && encode->context->coded_frame) {
> +      encode->context->coded_frame->pts       = pkt.pts;
> +      encode->context->coded_frame->key_frame = !!(pkt.flags &
> AV_PKT_FLAG_KEY);
> +  }
> +
> +  /* free any side data since we cannot return it */
> +  if (pkt.side_data_elems > 0) {
> +      int i;
> +      for (i = 0; i < pkt.side_data_elems; i++)
> +          av_free(pkt.side_data[i].data);
> +      av_freep(&pkt.side_data);
> +      pkt.side_data_elems = 0;
> +  }
> +
> +  if (!ret) {
> +      fwrite(encode->output_buffer, 1, pkt.size, encode->output_file);
> +      return TRUE;
> +  } else {
> +      return FALSE;
> +  }
>  };
> 
>  /* close everything up */
> 
> It seems to me that the old avcodec_encode_frame api was much easier
> to use, because it requires less boilerplate and book-keeping. Can't
> we just revert the patch below, un-deprecate this function and declare
> it as convenience helper?
> 

I'm not against it, I think there is a cleaner way to write the same
code and we should put it in the migration document.

lu


_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to