Browse Source

Merge commit 'e85f6f7f8d037c0af0f294000718d9ba22753baa'

* commit 'e85f6f7f8d037c0af0f294000718d9ba22753baa':
  lavc: allow using AVCodecContext.hw_frames_ctx for decoding

Conflicts:
    doc/APIchanges
    libavcodec/version.h

Merged-by: James Almer <jamrial@gmail.com>
tags/n3.2
James Almer 8 years ago
parent
commit
32c25f06b7
4 changed files with 37 additions and 9 deletions
  1. +3
    -0
      doc/APIchanges
  2. +17
    -7
      libavcodec/avcodec.h
  3. +15
    -0
      libavcodec/utils.c
  4. +2
    -2
      libavcodec/version.h

+ 3
- 0
doc/APIchanges View File

@@ -15,6 +15,9 @@ libavutil: 2015-08-28

API changes, most recent first:

2016-09-xx - xxxxxxx - lavc 57.59.100/ 57.23.0 - avcodec.h
AVCodecContext.hw_frames_ctx now may be used by decoders.

2016-09-27 - xxxxxxx - lavf 57.51.100 - avformat.h
Add av_stream_get_codec_timebase()



+ 17
- 7
libavcodec/avcodec.h View File

@@ -3518,15 +3518,25 @@ typedef struct AVCodecContext {
int nb_coded_side_data;

/**
* Encoding only.
* A reference to the AVHWFramesContext describing the input (for encoding)
* or output (decoding) frames. The reference is set by the caller and
* afterwards owned (and freed) by libavcodec.
*
* For hardware encoders configured to use a hwaccel pixel format, this
* field should be set by the caller to a reference to the AVHWFramesContext
* describing input frames. AVHWFramesContext.format must be equal to
* AVCodecContext.pix_fmt.
* - decoding: This field should be set by the caller from the get_format()
* callback. The previous reference (if any) will always be
* unreffed by libavcodec before the get_format() call.
*
* This field should be set before avcodec_open2() is called and is
* afterwards owned and managed by libavcodec.
* If the default get_buffer2() is used with a hwaccel pixel
* format, then this AVHWFramesContext will be used for
* allocating the frame buffers.
*
* - encoding: For hardware encoders configured to use a hwaccel pixel
* format, this field should be set by the caller to a reference
* to the AVHWFramesContext describing input frames.
* AVHWFramesContext.format must be equal to
* AVCodecContext.pix_fmt.
*
* This field should be set before avcodec_open2() is called.
*/
AVBufferRef *hw_frames_ctx;



+ 15
- 0
libavcodec/utils.c View File

@@ -724,6 +724,9 @@ int avcodec_default_get_buffer2(AVCodecContext *avctx, AVFrame *frame, int flags
{
int ret;

if (avctx->hw_frames_ctx)
return av_hwframe_get_buffer(avctx->hw_frames_ctx, frame, 0);

if ((ret = update_frame_pool(avctx, frame)) < 0)
return ret;

@@ -1119,6 +1122,8 @@ int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
av_freep(&avctx->internal->hwaccel_priv_data);
avctx->hwaccel = NULL;

av_buffer_unref(&avctx->hw_frames_ctx);

ret = avctx->get_format(avctx, choices);

desc = av_pix_fmt_desc_get(ret);
@@ -1134,6 +1139,16 @@ int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
break;
#endif

if (avctx->hw_frames_ctx) {
AVHWFramesContext *hw_frames_ctx = (AVHWFramesContext*)avctx->hw_frames_ctx->data;
if (hw_frames_ctx->format != ret) {
av_log(avctx, AV_LOG_ERROR, "Format returned from get_buffer() "
"does not match the format of provided AVHWFramesContext\n");
ret = AV_PIX_FMT_NONE;
break;
}
}

if (!setup_hwaccel(avctx, ret, desc->name))
break;



+ 2
- 2
libavcodec/version.h View File

@@ -28,8 +28,8 @@
#include "libavutil/version.h"

#define LIBAVCODEC_VERSION_MAJOR 57
#define LIBAVCODEC_VERSION_MINOR 58
#define LIBAVCODEC_VERSION_MICRO 104
#define LIBAVCODEC_VERSION_MINOR 59
#define LIBAVCODEC_VERSION_MICRO 100

#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
LIBAVCODEC_VERSION_MINOR, \


Loading…
Cancel
Save