Advertisement
Guest User

Untitled

a guest
Dec 22nd, 2014
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 2.06 KB | None | 0 0
  1. From 8e6a40584caf9b69d86e084e24af97ac55c12e52 Mon Sep 17 00:00:00 2001
  2. From: Hendrik Leppkes <h.leppkes@gmail.com>
  3. Date: Tue, 23 Dec 2014 00:42:49 +0100
  4. Subject: [PATCH] frame_thread_encoder: use ref-counting to avoid memcpy of all
  5.  input frames
  6.  
  7. ---
  8. libavcodec/frame_thread_encoder.c | 26 ++++++++++----------------
  9.  1 file changed, 10 insertions(+), 16 deletions(-)
  10.  
  11. diff --git a/libavcodec/frame_thread_encoder.c b/libavcodec/frame_thread_encoder.c
  12. index 6eae8b5..8ca31c9 100644
  13. --- a/libavcodec/frame_thread_encoder.c
  14. +++ b/libavcodec/frame_thread_encoder.c
  15. @@ -254,25 +254,19 @@ int ff_thread_video_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVF
  16.      av_assert1(!*got_packet_ptr);
  17.  
  18.      if(frame){
  19. -        if(!(avctx->flags & CODEC_FLAG_INPUT_PRESERVED)){
  20. -            AVFrame *new = av_frame_alloc();
  21. -            if(!new)
  22. -                return AVERROR(ENOMEM);
  23. -            pthread_mutex_lock(&c->buffer_mutex);
  24. -            ret = ff_get_buffer(c->parent_avctx, new, 0);
  25. -            pthread_mutex_unlock(&c->buffer_mutex);
  26. -            if(ret<0)
  27. -                return ret;
  28. -            new->pts = frame->pts;
  29. -            new->quality = frame->quality;
  30. -            new->pict_type = frame->pict_type;
  31. -            av_image_copy(new->data, new->linesize, (const uint8_t **)frame->data, frame->linesize,
  32. -                          avctx->pix_fmt, avctx->width, avctx->height);
  33. -            frame = new;
  34. +        AVFrame *new = av_frame_alloc();
  35. +        if(!new)
  36. +            return AVERROR(ENOMEM);
  37. +        pthread_mutex_lock(&c->buffer_mutex);
  38. +        ret = av_frame_ref(new, frame);
  39. +        pthread_mutex_unlock(&c->buffer_mutex);
  40. +        if(ret < 0) {
  41. +            av_frame_free(&new);
  42. +            return ret;
  43.          }
  44.  
  45.          task.index = c->task_index;
  46. -        task.indata = (void*)frame;
  47. +        task.indata = (void*)new;
  48.          pthread_mutex_lock(&c->task_fifo_mutex);
  49.          av_fifo_generic_write(c->task_fifo, &task, sizeof(task), NULL);
  50.          pthread_cond_signal(&c->task_fifo_cond);
  51. --
  52. 1.9.5.msysgit.0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement