FFmpeg
mediacodecdec_common.c
Go to the documentation of this file.
1 /*
2  * Android MediaCodec decoder
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 <string.h>
24 #include <sys/types.h>
25 
26 #include "libavutil/avassert.h"
27 #include "libavutil/common.h"
29 #include "libavutil/mem.h"
30 #include "libavutil/log.h"
31 #include "libavutil/pixfmt.h"
32 #include "libavutil/time.h"
33 #include "libavutil/timestamp.h"
35 
36 #include "avcodec.h"
37 #include "decode.h"
38 
39 #include "mediacodec.h"
40 #include "mediacodec_surface.h"
41 #include "mediacodec_sw_buffer.h"
42 #include "mediacodec_wrapper.h"
43 #include "mediacodecdec_common.h"
44 
45 /**
46  * OMX.k3.video.decoder.avc, OMX.NVIDIA.* OMX.SEC.avc.dec and OMX.google
47  * codec workarounds used in various place are taken from the Gstreamer
48  * project.
49  *
50  * Gstreamer references:
51  * https://cgit.freedesktop.org/gstreamer/gst-plugins-bad/tree/sys/androidmedia/
52  *
53  * Gstreamer copyright notice:
54  *
55  * Copyright (C) 2012, Collabora Ltd.
56  * Author: Sebastian Dröge <sebastian.droege@collabora.co.uk>
57  *
58  * Copyright (C) 2012, Rafaël Carré <funman@videolanorg>
59  *
60  * Copyright (C) 2015, Sebastian Dröge <sebastian@centricular.com>
61  *
62  * Copyright (C) 2014-2015, Collabora Ltd.
63  * Author: Matthieu Bouron <matthieu.bouron@gcollabora.com>
64  *
65  * Copyright (C) 2015, Edward Hervey
66  * Author: Edward Hervey <bilboed@gmail.com>
67  *
68  * Copyright (C) 2015, Matthew Waters <matthew@centricular.com>
69  *
70  * This library is free software; you can redistribute it and/or
71  * modify it under the terms of the GNU Lesser General Public
72  * License as published by the Free Software Foundation
73  * version 2.1 of the License.
74  *
75  * This library is distributed in the hope that it will be useful,
76  * but WITHOUT ANY WARRANTY; without even the implied warranty of
77  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
78  * Lesser General Public License for more details.
79  *
80  * You should have received a copy of the GNU Lesser General Public
81  * License along with this library; if not, write to the Free Software
82  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
83  *
84  */
85 
86 #define INPUT_DEQUEUE_TIMEOUT_US 8000
87 #define OUTPUT_DEQUEUE_TIMEOUT_US 8000
88 #define OUTPUT_DEQUEUE_BLOCK_TIMEOUT_US 1000000
89 
90 enum {
91  ENCODING_PCM_16BIT = 0x00000002,
92  ENCODING_PCM_8BIT = 0x00000003,
93  ENCODING_PCM_FLOAT = 0x00000004,
95  ENCODING_PCM_32BIT = 0x00000016,
96 };
97 
98 static const struct {
99 
102 
103 } sample_formats[] = {
104 
109  { 0 }
110 };
111 
114  int pcm_format)
115 {
117 
118  for (int i = 0; i < FF_ARRAY_ELEMS(sample_formats); i++) {
120  return sample_formats[i].sample_format;
121  }
122  }
123 
124  av_log(avctx, AV_LOG_ERROR, "Output sample format 0x%x (value=%d) is not supported\n",
126 
127  return ret;
128 }
129 
130 enum
131 {
150 };
151 
152 static const struct {
153 
154  int mask;
155  uint64_t layout;
156 
157 } channel_masks[] = {
176 };
177 
178 static uint64_t mcdec_map_channel_mask(AVCodecContext *avctx,
179  int channel_mask)
180 {
181  uint64_t channel_layout = 0;
182 
183  for (int i = 0; i < FF_ARRAY_ELEMS(channel_masks); i++) {
184  if (channel_mask & channel_masks[i].mask)
185  channel_layout |= channel_masks[i].layout;
186  }
187 
188  return channel_layout;
189 }
190 
191 enum {
201 };
202 
203 static const struct {
204 
207 
208 } color_formats[] = {
209 
217  { 0 }
218 };
219 
222  int color_format)
223 {
224  int i;
226 
227  if (s->surface) {
228  return AV_PIX_FMT_MEDIACODEC;
229  }
230 
231  if (!strcmp(s->codec_name, "OMX.k3.video.decoder.avc") && color_format == COLOR_FormatYCbYCr) {
233  }
234 
235  for (i = 0; i < FF_ARRAY_ELEMS(color_formats); i++) {
237  return color_formats[i].pix_fmt;
238  }
239  }
240 
241  av_log(avctx, AV_LOG_ERROR, "Output color format 0x%x (value=%d) is not supported\n",
243 
244  return ret;
245 }
246 
248 {
249  atomic_fetch_add(&s->refcount, 1);
250 }
251 
253 {
254  if (!s)
255  return;
256 
257  if (atomic_fetch_sub(&s->refcount, 1) == 1) {
258  if (s->codec) {
259  ff_AMediaCodec_delete(s->codec);
260  s->codec = NULL;
261  }
262 
263  if (s->format) {
264  ff_AMediaFormat_delete(s->format);
265  s->format = NULL;
266  }
267 
268  if (s->surface) {
270  s->surface = NULL;
271  }
272 
273  av_freep(&s->codec_name);
274  av_freep(&s);
275  }
276 }
277 
278 static void mediacodec_buffer_release(void *opaque, uint8_t *data)
279 {
280  AVMediaCodecBuffer *buffer = opaque;
282  int released = atomic_load(&buffer->released);
283 
284  if (!released && (ctx->delay_flush || buffer->serial == atomic_load(&ctx->serial))) {
285  atomic_fetch_sub(&ctx->hw_buffer_count, 1);
286  av_log(ctx->avctx, AV_LOG_DEBUG,
287  "Releasing output buffer %zd (%p) ts=%"PRId64" on free() [%d pending]\n",
288  buffer->index, buffer, buffer->pts, atomic_load(&ctx->hw_buffer_count));
289  ff_AMediaCodec_releaseOutputBuffer(ctx->codec, buffer->index, 0);
290  }
291 
293  av_freep(&buffer);
294 }
295 
298  ssize_t index,
300  AVFrame *frame)
301 {
302  int ret = 0;
303  int status = 0;
304  AVMediaCodecBuffer *buffer = NULL;
305 
306  frame->buf[0] = NULL;
307  frame->width = avctx->width;
308  frame->height = avctx->height;
309  frame->format = avctx->pix_fmt;
310  frame->sample_aspect_ratio = avctx->sample_aspect_ratio;
311 
312  if (avctx->pkt_timebase.num && avctx->pkt_timebase.den) {
313  frame->pts = av_rescale_q(info->presentationTimeUs,
315  avctx->pkt_timebase);
316  } else {
317  frame->pts = info->presentationTimeUs;
318  }
319  frame->pkt_dts = AV_NOPTS_VALUE;
320  frame->color_range = avctx->color_range;
321  frame->color_primaries = avctx->color_primaries;
322  frame->color_trc = avctx->color_trc;
323  frame->colorspace = avctx->colorspace;
324 
325  buffer = av_mallocz(sizeof(AVMediaCodecBuffer));
326  if (!buffer) {
327  ret = AVERROR(ENOMEM);
328  goto fail;
329  }
330 
331  atomic_init(&buffer->released, 0);
332 
333  frame->buf[0] = av_buffer_create(NULL,
334  0,
336  buffer,
338 
339  if (!frame->buf[0]) {
340  ret = AVERROR(ENOMEM);
341  goto fail;
342 
343  }
344 
345  buffer->ctx = s;
346  buffer->serial = atomic_load(&s->serial);
348 
349  buffer->index = index;
350  buffer->pts = info->presentationTimeUs;
351 
352  frame->data[3] = (uint8_t *)buffer;
353 
354  atomic_fetch_add(&s->hw_buffer_count, 1);
355  av_log(avctx, AV_LOG_DEBUG,
356  "Wrapping output buffer %zd (%p) ts=%"PRId64" [%d pending]\n",
357  buffer->index, buffer, buffer->pts, atomic_load(&s->hw_buffer_count));
358 
359  return 0;
360 fail:
361  av_freep(&buffer);
363  if (status < 0) {
364  av_log(avctx, AV_LOG_ERROR, "Failed to release output buffer\n");
366  }
367 
368  return ret;
369 }
370 
373  uint8_t *data,
374  size_t size,
375  ssize_t index,
377  AVFrame *frame)
378 {
379  int ret = 0;
380  int status = 0;
381  const int sample_size = av_get_bytes_per_sample(avctx->sample_fmt);
382  if (!sample_size) {
383  av_log(avctx, AV_LOG_ERROR, "Could not get bytes per sample\n");
384  ret = AVERROR(ENOSYS);
385  goto done;
386  }
387 
388  frame->format = avctx->sample_fmt;
389  frame->sample_rate = avctx->sample_rate;
390  frame->nb_samples = info->size / (sample_size * avctx->ch_layout.nb_channels);
391 
392  ret = av_channel_layout_copy(&frame->ch_layout, &avctx->ch_layout);
393  if (ret < 0) {
394  av_log(avctx, AV_LOG_ERROR, "Could not copy channel layout\n");
395  goto done;
396  }
397 
398  /* MediaCodec buffers needs to be copied to our own refcounted buffers
399  * because the flush command invalidates all input and output buffers.
400  */
401  ret = ff_get_buffer(avctx, frame, 0);
402  if (ret < 0) {
403  av_log(avctx, AV_LOG_ERROR, "Could not allocate buffer\n");
404  goto done;
405  }
406 
407  /* Override frame->pts as ff_get_buffer will override its value based
408  * on the last avpacket received which is not in sync with the frame:
409  * * N avpackets can be pushed before 1 frame is actually returned
410  * * 0-sized avpackets are pushed to flush remaining frames at EOS */
411  if (avctx->pkt_timebase.num && avctx->pkt_timebase.den) {
412  frame->pts = av_rescale_q(info->presentationTimeUs,
414  avctx->pkt_timebase);
415  } else {
416  frame->pts = info->presentationTimeUs;
417  }
418  frame->pkt_dts = AV_NOPTS_VALUE;
419 
420  av_log(avctx, AV_LOG_TRACE,
421  "Frame: format=%d channels=%d sample_rate=%d nb_samples=%d",
422  avctx->sample_fmt, avctx->ch_layout.nb_channels, avctx->sample_rate, frame->nb_samples);
423 
424  memcpy(frame->data[0], data, info->size);
425 
426  ret = 0;
427 done:
429  if (status < 0) {
430  av_log(avctx, AV_LOG_ERROR, "Failed to release output buffer\n");
432  }
433 
434  return ret;
435 }
436 
439  uint8_t *data,
440  size_t size,
441  ssize_t index,
443  AVFrame *frame)
444 {
445  int ret = 0;
446  int status = 0;
447 
448  frame->width = avctx->width;
449  frame->height = avctx->height;
450  frame->format = avctx->pix_fmt;
451 
452  /* MediaCodec buffers needs to be copied to our own refcounted buffers
453  * because the flush command invalidates all input and output buffers.
454  */
455  if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) {
456  av_log(avctx, AV_LOG_ERROR, "Could not allocate buffer\n");
457  goto done;
458  }
459 
460  /* Override frame->pkt_pts as ff_get_buffer will override its value based
461  * on the last avpacket received which is not in sync with the frame:
462  * * N avpackets can be pushed before 1 frame is actually returned
463  * * 0-sized avpackets are pushed to flush remaining frames at EOS */
464  if (avctx->pkt_timebase.num && avctx->pkt_timebase.den) {
465  frame->pts = av_rescale_q(info->presentationTimeUs,
467  avctx->pkt_timebase);
468  } else {
469  frame->pts = info->presentationTimeUs;
470  }
471  frame->pkt_dts = AV_NOPTS_VALUE;
472 
473  av_log(avctx, AV_LOG_TRACE,
474  "Frame: width=%d stride=%d height=%d slice-height=%d "
475  "crop-top=%d crop-bottom=%d crop-left=%d crop-right=%d encoder=%s "
476  "destination linesizes=%d,%d,%d\n" ,
477  avctx->width, s->stride, avctx->height, s->slice_height,
478  s->crop_top, s->crop_bottom, s->crop_left, s->crop_right, s->codec_name,
479  frame->linesize[0], frame->linesize[1], frame->linesize[2]);
480 
481  switch (s->color_format) {
484  break;
489  break;
493  break;
496  break;
497  default:
498  av_log(avctx, AV_LOG_ERROR, "Unsupported color format 0x%x (value=%d)\n",
499  s->color_format, s->color_format);
500  ret = AVERROR(EINVAL);
501  goto done;
502  }
503 
504  ret = 0;
505 done:
507  if (status < 0) {
508  av_log(avctx, AV_LOG_ERROR, "Failed to release output buffer\n");
510  }
511 
512  return ret;
513 }
514 
517  uint8_t *data,
518  size_t size,
519  ssize_t index,
521  AVFrame *frame)
522 {
523  if (avctx->codec_type == AVMEDIA_TYPE_AUDIO)
525  else if (avctx->codec_type == AVMEDIA_TYPE_VIDEO)
527  else
528  av_assert0(0);
529 }
530 
531 #define AMEDIAFORMAT_GET_INT32(name, key, mandatory) do { \
532  int32_t value = 0; \
533  if (ff_AMediaFormat_getInt32(s->format, key, &value)) { \
534  (name) = value; \
535  } else if (mandatory) { \
536  av_log(avctx, AV_LOG_ERROR, "Could not get %s from format %s\n", key, format); \
537  ret = AVERROR_EXTERNAL; \
538  goto fail; \
539  } \
540 } while (0) \
541 
543 {
544  int ret = 0;
545  int width = 0;
546  int height = 0;
547  int color_range = 0;
548  int color_standard = 0;
549  int color_transfer = 0;
550  char *format = NULL;
551 
552  if (!s->format) {
553  av_log(avctx, AV_LOG_ERROR, "Output MediaFormat is not set\n");
554  return AVERROR(EINVAL);
555  }
556 
557  format = ff_AMediaFormat_toString(s->format);
558  if (!format) {
559  return AVERROR_EXTERNAL;
560  }
561  av_log(avctx, AV_LOG_DEBUG, "Parsing MediaFormat %s\n", format);
562 
563  /* Mandatory fields */
564  AMEDIAFORMAT_GET_INT32(s->width, "width", 1);
565  AMEDIAFORMAT_GET_INT32(s->height, "height", 1);
566 
567  AMEDIAFORMAT_GET_INT32(s->stride, "stride", 0);
568  s->stride = s->stride > 0 ? s->stride : s->width;
569 
570  AMEDIAFORMAT_GET_INT32(s->slice_height, "slice-height", 0);
571 
572  if (strstr(s->codec_name, "OMX.Nvidia.") && s->slice_height == 0) {
573  s->slice_height = FFALIGN(s->height, 16);
574  } else if (strstr(s->codec_name, "OMX.SEC.avc.dec")) {
575  s->slice_height = avctx->height;
576  s->stride = avctx->width;
577  } else if (s->slice_height == 0) {
578  s->slice_height = s->height;
579  }
580 
581  AMEDIAFORMAT_GET_INT32(s->color_format, "color-format", 1);
582  avctx->pix_fmt = mcdec_map_color_format(avctx, s, s->color_format);
583  if (avctx->pix_fmt == AV_PIX_FMT_NONE) {
584  av_log(avctx, AV_LOG_ERROR, "Output color format is not supported\n");
585  ret = AVERROR(EINVAL);
586  goto fail;
587  }
588 
589  /* Optional fields */
590  AMEDIAFORMAT_GET_INT32(s->crop_top, "crop-top", 0);
591  AMEDIAFORMAT_GET_INT32(s->crop_bottom, "crop-bottom", 0);
592  AMEDIAFORMAT_GET_INT32(s->crop_left, "crop-left", 0);
593  AMEDIAFORMAT_GET_INT32(s->crop_right, "crop-right", 0);
594 
595  // Try "crop" for NDK
596  if (!(s->crop_right && s->crop_bottom) && s->use_ndk_codec)
597  ff_AMediaFormat_getRect(s->format, "crop", &s->crop_left, &s->crop_top, &s->crop_right, &s->crop_bottom);
598 
599  if (s->crop_right && s->crop_bottom) {
600  width = s->crop_right + 1 - s->crop_left;
601  height = s->crop_bottom + 1 - s->crop_top;
602  } else {
603  /* TODO: NDK MediaFormat should try getRect() first.
604  * Try crop-width/crop-height, it works on NVIDIA Shield.
605  */
606  AMEDIAFORMAT_GET_INT32(width, "crop-width", 0);
607  AMEDIAFORMAT_GET_INT32(height, "crop-height", 0);
608  }
609  if (!width || !height) {
610  width = s->width;
611  height = s->height;
612  }
613 
614  AMEDIAFORMAT_GET_INT32(s->display_width, "display-width", 0);
615  AMEDIAFORMAT_GET_INT32(s->display_height, "display-height", 0);
616 
617  if (s->display_width && s->display_height) {
618  AVRational sar = av_div_q(
619  (AVRational){ s->display_width, s->display_height },
620  (AVRational){ width, height });
621  ff_set_sar(avctx, sar);
622  }
623 
624  AMEDIAFORMAT_GET_INT32(color_range, "color-range", 0);
625  if (color_range)
627 
628  AMEDIAFORMAT_GET_INT32(color_standard, "color-standard", 0);
629  if (color_standard) {
632  }
633 
634  AMEDIAFORMAT_GET_INT32(color_transfer, "color-transfer", 0);
635  if (color_transfer)
637 
638  av_log(avctx, AV_LOG_INFO,
639  "Output crop parameters top=%d bottom=%d left=%d right=%d, "
640  "resulting dimensions width=%d height=%d\n",
641  s->crop_top, s->crop_bottom, s->crop_left, s->crop_right,
642  width, height);
643 
644  av_freep(&format);
645  return ff_set_dimensions(avctx, width, height);
646 fail:
647  av_freep(&format);
648  return ret;
649 }
650 
652 {
653  int ret = 0;
654  int sample_rate = 0;
655  int channel_count = 0;
656  int channel_mask = 0;
657  int pcm_encoding = 0;
658  char *format = NULL;
659 
660  if (!s->format) {
661  av_log(avctx, AV_LOG_ERROR, "Output MediaFormat is not set\n");
662  return AVERROR(EINVAL);
663  }
664 
665  format = ff_AMediaFormat_toString(s->format);
666  if (!format) {
667  return AVERROR_EXTERNAL;
668  }
669  av_log(avctx, AV_LOG_DEBUG, "Parsing MediaFormat %s\n", format);
670 
671  /* Mandatory fields */
672  AMEDIAFORMAT_GET_INT32(channel_count, "channel-count", 1);
673  AMEDIAFORMAT_GET_INT32(sample_rate, "sample-rate", 1);
674 
675  AMEDIAFORMAT_GET_INT32(pcm_encoding, "pcm-encoding", 0);
676  if (pcm_encoding)
677  avctx->sample_fmt = mcdec_map_pcm_format(avctx, s, pcm_encoding);
678  else
679  avctx->sample_fmt = AV_SAMPLE_FMT_S16;
680 
681  avctx->sample_rate = sample_rate;
682 
683  AMEDIAFORMAT_GET_INT32(channel_mask, "channel-mask", 0);
684  if (channel_mask)
685  av_channel_layout_from_mask(&avctx->ch_layout, mcdec_map_channel_mask(avctx, channel_mask));
686  else
687  av_channel_layout_default(&avctx->ch_layout, channel_count);
688 
689  av_log(avctx, AV_LOG_INFO,
690  "Output parameters channel-count=%d channel-layout=%x sample-rate=%d\n",
691  channel_count, channel_mask, sample_rate);
692 
693 fail:
694  av_freep(&format);
695  return ret;
696 }
697 
699 {
700  if (avctx->codec_type == AVMEDIA_TYPE_AUDIO)
701  return mediacodec_dec_parse_audio_format(avctx, s);
702  else if (avctx->codec_type == AVMEDIA_TYPE_VIDEO)
703  return mediacodec_dec_parse_video_format(avctx, s);
704  else
705  av_assert0(0);
706 }
707 
709 {
710  FFAMediaCodec *codec = s->codec;
711  int status;
712 
713  s->output_buffer_count = 0;
714 
715  s->draining = 0;
716  s->flushing = 0;
717  s->eos = 0;
718  atomic_fetch_add(&s->serial, 1);
719  atomic_init(&s->hw_buffer_count, 0);
720  s->current_input_buffer = -1;
721 
722  status = ff_AMediaCodec_flush(codec);
723  if (status < 0) {
724  av_log(avctx, AV_LOG_ERROR, "Failed to flush codec\n");
725  return AVERROR_EXTERNAL;
726  }
727 
728  return 0;
729 }
730 
732  const char *mime, FFAMediaFormat *format)
733 {
734  int profile;
735 
736  enum AVPixelFormat pix_fmt;
737  static const enum AVPixelFormat pix_fmts[] = {
740  };
741 
742  pix_fmt = ff_get_format(avctx, pix_fmts);
744  AVMediaCodecContext *user_ctx = avctx->hwaccel_context;
745 
746  if (avctx->hw_device_ctx) {
747  AVHWDeviceContext *device_ctx = (AVHWDeviceContext*)(avctx->hw_device_ctx->data);
748  if (device_ctx->type == AV_HWDEVICE_TYPE_MEDIACODEC) {
749  if (device_ctx->hwctx) {
750  AVMediaCodecDeviceContext *mediacodec_ctx = (AVMediaCodecDeviceContext *)device_ctx->hwctx;
751  s->surface = ff_mediacodec_surface_ref(mediacodec_ctx->surface, mediacodec_ctx->native_window, avctx);
752  av_log(avctx, AV_LOG_INFO, "Using surface %p\n", s->surface);
753  }
754  }
755  }
756 
757  if (!s->surface && user_ctx && user_ctx->surface) {
758  s->surface = ff_mediacodec_surface_ref(user_ctx->surface, NULL, avctx);
759  av_log(avctx, AV_LOG_INFO, "Using surface %p\n", s->surface);
760  }
761  }
762 
764  if (profile < 0) {
765  av_log(avctx, AV_LOG_WARNING, "Unsupported or unknown profile\n");
766  }
767 
768  s->codec_name = ff_AMediaCodecList_getCodecNameByType(mime, profile, 0, avctx);
769  if (!s->codec_name) {
770  // getCodecNameByType() can fail due to missing JVM, while NDK
771  // mediacodec can be used without JVM.
772  if (!s->use_ndk_codec) {
773  return AVERROR_EXTERNAL;
774  }
775  av_log(avctx, AV_LOG_INFO, "Failed to getCodecNameByType\n");
776  } else {
777  av_log(avctx, AV_LOG_DEBUG, "Found decoder %s\n", s->codec_name);
778  }
779 
780  if (s->codec_name)
781  s->codec = ff_AMediaCodec_createCodecByName(s->codec_name, s->use_ndk_codec);
782  else {
783  s->codec = ff_AMediaCodec_createDecoderByType(mime, s->use_ndk_codec);
784  if (s->codec) {
785  s->codec_name = ff_AMediaCodec_getName(s->codec);
786  if (!s->codec_name)
787  s->codec_name = av_strdup(mime);
788  }
789  }
790  if (!s->codec) {
791  av_log(avctx, AV_LOG_ERROR, "Failed to create media decoder for type %s and name %s\n", mime, s->codec_name);
792  return AVERROR_EXTERNAL;
793  }
794 
795  return 0;
796 }
797 
799  const char *mime, FFAMediaFormat *format)
800 {
801  s->codec = ff_AMediaCodec_createDecoderByType(mime, s->use_ndk_codec);
802  if (!s->codec) {
803  av_log(avctx, AV_LOG_ERROR, "Failed to create media decoder for mime %s\n", mime);
804  return AVERROR_EXTERNAL;
805  }
806 
807  s->codec_name = ff_AMediaCodec_getName(s->codec);
808  if (!s->codec_name) {
809  s->codec_name = av_strdup(mime);
810  if (!s->codec_name)
811  return AVERROR(ENOMEM);
812  }
813 
814  return 0;
815 }
816 
818  const char *mime, FFAMediaFormat *format)
819 {
820  int ret;
821  int status;
822 
823  s->avctx = avctx;
824  atomic_init(&s->refcount, 1);
825  atomic_init(&s->hw_buffer_count, 0);
826  atomic_init(&s->serial, 1);
827  s->current_input_buffer = -1;
828 
829  if (avctx->codec_type == AVMEDIA_TYPE_AUDIO)
830  ret = mediacodec_dec_get_audio_codec(avctx, s, mime, format);
831  else if (avctx->codec_type == AVMEDIA_TYPE_VIDEO)
832  ret = mediacodec_dec_get_video_codec(avctx, s, mime, format);
833  else
834  av_assert0(0);
835  if (ret < 0)
836  goto fail;
837 
838  status = ff_AMediaCodec_configure(s->codec, format, s->surface, NULL, 0);
839  if (status < 0) {
841  av_log(avctx, AV_LOG_ERROR,
842  "Failed to configure codec %s (status = %d) with format %s\n",
843  s->codec_name, status, desc);
844  av_freep(&desc);
845 
847  goto fail;
848  }
849 
850  status = ff_AMediaCodec_start(s->codec);
851  if (status < 0) {
853  av_log(avctx, AV_LOG_ERROR,
854  "Failed to start codec %s (status = %d) with format %s\n",
855  s->codec_name, status, desc);
856  av_freep(&desc);
858  goto fail;
859  }
860 
861  if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
862  s->format = ff_AMediaCodec_getOutputFormat(s->codec);
863  if (s->format) {
864  if ((ret = mediacodec_dec_parse_format(avctx, s)) < 0) {
865  av_log(avctx, AV_LOG_ERROR,
866  "Failed to configure context\n");
867  goto fail;
868  }
869  }
870  }
871 
872  av_log(avctx, AV_LOG_DEBUG, "MediaCodec %p started successfully\n", s->codec);
873 
874  return 0;
875 
876 fail:
877  av_log(avctx, AV_LOG_ERROR, "MediaCodec %p failed to start\n", s->codec);
878  ff_mediacodec_dec_close(avctx, s);
879  return ret;
880 }
881 
883  AVPacket *pkt, bool wait)
884 {
885  int offset = 0;
886  int need_draining = 0;
887  uint8_t *data;
888  size_t size;
889  FFAMediaCodec *codec = s->codec;
890  int status;
891  int64_t input_dequeue_timeout_us = wait ? INPUT_DEQUEUE_TIMEOUT_US : 0;
892  int64_t pts;
893 
894  if (s->flushing) {
895  av_log(avctx, AV_LOG_ERROR, "Decoder is flushing and cannot accept new buffer "
896  "until all output buffers have been released\n");
897  return AVERROR_EXTERNAL;
898  }
899 
900  if (pkt->size == 0) {
901  need_draining = 1;
902  }
903 
904  if (s->draining && s->eos) {
905  return AVERROR_EOF;
906  }
907 
908  while (offset < pkt->size || (need_draining && !s->draining)) {
909  ssize_t index = s->current_input_buffer;
910  if (index < 0) {
911  index = ff_AMediaCodec_dequeueInputBuffer(codec, input_dequeue_timeout_us);
913  av_log(avctx, AV_LOG_TRACE, "No input buffer available, try again later\n");
914  break;
915  }
916 
917  if (index < 0) {
918  av_log(avctx, AV_LOG_ERROR, "Failed to dequeue input buffer (status=%zd)\n", index);
919  return AVERROR_EXTERNAL;
920  }
921  }
922  s->current_input_buffer = -1;
923 
925  if (!data) {
926  av_log(avctx, AV_LOG_ERROR, "Failed to get input buffer\n");
927  return AVERROR_EXTERNAL;
928  }
929 
930  pts = pkt->pts;
931  if (pts == AV_NOPTS_VALUE) {
932  av_log(avctx, AV_LOG_WARNING, "Input packet is missing PTS\n");
933  pts = 0;
934  }
935  if (pts && avctx->pkt_timebase.num && avctx->pkt_timebase.den) {
937  }
938 
939  if (need_draining) {
941 
942  av_log(avctx, AV_LOG_DEBUG, "Sending End Of Stream signal\n");
943 
945  if (status < 0) {
946  av_log(avctx, AV_LOG_ERROR, "Failed to queue input empty buffer (status = %d)\n", status);
947  return AVERROR_EXTERNAL;
948  }
949 
950  av_log(avctx, AV_LOG_TRACE,
951  "Queued empty EOS input buffer %zd with flags=%d\n", index, flags);
952 
953  s->draining = 1;
954  return 0;
955  }
956 
957  size = FFMIN(pkt->size - offset, size);
958  memcpy(data, pkt->data + offset, size);
959  offset += size;
960 
962  if (status < 0) {
963  av_log(avctx, AV_LOG_ERROR, "Failed to queue input buffer (status = %d)\n", status);
964  return AVERROR_EXTERNAL;
965  }
966 
967  av_log(avctx, AV_LOG_TRACE,
968  "Queued input buffer %zd size=%zd ts=%"PRIi64"\n", index, size, pts);
969  }
970 
971  if (offset == 0)
972  return AVERROR(EAGAIN);
973  return offset;
974 }
975 
977  AVFrame *frame, bool wait)
978 {
979  int ret;
980  uint8_t *data;
981  ssize_t index;
982  size_t size;
983  FFAMediaCodec *codec = s->codec;
985  int status;
986  int64_t output_dequeue_timeout_us = OUTPUT_DEQUEUE_TIMEOUT_US;
987 
988  if (s->draining && s->eos) {
989  return AVERROR_EOF;
990  }
991 
992  if (s->draining) {
993  /* If the codec is flushing or need to be flushed, block for a fair
994  * amount of time to ensure we got a frame */
995  output_dequeue_timeout_us = OUTPUT_DEQUEUE_BLOCK_TIMEOUT_US;
996  } else if (s->output_buffer_count == 0 || !wait) {
997  /* If the codec hasn't produced any frames, do not block so we
998  * can push data to it as fast as possible, and get the first
999  * frame */
1000  output_dequeue_timeout_us = 0;
1001  }
1002 
1003  index = ff_AMediaCodec_dequeueOutputBuffer(codec, &info, output_dequeue_timeout_us);
1004  if (index >= 0) {
1005  av_log(avctx, AV_LOG_TRACE, "Got output buffer %zd"
1006  " offset=%" PRIi32 " size=%" PRIi32 " ts=%" PRIi64
1007  " flags=%" PRIu32 "\n", index, info.offset, info.size,
1008  info.presentationTimeUs, info.flags);
1009 
1010  if (info.flags & ff_AMediaCodec_getBufferFlagEndOfStream(codec)) {
1011  s->eos = 1;
1012  }
1013 
1014  if (info.size) {
1015  if (s->surface) {
1016  if ((ret = mediacodec_wrap_hw_buffer(avctx, s, index, &info, frame)) < 0) {
1017  av_log(avctx, AV_LOG_ERROR, "Failed to wrap MediaCodec buffer\n");
1018  return ret;
1019  }
1020  } else {
1022  if (!data) {
1023  av_log(avctx, AV_LOG_ERROR, "Failed to get output buffer\n");
1024  return AVERROR_EXTERNAL;
1025  }
1026 
1027  if ((ret = mediacodec_wrap_sw_buffer(avctx, s, data, size, index, &info, frame)) < 0) {
1028  av_log(avctx, AV_LOG_ERROR, "Failed to wrap MediaCodec buffer\n");
1029  return ret;
1030  }
1031  }
1032 
1033  s->output_buffer_count++;
1034  return 0;
1035  } else {
1037  if (status < 0) {
1038  av_log(avctx, AV_LOG_ERROR, "Failed to release output buffer\n");
1039  }
1040  }
1041 
1042  } else if (ff_AMediaCodec_infoOutputFormatChanged(codec, index)) {
1043  char *format = NULL;
1044 
1045  if (s->format) {
1046  status = ff_AMediaFormat_delete(s->format);
1047  if (status < 0) {
1048  av_log(avctx, AV_LOG_ERROR, "Failed to delete MediaFormat %p\n", s->format);
1049  }
1050  }
1051 
1052  s->format = ff_AMediaCodec_getOutputFormat(codec);
1053  if (!s->format) {
1054  av_log(avctx, AV_LOG_ERROR, "Failed to get output format\n");
1055  return AVERROR_EXTERNAL;
1056  }
1057 
1058  format = ff_AMediaFormat_toString(s->format);
1059  if (!format) {
1060  return AVERROR_EXTERNAL;
1061  }
1062  av_log(avctx, AV_LOG_INFO, "Output MediaFormat changed to %s\n", format);
1063  av_freep(&format);
1064 
1065  if ((ret = mediacodec_dec_parse_format(avctx, s)) < 0) {
1066  return ret;
1067  }
1068 
1069  } else if (ff_AMediaCodec_infoOutputBuffersChanged(codec, index)) {
1071  } else if (ff_AMediaCodec_infoTryAgainLater(codec, index)) {
1072  if (s->draining) {
1073  av_log(avctx, AV_LOG_ERROR, "Failed to dequeue output buffer within %" PRIi64 "ms "
1074  "while draining remaining frames, output will probably lack frames\n",
1075  output_dequeue_timeout_us / 1000);
1076  } else {
1077  av_log(avctx, AV_LOG_TRACE, "No output buffer available, try again later\n");
1078  }
1079  } else {
1080  av_log(avctx, AV_LOG_ERROR, "Failed to dequeue output buffer (status=%zd)\n", index);
1081  return AVERROR_EXTERNAL;
1082  }
1083 
1084  if (s->draining && s->eos)
1085  return AVERROR_EOF;
1086  return AVERROR(EAGAIN);
1087 }
1088 
1089 /*
1090 * ff_mediacodec_dec_flush returns 0 if the flush cannot be performed on
1091 * the codec (because the user retains frames). The codec stays in the
1092 * flushing state.
1093 *
1094 * ff_mediacodec_dec_flush returns 1 if the flush can actually be
1095 * performed on the codec. The codec leaves the flushing state and can
1096 * process again packets.
1097 *
1098 * ff_mediacodec_dec_flush returns a negative value if an error has
1099 * occurred.
1100 */
1102 {
1103  if (!s->surface || !s->delay_flush || atomic_load(&s->refcount) == 1) {
1104  int ret;
1105 
1106  /* No frames (holding a reference to the codec) are retained by the
1107  * user, thus we can flush the codec and returns accordingly */
1108  if ((ret = mediacodec_dec_flush_codec(avctx, s)) < 0) {
1109  return ret;
1110  }
1111 
1112  return 1;
1113  }
1114 
1115  s->flushing = 1;
1116  return 0;
1117 }
1118 
1120 {
1121  if (!s)
1122  return 0;
1123 
1124  if (s->codec) {
1125  if (atomic_load(&s->hw_buffer_count) == 0) {
1126  ff_AMediaCodec_stop(s->codec);
1127  av_log(avctx, AV_LOG_DEBUG, "MediaCodec %p stopped\n", s->codec);
1128  } else {
1129  av_log(avctx, AV_LOG_DEBUG, "Not stopping MediaCodec (there are buffers pending)\n");
1130  }
1131  }
1132 
1134 
1135  return 0;
1136 }
1137 
1139 {
1140  return s->flushing;
1141 }
ff_AMediaCodec_getInputBuffer
static uint8_t * ff_AMediaCodec_getInputBuffer(FFAMediaCodec *codec, size_t idx, size_t *out_size)
Definition: mediacodec_wrapper.h:261
AVHWDeviceContext::hwctx
void * hwctx
The format-specific data, allocated and freed by libavutil along with this context.
Definition: hwcontext.h:85
ENCODING_PCM_8BIT
@ ENCODING_PCM_8BIT
Definition: mediacodecdec_common.c:92
AVCodecContext::hwaccel_context
void * hwaccel_context
Legacy hardware accelerator context.
Definition: avcodec.h:1455
ff_AMediaCodecList_getCodecNameByType
char * ff_AMediaCodecList_getCodecNameByType(const char *mime, int profile, int encoder, void *log_ctx)
Definition: mediacodec_wrapper.c:470
ENCODING_PCM_32BIT
@ ENCODING_PCM_32BIT
Definition: mediacodecdec_common.c:95
ff_AMediaFormat_delete
static int ff_AMediaFormat_delete(FFAMediaFormat *format)
Definition: mediacodec_wrapper.h:92
MediaCodecDecContext
Definition: mediacodecdec_common.h:37
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
ff_AMediaCodec_delete
static int ff_AMediaCodec_delete(FFAMediaCodec *codec)
Definition: mediacodec_wrapper.h:256
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
CHANNEL_OUT_LOW_FREQUENCY
@ CHANNEL_OUT_LOW_FREQUENCY
Definition: mediacodecdec_common.c:135
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
mediacodec_dec_get_audio_codec
static int mediacodec_dec_get_audio_codec(AVCodecContext *avctx, MediaCodecDecContext *s, const char *mime, FFAMediaFormat *format)
Definition: mediacodecdec_common.c:798
mcdec_map_channel_mask
static uint64_t mcdec_map_channel_mask(AVCodecContext *avctx, int channel_mask)
Definition: mediacodecdec_common.c:178
AVCodecContext::colorspace
enum AVColorSpace colorspace
YUV colorspace type.
Definition: avcodec.h:685
ff_get_format
int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
Select the (possibly hardware accelerated) pixel format.
Definition: decode.c:1265
AV_CH_TOP_FRONT_CENTER
#define AV_CH_TOP_FRONT_CENTER
Definition: channel_layout.h:185
ff_AMediaCodec_start
static int ff_AMediaCodec_start(FFAMediaCodec *codec)
Definition: mediacodec_wrapper.h:241
AVCodecContext::sample_rate
int sample_rate
samples per second
Definition: avcodec.h:1050
mediacodec_surface.h
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:57
AVBufferRef::data
uint8_t * data
The data buffer.
Definition: buffer.h:90
channel_masks
static const struct @171 channel_masks[]
ff_AMediaFormatColorStandard_to_AVColorSpace
enum AVColorSpace ff_AMediaFormatColorStandard_to_AVColorSpace(int color_standard)
Map MediaFormat color standard to AVColorSpace.
Definition: mediacodec_wrapper.c:2517
av_div_q
AVRational av_div_q(AVRational b, AVRational c)
Divide one rational by another.
Definition: rational.c:88
AV_TIME_BASE_Q
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition: avutil.h:264
int64_t
long long int64_t
Definition: coverity.c:34
mediacodec_wrap_sw_video_buffer
static int mediacodec_wrap_sw_video_buffer(AVCodecContext *avctx, MediaCodecDecContext *s, uint8_t *data, size_t size, ssize_t index, FFAMediaCodecBufferInfo *info, AVFrame *frame)
Definition: mediacodecdec_common.c:437
AVMediaCodecDeviceContext::surface
void * surface
android/view/Surface handle, to be filled by the user.
Definition: hwcontext_mediacodec.h:33
OUTPUT_DEQUEUE_BLOCK_TIMEOUT_US
#define OUTPUT_DEQUEUE_BLOCK_TIMEOUT_US
Definition: mediacodecdec_common.c:88
mask
int mask
Definition: mediacodecdec_common.c:154
ff_mediacodec_dec_close
int ff_mediacodec_dec_close(AVCodecContext *avctx, MediaCodecDecContext *s)
Definition: mediacodecdec_common.c:1119
AV_CH_TOP_FRONT_RIGHT
#define AV_CH_TOP_FRONT_RIGHT
Definition: channel_layout.h:186
CHANNEL_OUT_FRONT_LEFT_OF_CENTER
@ CHANNEL_OUT_FRONT_LEFT_OF_CENTER
Definition: mediacodecdec_common.c:138
ff_AMediaFormat_getRect
static int ff_AMediaFormat_getRect(FFAMediaFormat *format, const char *name, int32_t *left, int32_t *top, int32_t *right, int32_t *bottom)
Definition: mediacodec_wrapper.h:127
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:374
AVFrame::pts
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
Definition: frame.h:486
AVCodecContext::color_trc
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
Definition: avcodec.h:678
ff_mediacodec_dec_receive
int ff_mediacodec_dec_receive(AVCodecContext *avctx, MediaCodecDecContext *s, AVFrame *frame, bool wait)
Definition: mediacodecdec_common.c:976
AVPacket::data
uint8_t * data
Definition: packet.h:533
ff_AMediaCodec_infoOutputFormatChanged
static int ff_AMediaCodec_infoOutputFormatChanged(FFAMediaCodec *codec, ssize_t idx)
Definition: mediacodec_wrapper.h:311
OUTPUT_DEQUEUE_TIMEOUT_US
#define OUTPUT_DEQUEUE_TIMEOUT_US
Definition: mediacodecdec_common.c:87
ff_AMediaCodec_infoOutputBuffersChanged
static int ff_AMediaCodec_infoOutputBuffersChanged(FFAMediaCodec *codec, ssize_t idx)
Definition: mediacodec_wrapper.h:306
data
const char data[16]
Definition: mxf.c:148
AV_HWDEVICE_TYPE_MEDIACODEC
@ AV_HWDEVICE_TYPE_MEDIACODEC
Definition: hwcontext.h:38
ff_AMediaCodec_queueInputBuffer
static int ff_AMediaCodec_queueInputBuffer(FFAMediaCodec *codec, size_t idx, off_t offset, size_t size, uint64_t time, uint32_t flags)
Definition: mediacodec_wrapper.h:276
COLOR_QCOM_FormatYUV420SemiPlanar
@ COLOR_QCOM_FormatYUV420SemiPlanar
Definition: mediacodecdec_common.c:196
ff_mediacodec_dec_is_flushing
int ff_mediacodec_dec_is_flushing(AVCodecContext *avctx, MediaCodecDecContext *s)
Definition: mediacodecdec_common.c:1138
AV_CH_TOP_FRONT_LEFT
#define AV_CH_TOP_FRONT_LEFT
Definition: channel_layout.h:184
CHANNEL_OUT_TOP_BACK_RIGHT
@ CHANNEL_OUT_TOP_BACK_RIGHT
Definition: mediacodecdec_common.c:149
AVChannelLayout::nb_channels
int nb_channels
Number of channels in this layout.
Definition: channel_layout.h:321
ff_set_dimensions
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Check that the provided frame dimensions are valid and set them on the codec context.
Definition: utils.c:94
hwcontext_mediacodec.h
AV_CH_TOP_BACK_LEFT
#define AV_CH_TOP_BACK_LEFT
Definition: channel_layout.h:187
ff_AMediaCodec_configure
static int ff_AMediaCodec_configure(FFAMediaCodec *codec, const FFAMediaFormat *format, FFANativeWindow *surface, void *crypto, uint32_t flags)
Definition: mediacodec_wrapper.h:233
mediacodec_wrap_sw_audio_buffer
static int mediacodec_wrap_sw_audio_buffer(AVCodecContext *avctx, MediaCodecDecContext *s, uint8_t *data, size_t size, ssize_t index, FFAMediaCodecBufferInfo *info, AVFrame *frame)
Definition: mediacodecdec_common.c:371
ff_mediacodec_sw_buffer_copy_yuv420_packed_semi_planar_64x32Tile2m8ka
void ff_mediacodec_sw_buffer_copy_yuv420_packed_semi_planar_64x32Tile2m8ka(AVCodecContext *avctx, MediaCodecDecContext *s, uint8_t *data, size_t size, FFAMediaCodecBufferInfo *info, AVFrame *frame)
Definition: mediacodec_sw_buffer.c:272
AV_CH_TOP_BACK_CENTER
#define AV_CH_TOP_BACK_CENTER
Definition: channel_layout.h:188
CHANNEL_OUT_SIDE_LEFT
@ CHANNEL_OUT_SIDE_LEFT
Definition: mediacodecdec_common.c:141
AVCodecContext::ch_layout
AVChannelLayout ch_layout
Audio channel layout.
Definition: avcodec.h:1065
fail
#define fail()
Definition: checkasm.h:188
AV_CH_BACK_LEFT
#define AV_CH_BACK_LEFT
Definition: channel_layout.h:176
CHANNEL_OUT_TOP_FRONT_CENTER
@ CHANNEL_OUT_TOP_FRONT_CENTER
Definition: mediacodecdec_common.c:145
ff_mediacodec_dec_flush
int ff_mediacodec_dec_flush(AVCodecContext *avctx, MediaCodecDecContext *s)
Definition: mediacodecdec_common.c:1101
pts
static int64_t pts
Definition: transcode_aac.c:644
atomic_fetch_sub
#define atomic_fetch_sub(object, operand)
Definition: stdatomic.h:137
AVRational::num
int num
Numerator.
Definition: rational.h:59
COLOR_QCOM_FormatYUV420PackedSemiPlanar64x32Tile2m8ka
@ COLOR_QCOM_FormatYUV420PackedSemiPlanar64x32Tile2m8ka
Definition: mediacodecdec_common.c:198
mediacodecdec_common.h
INPUT_DEQUEUE_TIMEOUT_US
#define INPUT_DEQUEUE_TIMEOUT_US
OMX.k3.video.decoder.avc, OMX.NVIDIA.
Definition: mediacodecdec_common.c:86
AVHWDeviceContext
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
Definition: hwcontext.h:60
avassert.h
ENCODING_PCM_24BIT_PACKED
@ ENCODING_PCM_24BIT_PACKED
Definition: mediacodecdec_common.c:94
AVCodecContext::color_primaries
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
Definition: avcodec.h:671
AV_LOG_TRACE
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
Definition: log.h:206
pkt
AVPacket * pkt
Definition: movenc.c:60
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
AV_CH_LOW_FREQUENCY
#define AV_CH_LOW_FREQUENCY
Definition: channel_layout.h:175
mcdec_map_color_format
static enum AVPixelFormat mcdec_map_color_format(AVCodecContext *avctx, MediaCodecDecContext *s, int color_format)
Definition: mediacodecdec_common.c:220
ff_AMediaCodec_getName
static char * ff_AMediaCodec_getName(FFAMediaCodec *codec)
Definition: mediacodec_wrapper.h:224
ff_AMediaCodec_getBufferFlagEndOfStream
static int ff_AMediaCodec_getBufferFlagEndOfStream(FFAMediaCodec *codec)
Definition: mediacodec_wrapper.h:321
width
#define width
s
#define s(width, name)
Definition: cbs_vp9.c:198
AV_BUFFER_FLAG_READONLY
#define AV_BUFFER_FLAG_READONLY
Always treat the buffer as read-only, even when it has only one reference.
Definition: buffer.h:114
format
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 format(the sample packing is implied by the sample format) and sample rate. The lists are not just lists
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
av_channel_layout_from_mask
int av_channel_layout_from_mask(AVChannelLayout *channel_layout, uint64_t mask)
Initialize a native channel layout from a bitmask indicating which channels are present.
Definition: channel_layout.c:247
info
MIPS optimizations info
Definition: mips.txt:2
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:40
pix_fmts
static enum AVPixelFormat pix_fmts[]
Definition: libkvazaar.c:304
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:201
CHANNEL_OUT_BACK_RIGHT
@ CHANNEL_OUT_BACK_RIGHT
Definition: mediacodecdec_common.c:137
ctx
AVFormatContext * ctx
Definition: movenc.c:49
CHANNEL_OUT_TOP_FRONT_RIGHT
@ CHANNEL_OUT_TOP_FRONT_RIGHT
Definition: mediacodecdec_common.c:146
decode.h
av_rescale_q
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
Definition: mathematics.c:142
COLOR_QCOM_FormatYUV420SemiPlanar32m
@ COLOR_QCOM_FormatYUV420SemiPlanar32m
Definition: mediacodecdec_common.c:197
AV_PIX_FMT_YUV420P
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:73
ff_mediacodec_sw_buffer_copy_yuv420_packed_semi_planar
void ff_mediacodec_sw_buffer_copy_yuv420_packed_semi_planar(AVCodecContext *avctx, MediaCodecDecContext *s, uint8_t *data, size_t size, FFAMediaCodecBufferInfo *info, AVFrame *frame)
Definition: mediacodec_sw_buffer.c:181
color_range
color_range
Definition: vf_selectivecolor.c:43
atomic_load
#define atomic_load(object)
Definition: stdatomic.h:93
AV_PIX_FMT_MEDIACODEC
@ AV_PIX_FMT_MEDIACODEC
hardware decoding through MediaCodec
Definition: pixfmt.h:316
ff_AMediaCodec_getOutputFormat
static FFAMediaFormat * ff_AMediaCodec_getOutputFormat(FFAMediaCodec *codec)
Definition: mediacodec_wrapper.h:286
COLOR_FormatYUV420Planar
@ COLOR_FormatYUV420Planar
Definition: mediacodecdec_common.c:192
ff_AMediaCodec_createCodecByName
FFAMediaCodec * ff_AMediaCodec_createCodecByName(const char *name, int ndk)
Definition: mediacodec_wrapper.c:2408
AV_CH_TOP_CENTER
#define AV_CH_TOP_CENTER
Definition: channel_layout.h:183
NULL
#define NULL
Definition: coverity.c:32
ff_AMediaCodec_flush
static int ff_AMediaCodec_flush(FFAMediaCodec *codec)
Definition: mediacodec_wrapper.h:251
FFAMediaCodecBufferInfo
Definition: mediacodec_wrapper.h:172
AVCodecContext::color_range
enum AVColorRange color_range
MPEG vs JPEG YUV range.
Definition: avcodec.h:695
mcdec_map_pcm_format
static enum AVSampleFormat mcdec_map_pcm_format(AVCodecContext *avctx, MediaCodecDecContext *s, int pcm_format)
Definition: mediacodecdec_common.c:112
AVMediaCodecContext
This structure holds a reference to a android/view/Surface object that will be used as output by the ...
Definition: mediacodec.h:33
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
layout
uint64_t layout
Definition: mediacodecdec_common.c:155
CHANNEL_OUT_FRONT_RIGHT
@ CHANNEL_OUT_FRONT_RIGHT
Definition: mediacodecdec_common.c:133
ff_set_sar
int ff_set_sar(AVCodecContext *avctx, AVRational sar)
Check that the provided sample aspect ratio is valid and set it on the codec context.
Definition: utils.c:109
ff_AMediaCodec_stop
static int ff_AMediaCodec_stop(FFAMediaCodec *codec)
Definition: mediacodec_wrapper.h:246
mediacodec_sw_buffer.h
ff_mediacodec_surface_unref
int ff_mediacodec_surface_unref(FFANativeWindow *window, void *log_ctx)
Definition: mediacodec_surface.c:59
time.h
ff_mediacodec_dec_ref
static void ff_mediacodec_dec_ref(MediaCodecDecContext *s)
Definition: mediacodecdec_common.c:247
color_formats
static const struct @173 color_formats[]
AV_CH_FRONT_CENTER
#define AV_CH_FRONT_CENTER
Definition: channel_layout.h:174
AV_CH_FRONT_LEFT_OF_CENTER
#define AV_CH_FRONT_LEFT_OF_CENTER
Definition: channel_layout.h:178
CHANNEL_OUT_SIDE_RIGHT
@ CHANNEL_OUT_SIDE_RIGHT
Definition: mediacodecdec_common.c:142
index
int index
Definition: gxfenc.c:90
CHANNEL_OUT_FRONT_CENTER
@ CHANNEL_OUT_FRONT_CENTER
Definition: mediacodecdec_common.c:134
AVMediaCodecDeviceContext
MediaCodec details.
Definition: hwcontext_mediacodec.h:27
av_buffer_create
AVBufferRef * av_buffer_create(uint8_t *data, size_t size, void(*free)(void *opaque, uint8_t *data), void *opaque, int flags)
Create an AVBuffer from an existing array.
Definition: buffer.c:55
ff_AMediaFormat_toString
static char * ff_AMediaFormat_toString(FFAMediaFormat *format)
Definition: mediacodec_wrapper.h:97
CHANNEL_OUT_BACK_LEFT
@ CHANNEL_OUT_BACK_LEFT
Definition: mediacodecdec_common.c:136
CHANNEL_OUT_TOP_CENTER
@ CHANNEL_OUT_TOP_CENTER
Definition: mediacodecdec_common.c:143
AMEDIAFORMAT_GET_INT32
#define AMEDIAFORMAT_GET_INT32(name, key, mandatory)
Definition: mediacodecdec_common.c:531
ff_mediacodec_sw_buffer_copy_yuv420_semi_planar
void ff_mediacodec_sw_buffer_copy_yuv420_semi_planar(AVCodecContext *avctx, MediaCodecDecContext *s, uint8_t *data, size_t size, FFAMediaCodecBufferInfo *info, AVFrame *frame)
Definition: mediacodec_sw_buffer.c:131
mediacodec_dec_parse_format
static int mediacodec_dec_parse_format(AVCodecContext *avctx, MediaCodecDecContext *s)
Definition: mediacodecdec_common.c:698
ff_mediacodec_sw_buffer_copy_yuv420_planar
void ff_mediacodec_sw_buffer_copy_yuv420_planar(AVCodecContext *avctx, MediaCodecDecContext *s, uint8_t *data, size_t size, FFAMediaCodecBufferInfo *info, AVFrame *frame)
The code handling the various YUV color formats is taken from the GStreamer project.
Definition: mediacodec_sw_buffer.c:76
sample_formats
static const struct @169 sample_formats[]
ff_get_buffer
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition: decode.c:1599
ff_AMediaFormatColorStandard_to_AVColorPrimaries
enum AVColorPrimaries ff_AMediaFormatColorStandard_to_AVColorPrimaries(int color_standard)
Map MediaFormat color standard to AVColorPrimaries.
Definition: mediacodec_wrapper.c:2535
AVPacket::size
int size
Definition: packet.h:534
CHANNEL_OUT_TOP_BACK_CENTER
@ CHANNEL_OUT_TOP_BACK_CENTER
Definition: mediacodecdec_common.c:148
AVCodecContext::sample_fmt
enum AVSampleFormat sample_fmt
audio sample format
Definition: avcodec.h:1057
AVCodecContext::pkt_timebase
AVRational pkt_timebase
Timebase in which pkt_dts/pts and AVPacket.dts/pts are expressed.
Definition: avcodec.h:551
AV_SAMPLE_FMT_NONE
@ AV_SAMPLE_FMT_NONE
Definition: samplefmt.h:56
mediacodec_dec_get_video_codec
static int mediacodec_dec_get_video_codec(AVCodecContext *avctx, MediaCodecDecContext *s, const char *mime, FFAMediaFormat *format)
Definition: mediacodecdec_common.c:731
size
int size
Definition: twinvq_data.h:10344
COLOR_TI_FormatYUV420PackedSemiPlanarInterlaced
@ COLOR_TI_FormatYUV420PackedSemiPlanarInterlaced
Definition: mediacodecdec_common.c:200
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:248
COLOR_FormatYUV420SemiPlanar
@ COLOR_FormatYUV420SemiPlanar
Definition: mediacodecdec_common.c:193
pix_fmt
enum AVPixelFormat pix_fmt
Definition: mediacodecdec_common.c:206
height
#define height
AVERROR_EXTERNAL
#define AVERROR_EXTERNAL
Generic error in an external library.
Definition: error.h:59
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
ff_AMediaCodecProfile_getProfileFromAVCodecContext
int ff_AMediaCodecProfile_getProfileFromAVCodecContext(AVCodecContext *avctx)
The following API around MediaCodec and MediaFormat is based on the NDK one provided by Google since ...
Definition: mediacodec_wrapper.c:309
AV_CH_TOP_BACK_RIGHT
#define AV_CH_TOP_BACK_RIGHT
Definition: channel_layout.h:189
AV_CH_FRONT_RIGHT_OF_CENTER
#define AV_CH_FRONT_RIGHT_OF_CENTER
Definition: channel_layout.h:179
ff_AMediaCodec_createDecoderByType
FFAMediaCodec * ff_AMediaCodec_createDecoderByType(const char *mime_type, int ndk)
Definition: mediacodec_wrapper.c:2415
mediacodec_dec_flush_codec
static int mediacodec_dec_flush_codec(AVCodecContext *avctx, MediaCodecDecContext *s)
Definition: mediacodecdec_common.c:708
mediacodec_buffer_release
static void mediacodec_buffer_release(void *opaque, uint8_t *data)
Definition: mediacodecdec_common.c:278
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:191
av_channel_layout_default
void av_channel_layout_default(AVChannelLayout *ch_layout, int nb_channels)
Get the default channel layout for a given number of channels.
Definition: channel_layout.c:834
mediacodec_wrap_sw_buffer
static int mediacodec_wrap_sw_buffer(AVCodecContext *avctx, MediaCodecDecContext *s, uint8_t *data, size_t size, ssize_t index, FFAMediaCodecBufferInfo *info, AVFrame *frame)
Definition: mediacodecdec_common.c:515
ff_mediacodec_dec_unref
static void ff_mediacodec_dec_unref(MediaCodecDecContext *s)
Definition: mediacodecdec_common.c:252
ff_AMediaFormatColorTransfer_to_AVColorTransfer
enum AVColorTransferCharacteristic ff_AMediaFormatColorTransfer_to_AVColorTransfer(int color_transfer)
Map MediaFormat color transfer to AVColorTransferCharacteristic.
Definition: mediacodec_wrapper.c:2545
log.h
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
mediacodec_wrapper.h
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:526
av_get_bytes_per_sample
int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt)
Return number of bytes per sample.
Definition: samplefmt.c:108
FFAMediaCodec
Definition: mediacodec_wrapper.h:181
ENCODING_PCM_16BIT
@ ENCODING_PCM_16BIT
Definition: mediacodecdec_common.c:91
CHANNEL_OUT_TOP_BACK_LEFT
@ CHANNEL_OUT_TOP_BACK_LEFT
Definition: mediacodecdec_common.c:147
AV_SAMPLE_FMT_U8
@ AV_SAMPLE_FMT_U8
unsigned 8 bits
Definition: samplefmt.h:57
common.h
AVSampleFormat
AVSampleFormat
Audio sample formats.
Definition: samplefmt.h:55
mediacodec_dec_parse_audio_format
static int mediacodec_dec_parse_audio_format(AVCodecContext *avctx, MediaCodecDecContext *s)
Definition: mediacodecdec_common.c:651
AV_CH_BACK_CENTER
#define AV_CH_BACK_CENTER
Definition: channel_layout.h:180
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
AV_CH_FRONT_LEFT
#define AV_CH_FRONT_LEFT
Definition: channel_layout.h:172
CHANNEL_OUT_BACK_CENTER
@ CHANNEL_OUT_BACK_CENTER
Definition: mediacodecdec_common.c:140
AV_SAMPLE_FMT_S16
@ AV_SAMPLE_FMT_S16
signed 16 bits
Definition: samplefmt.h:58
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:256
AVCodecContext::hw_device_ctx
AVBufferRef * hw_device_ctx
A reference to the AVHWDeviceContext describing the device which will be used by a hardware encoder/d...
Definition: avcodec.h:1501
AVMediaCodecContext::surface
void * surface
android/view/Surface object reference.
Definition: mediacodec.h:38
ff_mediacodec_surface_ref
FFANativeWindow * ff_mediacodec_surface_ref(void *surface, void *native_window, void *log_ctx)
Definition: mediacodec_surface.c:30
AV_CH_SIDE_RIGHT
#define AV_CH_SIDE_RIGHT
Definition: channel_layout.h:182
profile
int profile
Definition: mxfenc.c:2228
AVCodecContext::height
int height
Definition: avcodec.h:618
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:657
AVMediaCodecDeviceContext::native_window
void * native_window
Pointer to ANativeWindow.
Definition: hwcontext_mediacodec.h:45
ff_AMediaCodec_dequeueInputBuffer
static ssize_t ff_AMediaCodec_dequeueInputBuffer(FFAMediaCodec *codec, int64_t timeoutUs)
Definition: mediacodec_wrapper.h:271
avcodec.h
ff_AMediaFormatColorRange_to_AVColorRange
enum AVColorRange ff_AMediaFormatColorRange_to_AVColorRange(int color_range)
Map MediaFormat color range to AVColorRange.
Definition: mediacodec_wrapper.c:2500
ret
ret
Definition: filter_design.txt:187
AVHWDeviceContext::type
enum AVHWDeviceType type
This field identifies the underlying API used for hardware access.
Definition: hwcontext.h:72
pixfmt.h
AV_PIX_FMT_NV12
@ AV_PIX_FMT_NV12
planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
Definition: pixfmt.h:96
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
CHANNEL_OUT_FRONT_LEFT
@ CHANNEL_OUT_FRONT_LEFT
Definition: mediacodecdec_common.c:132
COLOR_TI_FormatYUV420PackedSemiPlanar
@ COLOR_TI_FormatYUV420PackedSemiPlanar
Definition: mediacodecdec_common.c:199
AVCodecContext
main external API structure.
Definition: avcodec.h:445
status
ov_status_e status
Definition: dnn_backend_openvino.c:100
channel_layout.h
buffer
the frame and frame reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFrame structures Several references can point to the same frame buffer
Definition: filter_design.txt:49
AVRational::den
int den
Denominator.
Definition: rational.h:60
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
atomic_fetch_add
#define atomic_fetch_add(object, operand)
Definition: stdatomic.h:131
pcm_format
int pcm_format
Definition: mediacodecdec_common.c:100
color_format
int color_format
Definition: mediacodecdec_common.c:205
COLOR_FormatAndroidOpaque
@ COLOR_FormatAndroidOpaque
Definition: mediacodecdec_common.c:195
AV_CH_FRONT_RIGHT
#define AV_CH_FRONT_RIGHT
Definition: channel_layout.h:173
av_channel_layout_copy
int av_channel_layout_copy(AVChannelLayout *dst, const AVChannelLayout *src)
Make a copy of a channel layout.
Definition: channel_layout.c:444
AVCodecContext::codec_type
enum AVMediaType codec_type
Definition: avcodec.h:453
av_strdup
char * av_strdup(const char *s)
Duplicate a string.
Definition: mem.c:272
desc
const char * desc
Definition: libsvtav1.c:79
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
mem.h
ff_AMediaCodec_getOutputBuffer
static uint8_t * ff_AMediaCodec_getOutputBuffer(FFAMediaCodec *codec, size_t idx, size_t *out_size)
Definition: mediacodec_wrapper.h:266
sample_format
enum AVSampleFormat sample_format
Definition: mediacodecdec_common.c:101
mediacodec_wrap_hw_buffer
static int mediacodec_wrap_hw_buffer(AVCodecContext *avctx, MediaCodecDecContext *s, ssize_t index, FFAMediaCodecBufferInfo *info, AVFrame *frame)
Definition: mediacodecdec_common.c:296
COLOR_FormatYCbYCr
@ COLOR_FormatYCbYCr
Definition: mediacodecdec_common.c:194
CHANNEL_OUT_TOP_FRONT_LEFT
@ CHANNEL_OUT_TOP_FRONT_LEFT
Definition: mediacodecdec_common.c:144
ff_AMediaCodec_cleanOutputBuffers
static int ff_AMediaCodec_cleanOutputBuffers(FFAMediaCodec *codec)
Definition: mediacodec_wrapper.h:336
FFALIGN
#define FFALIGN(x, a)
Definition: macros.h:78
AVPacket
This structure stores compressed data.
Definition: packet.h:510
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
ff_AMediaCodec_infoTryAgainLater
static int ff_AMediaCodec_infoTryAgainLater(FFAMediaCodec *codec, ssize_t idx)
Definition: mediacodec_wrapper.h:301
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:618
ff_mediacodec_dec_send
int ff_mediacodec_dec_send(AVCodecContext *avctx, MediaCodecDecContext *s, AVPacket *pkt, bool wait)
Definition: mediacodecdec_common.c:882
timestamp.h
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:482
ff_AMediaCodec_releaseOutputBuffer
static int ff_AMediaCodec_releaseOutputBuffer(FFAMediaCodec *codec, size_t idx, int render)
Definition: mediacodec_wrapper.h:291
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AV_CH_BACK_RIGHT
#define AV_CH_BACK_RIGHT
Definition: channel_layout.h:177
atomic_init
#define atomic_init(obj, value)
Definition: stdatomic.h:33
ENCODING_PCM_FLOAT
@ ENCODING_PCM_FLOAT
Definition: mediacodecdec_common.c:93
FFAMediaFormat
Definition: mediacodec_wrapper.h:63
mediacodec_dec_parse_video_format
static int mediacodec_dec_parse_video_format(AVCodecContext *avctx, MediaCodecDecContext *s)
Definition: mediacodecdec_common.c:542
AV_SAMPLE_FMT_S32
@ AV_SAMPLE_FMT_S32
signed 32 bits
Definition: samplefmt.h:59
ff_AMediaCodec_dequeueOutputBuffer
static ssize_t ff_AMediaCodec_dequeueOutputBuffer(FFAMediaCodec *codec, FFAMediaCodecBufferInfo *info, int64_t timeoutUs)
Definition: mediacodec_wrapper.h:281
AV_SAMPLE_FMT_FLT
@ AV_SAMPLE_FMT_FLT
float
Definition: samplefmt.h:60
AVCodecContext::sample_aspect_ratio
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel.
Definition: avcodec.h:642
CHANNEL_OUT_FRONT_RIGHT_OF_CENTER
@ CHANNEL_OUT_FRONT_RIGHT_OF_CENTER
Definition: mediacodecdec_common.c:139
AV_CH_SIDE_LEFT
#define AV_CH_SIDE_LEFT
Definition: channel_layout.h:181
mediacodec.h
ff_mediacodec_dec_init
int ff_mediacodec_dec_init(AVCodecContext *avctx, MediaCodecDecContext *s, const char *mime, FFAMediaFormat *format)
Definition: mediacodecdec_common.c:817