Это невозможно без использования крайне плохих методов программирования, таких как глобальные переменные.Кодирование кадров не является независимым;кодировщик должен сохранять состояние (контекст), для которого вы должны сохранять указатель для передачи в функцию кодировщика каждый раз.Идея передачи выбора формата в EncodeFrame также довольно глупа, поскольку вы не можете выбрать формат для кадра, не закрывая существующий контекст кодера и не переключаясь на новый.
Если исходное изображение уже не являетсяв формате, который хочет кодировщик (вероятно, YUV 4: 2: 0), ваша оболочка должна будет преобразовать его.Это можно сделать самостоятельно или с помощью libswscale из ffmpeg.Вы также должны указать временную метку для каждого кадра.Если вам нужен простой API, в котором вам не нужно беспокоиться об этом, вы, вероятно, захотите обернуть указатель контекста av-кодека, который libavcodec предоставляет вам в другой структуре, где вы сохраняете значение рабочей метки времени, указатель контекста swscale и т. Д.*
Кроме того, ваш API не может указать размер буфера назначения, поэтому он совершенно небезопасен.Может быть лучше вернуть указатель на внутренний буфер (через возвращаемое значение или аргумент указатель-на-указатель) вместе с размером закодированного кадра, вместо записи в буфер вызывающего.