Если вы прочитали документацию avcodec_send_packet()
, там написано:
Возвращает
0 в случае успеха,в противном случае отрицательный код ошибки: AVERROR(EAGAIN)
: ввод не принят в текущем состоянии - пользователь должен прочитать вывод с помощью avcodec_receive_frame()
(как только все выходные данные прочитаны, пакет должен быть повторно отправлен, и вызов не будет завершен с EAGAIN
),AVERROR_EOF
: декодер сброшен, и на него нельзя отправлять новые пакеты (также возвращается, если отправлено более 1 пакета очистки) AVERROR(EINVAL)
: кодек не открыт, это кодер или требуется сброс AVERROR(ENOMEM)
: не удалось добавить пакет во внутреннюю очередь или подобные другие ошибки: допустимые ошибки декодирования
Обратите внимание, что avcodec_send_packet()
возвращает коды ошибок на основе макроса AVERROR()
, который определен в libavutil/error.h
как:
/* error handling */
#if EDOM > 0
#define AVERROR(e) (-(e)) ///< Returns a negative error code from a POSIX error code, to return from library functions.
#define AVUNERROR(e) (-(e)) ///< Returns a POSIX error code from a library function error return value.
#else
/* Some platforms have E* and errno already negated. */
#define AVERROR(e) (e)
#define AVUNERROR(e) (e)
#endif
Как видно из документации, стандартные коды ошибок POSIX передаются в AVERROR()
.
Теперь, если вы пойдете, посмотрите на коды ошибок POSIX, определенные вВ заголовке errno.h
вашего компилятора вы обнаружите, что [-]12
определен как ENOMEM
, что является одним из возможных значений, упомянутых в документации avcodec_send_packet()
:
AVERROR(ENOMEM)
:не удалось добавить пакет во внутреннюю очередь или аналогичные другие ошибки: допустимые ошибки декодирования
Что, согласно этой версии error.h
(в отличие от этой версии) говорит:
#if LIBAVUTIL_VERSION_MAJOR < 51
#define AVERROR_INVALIDDATA AVERROR(EINVAL)
...
#define AVERROR_NOMEM AVERROR(ENOMEM)
...
#endif
чтНа скриншотах, которые вы показали, проверяется возвращаемое значение avcodec_send_packet()
для AVERROR_INVALIDDATA
вместо AVERROR_NOMEM
.