From a6ec2aa1ffa32b7a670c64e81dd29af20a23036c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20=C5=9Aled=C5=BA?= Date: Thu, 8 Aug 2024 10:19:13 +0200 Subject: [PATCH] Handle decoder only frames --- c_src/xav/xav_decoder.c | 6 ++++++ lib/decoder.ex | 9 ++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/c_src/xav/xav_decoder.c b/c_src/xav/xav_decoder.c index 8332a72..101069f 100644 --- a/c_src/xav/xav_decoder.c +++ b/c_src/xav/xav_decoder.c @@ -102,8 +102,14 @@ ERL_NIF_TERM decode(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) { decoder_decode(xav_decoder->decoder, xav_decoder->decoder->pkt, xav_decoder->decoder->frame); if (ret == -2) { return xav_nif_error(env, "no_keyframe"); + } else if (ret == AVERROR(EAGAIN)) { + // Some frames are meant for decoder only + // and they don't include actual video samples. + decoder_free_frame(xav_decoder->decoder); + return enif_make_atom(env, "ok"); } else if (ret != 0) { return xav_nif_raise(env, "failed_to_decode"); + AVERROR(EAGAIN); } // convert diff --git a/lib/decoder.ex b/lib/decoder.ex index e6be460..7693ef6 100644 --- a/lib/decoder.ex +++ b/lib/decoder.ex @@ -63,14 +63,21 @@ defmodule Xav.Decoder do @doc """ Decodes an audio/video frame. + + Some frames are meant for decoder only and might not + contain actual video samples. + In such cases, `:ok` term is returned. """ @spec decode(t(), binary(), pts: integer(), dts: integer()) :: - {:ok, Xav.Frame.t()} | {:error, atom()} + :ok | {:ok, Xav.Frame.t()} | {:error, atom()} def decode(decoder, data, opts \\ []) do pts = opts[:pts] || 0 dts = opts[:dts] || 0 case Xav.Decoder.NIF.decode(decoder, data, pts, dts) do + :ok -> + :ok + {:ok, {data, format, width, height, pts}} -> {:ok, Xav.Frame.new(data, format, width, height, pts)}