FFmpeg
mediacodecdec.c
Go to the documentation of this file.
1 /*
2  * Android MediaCodec MPEG-2 / H.264 / H.265 / MPEG-4 / VP8 / VP9 decoders
3  *
4  * Copyright (c) 2015-2016 Matthieu Bouron <matthieu.bouron stupeflix.com>
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 #include <stdint.h>
24 #include <string.h>
25 
26 #include "libavutil/avassert.h"
27 #include "libavutil/common.h"
28 #include "libavutil/opt.h"
29 #include "libavutil/intreadwrite.h"
30 #include "libavutil/pixfmt.h"
31 #include "libavutil/internal.h"
32 
33 #include "avcodec.h"
34 #include "decode.h"
35 #include "h264_parse.h"
36 #include "hevc_parse.h"
37 #include "hwconfig.h"
38 #include "internal.h"
39 #include "mediacodec_wrapper.h"
40 #include "mediacodecdec_common.h"
41 
42 typedef struct MediaCodecH264DecContext {
43 
45 
47 
49 
52 
54 
56 {
58 
59  ff_mediacodec_dec_close(avctx, s->ctx);
60  s->ctx = NULL;
61 
62  av_packet_unref(&s->buffered_pkt);
63 
64  return 0;
65 }
66 
67 #if CONFIG_H264_MEDIACODEC_DECODER || CONFIG_HEVC_MEDIACODEC_DECODER
68 static int h2645_ps_to_nalu(const uint8_t *src, int src_size, uint8_t **out, int *out_size)
69 {
70  int i;
71  int ret = 0;
72  uint8_t *p = NULL;
73  static const uint8_t nalu_header[] = { 0x00, 0x00, 0x00, 0x01 };
74 
75  if (!out || !out_size) {
76  return AVERROR(EINVAL);
77  }
78 
79  p = av_malloc(sizeof(nalu_header) + src_size);
80  if (!p) {
81  return AVERROR(ENOMEM);
82  }
83 
84  *out = p;
85  *out_size = sizeof(nalu_header) + src_size;
86 
87  memcpy(p, nalu_header, sizeof(nalu_header));
88  memcpy(p + sizeof(nalu_header), src, src_size);
89 
90  /* Escape 0x00, 0x00, 0x0{0-3} pattern */
91  for (i = 4; i < *out_size; i++) {
92  if (i < *out_size - 3 &&
93  p[i + 0] == 0 &&
94  p[i + 1] == 0 &&
95  p[i + 2] <= 3) {
96  uint8_t *new;
97 
98  *out_size += 1;
99  new = av_realloc(*out, *out_size);
100  if (!new) {
101  ret = AVERROR(ENOMEM);
102  goto done;
103  }
104  *out = p = new;
105 
106  i = i + 2;
107  memmove(p + i + 1, p + i, *out_size - (i + 1));
108  p[i] = 0x03;
109  }
110  }
111 done:
112  if (ret < 0) {
113  av_freep(out);
114  *out_size = 0;
115  }
116 
117  return ret;
118 }
119 #endif
120 
121 #if CONFIG_H264_MEDIACODEC_DECODER
122 static int h264_set_extradata(AVCodecContext *avctx, FFAMediaFormat *format)
123 {
124  int i;
125  int ret;
126 
127  H264ParamSets ps;
128  const PPS *pps = NULL;
129  const SPS *sps = NULL;
130  int is_avc = 0;
131  int nal_length_size = 0;
132 
133  memset(&ps, 0, sizeof(ps));
134 
136  &ps, &is_avc, &nal_length_size, 0, avctx);
137  if (ret < 0) {
138  goto done;
139  }
140 
141  for (i = 0; i < MAX_PPS_COUNT; i++) {
142  if (ps.pps_list[i]) {
143  pps = (const PPS*)ps.pps_list[i]->data;
144  break;
145  }
146  }
147 
148  if (pps) {
149  if (ps.sps_list[pps->sps_id]) {
150  sps = (const SPS*)ps.sps_list[pps->sps_id]->data;
151  }
152  }
153 
154  if (pps && sps) {
155  uint8_t *data = NULL;
156  int data_size = 0;
157 
158  avctx->profile = ff_h264_get_profile(sps);
159  avctx->level = sps->level_idc;
160 
161  if ((ret = h2645_ps_to_nalu(sps->data, sps->data_size, &data, &data_size)) < 0) {
162  goto done;
163  }
164  ff_AMediaFormat_setBuffer(format, "csd-0", (void*)data, data_size);
165  av_freep(&data);
166 
167  if ((ret = h2645_ps_to_nalu(pps->data, pps->data_size, &data, &data_size)) < 0) {
168  goto done;
169  }
170  ff_AMediaFormat_setBuffer(format, "csd-1", (void*)data, data_size);
171  av_freep(&data);
172  } else {
173  const int warn = is_avc && (avctx->codec_tag == MKTAG('a','v','c','1') ||
174  avctx->codec_tag == MKTAG('a','v','c','2'));
175  av_log(avctx, warn ? AV_LOG_WARNING : AV_LOG_DEBUG,
176  "Could not extract PPS/SPS from extradata\n");
177  ret = 0;
178  }
179 
180 done:
181  ff_h264_ps_uninit(&ps);
182 
183  return ret;
184 }
185 #endif
186 
187 #if CONFIG_HEVC_MEDIACODEC_DECODER
188 static int hevc_set_extradata(AVCodecContext *avctx, FFAMediaFormat *format)
189 {
190  int i;
191  int ret;
192 
193  HEVCParamSets ps;
194  HEVCSEI sei;
195 
196  const HEVCVPS *vps = NULL;
197  const HEVCPPS *pps = NULL;
198  const HEVCSPS *sps = NULL;
199  int is_nalff = 0;
200  int nal_length_size = 0;
201 
202  uint8_t *vps_data = NULL;
203  uint8_t *sps_data = NULL;
204  uint8_t *pps_data = NULL;
205  int vps_data_size = 0;
206  int sps_data_size = 0;
207  int pps_data_size = 0;
208 
209  memset(&ps, 0, sizeof(ps));
210  memset(&sei, 0, sizeof(sei));
211 
213  &ps, &sei, &is_nalff, &nal_length_size, 0, 1, avctx);
214  if (ret < 0) {
215  goto done;
216  }
217 
218  for (i = 0; i < HEVC_MAX_VPS_COUNT; i++) {
219  if (ps.vps_list[i]) {
220  vps = (const HEVCVPS*)ps.vps_list[i]->data;
221  break;
222  }
223  }
224 
225  for (i = 0; i < HEVC_MAX_PPS_COUNT; i++) {
226  if (ps.pps_list[i]) {
227  pps = (const HEVCPPS*)ps.pps_list[i]->data;
228  break;
229  }
230  }
231 
232  if (pps) {
233  if (ps.sps_list[pps->sps_id]) {
234  sps = (const HEVCSPS*)ps.sps_list[pps->sps_id]->data;
235  }
236  }
237 
238  if (vps && pps && sps) {
239  uint8_t *data;
240  int data_size;
241 
242  avctx->profile = sps->ptl.general_ptl.profile_idc;
243  avctx->level = sps->ptl.general_ptl.level_idc;
244 
245  if ((ret = h2645_ps_to_nalu(vps->data, vps->data_size, &vps_data, &vps_data_size)) < 0 ||
246  (ret = h2645_ps_to_nalu(sps->data, sps->data_size, &sps_data, &sps_data_size)) < 0 ||
247  (ret = h2645_ps_to_nalu(pps->data, pps->data_size, &pps_data, &pps_data_size)) < 0) {
248  goto done;
249  }
250 
251  data_size = vps_data_size + sps_data_size + pps_data_size;
252  data = av_mallocz(data_size);
253  if (!data) {
254  ret = AVERROR(ENOMEM);
255  goto done;
256  }
257 
258  memcpy(data , vps_data, vps_data_size);
259  memcpy(data + vps_data_size , sps_data, sps_data_size);
260  memcpy(data + vps_data_size + sps_data_size, pps_data, pps_data_size);
261 
262  ff_AMediaFormat_setBuffer(format, "csd-0", data, data_size);
263 
264  av_freep(&data);
265  } else {
266  const int warn = is_nalff && avctx->codec_tag == MKTAG('h','v','c','1');
267  av_log(avctx, warn ? AV_LOG_WARNING : AV_LOG_DEBUG,
268  "Could not extract VPS/PPS/SPS from extradata\n");
269  ret = 0;
270  }
271 
272 done:
273  ff_hevc_ps_uninit(&ps);
274 
275  av_freep(&vps_data);
276  av_freep(&sps_data);
277  av_freep(&pps_data);
278 
279  return ret;
280 }
281 #endif
282 
283 #if CONFIG_MPEG2_MEDIACODEC_DECODER || \
284  CONFIG_MPEG4_MEDIACODEC_DECODER || \
285  CONFIG_VP8_MEDIACODEC_DECODER || \
286  CONFIG_VP9_MEDIACODEC_DECODER
287 static int common_set_extradata(AVCodecContext *avctx, FFAMediaFormat *format)
288 {
289  int ret = 0;
290 
291  if (avctx->extradata) {
292  ff_AMediaFormat_setBuffer(format, "csd-0", avctx->extradata, avctx->extradata_size);
293  }
294 
295  return ret;
296 }
297 #endif
298 
300 {
301  int ret;
302  int sdk_int;
303 
304  const char *codec_mime = NULL;
305 
308 
310  if (!format) {
311  av_log(avctx, AV_LOG_ERROR, "Failed to create media format\n");
313  goto done;
314  }
315 
316  switch (avctx->codec_id) {
317 #if CONFIG_H264_MEDIACODEC_DECODER
318  case AV_CODEC_ID_H264:
319  codec_mime = "video/avc";
320 
321  ret = h264_set_extradata(avctx, format);
322  if (ret < 0)
323  goto done;
324  break;
325 #endif
326 #if CONFIG_HEVC_MEDIACODEC_DECODER
327  case AV_CODEC_ID_HEVC:
328  codec_mime = "video/hevc";
329 
330  ret = hevc_set_extradata(avctx, format);
331  if (ret < 0)
332  goto done;
333  break;
334 #endif
335 #if CONFIG_MPEG2_MEDIACODEC_DECODER
337  codec_mime = "video/mpeg2";
338 
339  ret = common_set_extradata(avctx, format);
340  if (ret < 0)
341  goto done;
342  break;
343 #endif
344 #if CONFIG_MPEG4_MEDIACODEC_DECODER
345  case AV_CODEC_ID_MPEG4:
346  codec_mime = "video/mp4v-es",
347 
348  ret = common_set_extradata(avctx, format);
349  if (ret < 0)
350  goto done;
351  break;
352 #endif
353 #if CONFIG_VP8_MEDIACODEC_DECODER
354  case AV_CODEC_ID_VP8:
355  codec_mime = "video/x-vnd.on2.vp8";
356 
357  ret = common_set_extradata(avctx, format);
358  if (ret < 0)
359  goto done;
360  break;
361 #endif
362 #if CONFIG_VP9_MEDIACODEC_DECODER
363  case AV_CODEC_ID_VP9:
364  codec_mime = "video/x-vnd.on2.vp9";
365 
366  ret = common_set_extradata(avctx, format);
367  if (ret < 0)
368  goto done;
369  break;
370 #endif
371  default:
372  av_assert0(0);
373  }
374 
375  ff_AMediaFormat_setString(format, "mime", codec_mime);
376  ff_AMediaFormat_setInt32(format, "width", avctx->width);
377  ff_AMediaFormat_setInt32(format, "height", avctx->height);
378 
379  s->ctx = av_mallocz(sizeof(*s->ctx));
380  if (!s->ctx) {
381  av_log(avctx, AV_LOG_ERROR, "Failed to allocate MediaCodecDecContext\n");
382  ret = AVERROR(ENOMEM);
383  goto done;
384  }
385 
386  s->ctx->delay_flush = s->delay_flush;
387 
388  if ((ret = ff_mediacodec_dec_init(avctx, s->ctx, codec_mime, format)) < 0) {
389  s->ctx = NULL;
390  goto done;
391  }
392 
393  av_log(avctx, AV_LOG_INFO,
394  "MediaCodec started successfully: codec = %s, ret = %d\n",
395  s->ctx->codec_name, ret);
396 
397  sdk_int = ff_Build_SDK_INT(avctx);
398  if (sdk_int <= 23 &&
399  strcmp(s->ctx->codec_name, "OMX.amlogic.mpeg2.decoder.awesome") == 0) {
400  av_log(avctx, AV_LOG_INFO, "Enabling workaround for %s on API=%d\n",
401  s->ctx->codec_name, sdk_int);
402  s->amlogic_mpeg2_api23_workaround = 1;
403  }
404 
405 done:
406  if (format) {
408  }
409 
410  if (ret < 0) {
412  }
413 
414  return ret;
415 }
416 
418 {
420  int ret;
421  ssize_t index;
422 
423  /* In delay_flush mode, wait until the user has released or rendered
424  all retained frames. */
425  if (s->delay_flush && ff_mediacodec_dec_is_flushing(avctx, s->ctx)) {
426  if (!ff_mediacodec_dec_flush(avctx, s->ctx)) {
427  return AVERROR(EAGAIN);
428  }
429  }
430 
431  /* poll for new frame */
432  ret = ff_mediacodec_dec_receive(avctx, s->ctx, frame, false);
433  if (ret != AVERROR(EAGAIN))
434  return ret;
435 
436  /* feed decoder */
437  while (1) {
438  if (s->ctx->current_input_buffer < 0) {
439  /* poll for input space */
440  index = ff_AMediaCodec_dequeueInputBuffer(s->ctx->codec, 0);
441  if (index < 0) {
442  /* no space, block for an output frame to appear */
443  return ff_mediacodec_dec_receive(avctx, s->ctx, frame, true);
444  }
445  s->ctx->current_input_buffer = index;
446  }
447 
448  /* try to flush any buffered packet data */
449  if (s->buffered_pkt.size > 0) {
450  ret = ff_mediacodec_dec_send(avctx, s->ctx, &s->buffered_pkt, false);
451  if (ret >= 0) {
452  s->buffered_pkt.size -= ret;
453  s->buffered_pkt.data += ret;
454  if (s->buffered_pkt.size <= 0) {
455  av_packet_unref(&s->buffered_pkt);
456  } else {
457  av_log(avctx, AV_LOG_WARNING,
458  "could not send entire packet in single input buffer (%d < %d)\n",
459  ret, s->buffered_pkt.size+ret);
460  }
461  } else if (ret < 0 && ret != AVERROR(EAGAIN)) {
462  return ret;
463  }
464 
465  if (s->amlogic_mpeg2_api23_workaround && s->buffered_pkt.size <= 0) {
466  /* fallthrough to fetch next packet regardless of input buffer space */
467  } else {
468  /* poll for space again */
469  continue;
470  }
471  }
472 
473  /* fetch new packet or eof */
474  ret = ff_decode_get_packet(avctx, &s->buffered_pkt);
475  if (ret == AVERROR_EOF) {
476  AVPacket null_pkt = { 0 };
477  ret = ff_mediacodec_dec_send(avctx, s->ctx, &null_pkt, true);
478  if (ret < 0)
479  return ret;
480  return ff_mediacodec_dec_receive(avctx, s->ctx, frame, true);
481  } else if (ret == AVERROR(EAGAIN) && s->ctx->current_input_buffer < 0) {
482  return ff_mediacodec_dec_receive(avctx, s->ctx, frame, true);
483  } else if (ret < 0) {
484  return ret;
485  }
486  }
487 
488  return AVERROR(EAGAIN);
489 }
490 
492 {
494 
495  av_packet_unref(&s->buffered_pkt);
496 
497  ff_mediacodec_dec_flush(avctx, s->ctx);
498 }
499 
501  &(const AVCodecHWConfigInternal) {
502  .public = {
506  .device_type = AV_HWDEVICE_TYPE_MEDIACODEC,
507  },
508  .hwaccel = NULL,
509  },
510  NULL
511 };
512 
513 #define OFFSET(x) offsetof(MediaCodecH264DecContext, x)
514 #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
516  { "delay_flush", "Delay flush until hw output buffers are returned to the decoder",
517  OFFSET(delay_flush), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, VD },
518  { NULL }
519 };
520 
521 #define DECLARE_MEDIACODEC_VCLASS(short_name) \
522 static const AVClass ff_##short_name##_mediacodec_dec_class = { \
523  .class_name = #short_name "_mediacodec", \
524  .item_name = av_default_item_name, \
525  .option = ff_mediacodec_vdec_options, \
526  .version = LIBAVUTIL_VERSION_INT, \
527 };
528 
529 #define DECLARE_MEDIACODEC_VDEC(short_name, full_name, codec_id, bsf) \
530 DECLARE_MEDIACODEC_VCLASS(short_name) \
531 const AVCodec ff_ ## short_name ## _mediacodec_decoder = { \
532  .name = #short_name "_mediacodec", \
533  .long_name = NULL_IF_CONFIG_SMALL(full_name " Android MediaCodec decoder"), \
534  .type = AVMEDIA_TYPE_VIDEO, \
535  .id = codec_id, \
536  .priv_class = &ff_##short_name##_mediacodec_dec_class, \
537  .priv_data_size = sizeof(MediaCodecH264DecContext), \
538  .init = mediacodec_decode_init, \
539  .receive_frame = mediacodec_receive_frame, \
540  .flush = mediacodec_decode_flush, \
541  .close = mediacodec_decode_close, \
542  .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HARDWARE, \
543  .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, \
544  .bsfs = bsf, \
545  .hw_configs = mediacodec_hw_configs, \
546  .wrapper_name = "mediacodec", \
547 }; \
548 
549 #if CONFIG_H264_MEDIACODEC_DECODER
550 DECLARE_MEDIACODEC_VDEC(h264, "H.264", AV_CODEC_ID_H264, "h264_mp4toannexb")
551 #endif
552 
553 #if CONFIG_HEVC_MEDIACODEC_DECODER
554 DECLARE_MEDIACODEC_VDEC(hevc, "H.265", AV_CODEC_ID_HEVC, "hevc_mp4toannexb")
555 #endif
556 
557 #if CONFIG_MPEG2_MEDIACODEC_DECODER
559 #endif
560 
561 #if CONFIG_MPEG4_MEDIACODEC_DECODER
563 #endif
564 
565 #if CONFIG_VP8_MEDIACODEC_DECODER
567 #endif
568 
569 #if CONFIG_VP9_MEDIACODEC_DECODER
571 #endif
HEVC_MAX_PPS_COUNT
@ HEVC_MAX_PPS_COUNT
Definition: hevc.h:114
hwconfig.h
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: avpacket.c:424
MediaCodecDecContext
Definition: mediacodecdec_common.h:37
ff_decode_get_packet
int ff_decode_get_packet(AVCodecContext *avctx, AVPacket *pkt)
Called by decoders to get the next packet for decoding.
Definition: decode.c:224
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
opt.h
ff_h264_ps_uninit
void ff_h264_ps_uninit(H264ParamSets *ps)
Uninit H264 param sets structure.
Definition: h264_ps.c:317
mediacodec_receive_frame
static int mediacodec_receive_frame(AVCodecContext *avctx, AVFrame *frame)
Definition: mediacodecdec.c:417
out
FILE * out
Definition: movenc.c:54
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:57
AVBufferRef::data
uint8_t * data
The data buffer.
Definition: buffer.h:90
mediacodec_decode_init
static av_cold int mediacodec_decode_init(AVCodecContext *avctx)
Definition: mediacodecdec.c:299
ff_mediacodec_dec_close
int ff_mediacodec_dec_close(AVCodecContext *avctx, MediaCodecDecContext *s)
Definition: mediacodecdec_common.c:891
out_size
int out_size
Definition: movenc.c:55
AV_CODEC_ID_MPEG4
@ AV_CODEC_ID_MPEG4
Definition: codec_id.h:62
MediaCodecH264DecContext::buffered_pkt
AVPacket buffered_pkt
Definition: mediacodecdec.c:48
h264_parse.h
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:317
index
fg index
Definition: ffmpeg_filter.c:167
ff_mediacodec_dec_receive
int ff_mediacodec_dec_receive(AVCodecContext *avctx, MediaCodecDecContext *s, AVFrame *frame, bool wait)
Definition: mediacodecdec_common.c:750
internal.h
AVOption
AVOption.
Definition: opt.h:247
data
const char data[16]
Definition: mxf.c:143
AV_HWDEVICE_TYPE_MEDIACODEC
@ AV_HWDEVICE_TYPE_MEDIACODEC
Definition: hwcontext.h:38
ff_mediacodec_dec_is_flushing
int ff_mediacodec_dec_is_flushing(AVCodecContext *avctx, MediaCodecDecContext *s)
Definition: mediacodecdec_common.c:898
ff_AMediaFormat_setBuffer
void ff_AMediaFormat_setBuffer(FFAMediaFormat *format, const char *name, void *data, size_t size)
Definition: mediacodec_wrapper.c:1088
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:31
ff_AMediaFormat_new
FFAMediaFormat * ff_AMediaFormat_new(void)
Definition: mediacodec_wrapper.c:626
MediaCodecH264DecContext::amlogic_mpeg2_api23_workaround
int amlogic_mpeg2_api23_workaround
Definition: mediacodecdec.c:51
ff_mediacodec_dec_flush
int ff_mediacodec_dec_flush(AVCodecContext *avctx, MediaCodecDecContext *s)
Definition: mediacodecdec_common.c:873
mediacodecdec_common.h
hevc_parse.h
avassert.h
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
av_cold
#define av_cold
Definition: attributes.h:90
AVCodecContext::extradata_size
int extradata_size
Definition: avcodec.h:485
ff_Build_SDK_INT
int ff_Build_SDK_INT(AVCodecContext *avctx)
Definition: mediacodec_wrapper.c:1710
intreadwrite.h
s
#define s(width, name)
Definition: cbs_vp9.c:257
ff_h264_decode_extradata
int ff_h264_decode_extradata(const uint8_t *data, int size, H264ParamSets *ps, int *is_avc, int *nal_length_size, int err_recognition, void *logctx)
Definition: h264_parse.c:462
AV_CODEC_ID_VP9
@ AV_CODEC_ID_VP9
Definition: codec_id.h:218
HEVCSEI
Definition: hevc_sei.h:133
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:201
decode.h
AVCodecHWConfig::pix_fmt
enum AVPixelFormat pix_fmt
For decoders, a hardware pixel format which that decoder may be able to decode to if suitable hardwar...
Definition: codec.h:469
H264ParamSets::sps_list
AVBufferRef * sps_list[MAX_SPS_COUNT]
Definition: h264_ps.h:144
OFFSET
#define OFFSET(x)
Definition: mediacodecdec.c:513
AV_CODEC_ID_H264
@ AV_CODEC_ID_H264
Definition: codec_id.h:77
AVCodecContext::codec_id
enum AVCodecID codec_id
Definition: avcodec.h:393
AV_PIX_FMT_MEDIACODEC
@ AV_PIX_FMT_MEDIACODEC
hardware decoding through MediaCodec
Definition: pixfmt.h:283
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:66
NULL
#define NULL
Definition: coverity.c:32
av_realloc
void * av_realloc(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory.
Definition: mem.c:152
ff_hevc_ps_uninit
void ff_hevc_ps_uninit(HEVCParamSets *ps)
Definition: hevc_ps.c:1747
SPS
Sequence parameter set.
Definition: h264_ps.h:44
AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX
@ AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX
The codec supports this format via the hw_device_ctx interface.
Definition: codec.h:428
src
#define src
Definition: vp8dsp.c:255
PPS
Picture parameter set.
Definition: h264_ps.h:111
MAX_PPS_COUNT
#define MAX_PPS_COUNT
Definition: h264_ps.h:38
vps
static int FUNC() vps(CodedBitstreamContext *ctx, RWContext *rw, H265RawVPS *current)
Definition: cbs_h265_syntax_template.c:423
ff_hevc_decode_extradata
int ff_hevc_decode_extradata(const uint8_t *data, int size, HEVCParamSets *ps, HEVCSEI *sei, int *is_nalff, int *nal_length_size, int err_recognition, int apply_defdispwin, void *logctx)
Definition: hevc_parse.c:80
sei
static int FUNC() sei(CodedBitstreamContext *ctx, RWContext *rw, H264RawSEI *current)
Definition: cbs_h264_syntax_template.c:825
AVCodecContext::level
int level
level
Definition: avcodec.h:1651
HEVC_MAX_VPS_COUNT
@ HEVC_MAX_VPS_COUNT
Definition: hevc.h:110
pps
static int FUNC() pps(CodedBitstreamContext *ctx, RWContext *rw, H264RawPPS *current)
Definition: cbs_h264_syntax_template.c:404
ff_AMediaFormat_setInt32
void ff_AMediaFormat_setInt32(FFAMediaFormat *format, const char *name, int32_t value)
Definition: mediacodec_wrapper.c:978
VD
#define VD
Definition: mediacodecdec.c:514
MediaCodecH264DecContext
Definition: mediacodecdec.c:42
format
ofilter format
Definition: ffmpeg_filter.c:172
AVCodecHWConfigInternal
Definition: hwconfig.h:29
HEVCParamSets::pps_list
AVBufferRef * pps_list[HEVC_MAX_PPS_COUNT]
Definition: hevc_ps.h:330
AVERROR_EXTERNAL
#define AVERROR_EXTERNAL
Generic error in an external library.
Definition: error.h:59
ff_AMediaCodec_dequeueInputBuffer
ssize_t ff_AMediaCodec_dequeueInputBuffer(FFAMediaCodec *codec, int64_t timeoutUs)
Definition: mediacodec_wrapper.c:1464
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:191
ff_AMediaFormat_setString
void ff_AMediaFormat_setString(FFAMediaFormat *format, const char *name, const char *value)
Definition: mediacodec_wrapper.c:1053
mediacodec_decode_flush
static void mediacodec_decode_flush(AVCodecContext *avctx)
Definition: mediacodecdec.c:491
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:271
mediacodec_wrapper.h
AVCodecContext::extradata
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
Definition: avcodec.h:484
internal.h
AV_CODEC_HW_CONFIG_METHOD_AD_HOC
@ AV_CODEC_HW_CONFIG_METHOD_AD_HOC
The codec supports this format by some ad-hoc method.
Definition: codec.h:457
common.h
AV_CODEC_ID_HEVC
@ AV_CODEC_ID_HEVC
Definition: codec_id.h:224
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:263
AVCodecContext::height
int height
Definition: avcodec.h:556
MediaCodecH264DecContext::avclass
AVClass * avclass
Definition: mediacodecdec.c:44
avcodec.h
ret
ret
Definition: filter_design.txt:187
pixfmt.h
ff_h264_get_profile
int ff_h264_get_profile(const SPS *sps)
Compute profile from profile_idc and constraint_set?_flags.
Definition: h264_parse.c:529
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:264
sps
static int FUNC() sps(CodedBitstreamContext *ctx, RWContext *rw, H264RawSPS *current)
Definition: cbs_h264_syntax_template.c:260
MediaCodecH264DecContext::delay_flush
int delay_flush
Definition: mediacodecdec.c:50
DECLARE_MEDIACODEC_VDEC
#define DECLARE_MEDIACODEC_VDEC(short_name, full_name, codec_id, bsf)
Definition: mediacodecdec.c:529
AVCodecContext
main external API structure.
Definition: avcodec.h:383
H264ParamSets::pps_list
AVBufferRef * pps_list[MAX_PPS_COUNT]
Definition: h264_ps.h:145
AVCodecContext::profile
int profile
profile
Definition: avcodec.h:1525
ff_AMediaFormat_delete
int ff_AMediaFormat_delete(FFAMediaFormat *format)
Definition: mediacodec_wrapper.c:706
H264ParamSets
Definition: h264_ps.h:143
HEVCParamSets::sps_list
AVBufferRef * sps_list[HEVC_MAX_SPS_COUNT]
Definition: hevc_ps.h:329
ff_mediacodec_vdec_options
static const AVOption ff_mediacodec_vdec_options[]
Definition: mediacodecdec.c:515
MediaCodecH264DecContext::ctx
MediaCodecDecContext * ctx
Definition: mediacodecdec.c:46
HEVCVPS
Definition: hevc_ps.h:123
HEVCSPS
Definition: hevc_ps.h:153
HEVCPPS
Definition: hevc_ps.h:249
AVCodecContext::codec_tag
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
Definition: avcodec.h:408
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:410
AVPacket
This structure stores compressed data.
Definition: packet.h:350
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Definition: opt.h:241
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:556
ff_mediacodec_dec_send
int ff_mediacodec_dec_send(AVCodecContext *avctx, MediaCodecDecContext *s, AVPacket *pkt, bool wait)
Definition: mediacodecdec_common.c:656
AV_CODEC_ID_VP8
@ AV_CODEC_ID_VP8
Definition: codec_id.h:190
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
MKTAG
#define MKTAG(a, b, c, d)
Definition: macros.h:55
mediacodec_hw_configs
static const AVCodecHWConfigInternal *const mediacodec_hw_configs[]
Definition: mediacodecdec.c:500
AVCodecHWConfigInternal::public
AVCodecHWConfig public
This is the structure which will be returned to the user by avcodec_get_hw_config().
Definition: hwconfig.h:34
AV_CODEC_ID_MPEG2VIDEO
@ AV_CODEC_ID_MPEG2VIDEO
preferred ID for MPEG-1/2 video decoding
Definition: codec_id.h:52
FFAMediaFormat
Definition: mediacodec_wrapper.c:164
mediacodec_decode_close
static av_cold int mediacodec_decode_close(AVCodecContext *avctx)
Definition: mediacodecdec.c:55
HEVCParamSets::vps_list
AVBufferRef * vps_list[HEVC_MAX_VPS_COUNT]
Definition: hevc_ps.h:328
ff_mediacodec_dec_init
int ff_mediacodec_dec_init(AVCodecContext *avctx, MediaCodecDecContext *s, const char *mime, FFAMediaFormat *format)
Definition: mediacodecdec_common.c:555
HEVCParamSets
Definition: hevc_ps.h:327