32 #include <libcjson/cJSON.h> 33 #include <libavcodec/avcodec.h> 34 #include <libmediaprocsutils/log.h> 35 #include <libmediaprocsutils/stat_codes.h> 36 #include <libmediaprocsutils/check_utils.h> 37 #include <libmediaprocsutils/fifo.h> 38 #include <libmediaprocs/proc_if.h> 39 #include <libmediaprocs/proc.h> 109 const char *settings_str,
log_ctx_t *log_ctx, va_list arg);
127 const char *settings_str,
log_ctx_t *log_ctx, va_list arg);
147 "ffmpeg_mlhe_enc",
"encoder",
"video/mlhe",
148 (uint64_t)(PROC_FEATURE_BITRATE|PROC_FEATURE_REGISTER_PTS|
149 PROC_FEATURE_LATENCY),
152 proc_send_frame_default1,
154 proc_recv_frame_default1,
167 "ffmpeg_mlhe_dec",
"decoder",
"video/mlhe",
168 (uint64_t)(PROC_FEATURE_BITRATE|PROC_FEATURE_REGISTER_PTS|
169 PROC_FEATURE_LATENCY),
172 proc_send_frame_default1,
174 proc_recv_frame_default1,
190 const char *settings_str,
log_ctx_t *log_ctx, va_list arg)
192 int ret_code, end_code= STAT_ERROR;
199 LOG_CTX_INIT(log_ctx);
202 CHECK_DO(proc_if!= NULL,
return NULL);
203 CHECK_DO(settings_str!= NULL,
return NULL);
209 CHECK_DO(ffmpeg_mlhe_enc_ctx!= NULL,
goto end);
212 ffmpeg_mlhe_enc_settings_ctx=
218 CHECK_DO(ret_code== STAT_SUCCESS,
goto end);
223 CHECK_DO(ret_code== STAT_SUCCESS,
goto end);
228 ffmpeg_mlhe_enc_settings_ctx;
232 (
int)AV_CODEC_ID_MLHE,
235 CHECK_DO(ret_code== STAT_SUCCESS,
goto end);
237 end_code= STAT_SUCCESS;
239 if(end_code!= STAT_SUCCESS)
252 if(ref_proc_ctx== NULL)
257 LOG_CTX_INIT(((
proc_ctx_t*)ffmpeg_mlhe_enc_ctx)->log_ctx);
271 free(ffmpeg_mlhe_enc_ctx);
283 int ret_code, end_code= STAT_ERROR;
286 AVFrame *avframe_iput= NULL;
287 size_t fifo_elem_size= 0;
291 CHECK_DO(proc_ctx!= NULL,
return STAT_ERROR);
292 CHECK_DO(iput_fifo_ctx!= NULL,
return STAT_ERROR);
293 CHECK_DO(oput_fifo_ctx!= NULL,
return STAT_ERROR);
295 LOG_CTX_SET(proc_ctx->
log_ctx);
302 ret_code=
fifo_get(iput_fifo_ctx, (
void**)&avframe_iput, &fifo_elem_size);
303 CHECK_DO(ret_code== STAT_SUCCESS || ret_code== STAT_EAGAIN,
goto end);
304 if(ret_code== STAT_EAGAIN) {
312 oput_fifo_ctx, LOG_CTX_GET());
313 CHECK_DO(ret_code== STAT_SUCCESS || ret_code== STAT_EAGAIN,
goto end);
315 end_code= STAT_SUCCESS;
317 if(avframe_iput!= NULL)
318 av_frame_free(&avframe_iput);
335 CHECK_DO(proc_ctx!= NULL,
return STAT_ERROR);
336 CHECK_DO(str!= NULL,
return STAT_ERROR);
338 LOG_CTX_SET(proc_ctx->
log_ctx);
342 ffmpeg_mlhe_enc_settings_ctx=
344 video_settings_enc_ctx=
350 if(ret_code!= STAT_SUCCESS)
358 (
volatile void*)video_settings_enc_ctx, 1,
371 int ret_code, end_code= STAT_ERROR;
374 AVCodecContext *avcodecctx= NULL;
377 cJSON *cjson_rest= NULL, *cjson_settings= NULL;
382 CHECK_DO(proc_ctx!= NULL,
return STAT_ERROR);
383 CHECK_DO(rest_fmt< PROC_IF_REST_FMT_ENUM_MAX,
return STAT_ERROR);
384 CHECK_DO(ref_reponse!= NULL,
return STAT_ERROR);
386 LOG_CTX_SET(proc_ctx->
log_ctx);
391 cjson_rest= cJSON_CreateObject();
392 CHECK_DO(cjson_rest!= NULL,
goto end);
406 ffmpeg_mlhe_enc_settings_ctx=
408 video_settings_enc_ctx=
413 &cjson_settings, LOG_CTX_GET());
414 CHECK_DO(ret_code== STAT_SUCCESS && cjson_settings!= NULL,
goto end);
420 cJSON_AddItemToObject(cjson_rest,
"settings", cjson_settings);
421 cjson_settings= NULL;
427 CHECK_DO(avcodecctx!= NULL,
goto end);
443 CHECK_DO(*ref_reponse!= NULL && strlen((
char*)*ref_reponse)> 0,
447 *ref_reponse= (
void*)cjson_rest;
451 LOGE(
"Unknown format requested for processor REST\n");
455 end_code= STAT_SUCCESS;
457 if(cjson_settings!= NULL)
458 cJSON_Delete(cjson_settings);
459 if(cjson_rest!= NULL)
460 cJSON_Delete(cjson_rest);
477 LOG_CTX_INIT(log_ctx);
480 CHECK_DO(ffmpeg_mlhe_enc_settings_ctx!= NULL,
return STAT_ERROR);
482 video_settings_enc_ctx=
487 if(ret_code!= STAT_SUCCESS)
506 LOG_CTX_INIT(log_ctx);
509 CHECK_DO(ffmpeg_mlhe_enc_settings_ctx!= NULL,
return);
511 video_settings_enc_ctx=
526 const char *settings_str,
log_ctx_t *log_ctx, va_list arg)
528 int ret_code, end_code= STAT_ERROR;
535 LOG_CTX_INIT(log_ctx);
538 CHECK_DO(proc_if!= NULL,
return NULL);
539 CHECK_DO(settings_str!= NULL,
return NULL);
545 CHECK_DO(ffmpeg_mlhe_dec_ctx!= NULL,
goto end);
548 ffmpeg_mlhe_dec_settings_ctx=
554 CHECK_DO(ret_code== STAT_SUCCESS,
goto end);
559 CHECK_DO(ret_code== STAT_SUCCESS,
goto end);
564 ffmpeg_mlhe_dec_settings_ctx;
568 (
int)AV_CODEC_ID_MLHE,
571 CHECK_DO(ret_code== STAT_SUCCESS,
goto end);
573 end_code= STAT_SUCCESS;
575 if(end_code!= STAT_SUCCESS)
588 if(ref_proc_ctx== NULL)
592 LOG_CTX_INIT(((
proc_ctx_t*)ffmpeg_mlhe_dec_ctx)->log_ctx);
606 free(ffmpeg_mlhe_dec_ctx);
618 int ret_code, end_code= STAT_ERROR;
621 AVPacket *avpacket_iput= NULL;
622 size_t fifo_elem_size= 0;
626 CHECK_DO(proc_ctx!= NULL,
return STAT_ERROR);
627 CHECK_DO(iput_fifo_ctx!= NULL,
return STAT_ERROR);
628 CHECK_DO(oput_fifo_ctx!= NULL,
return STAT_ERROR);
630 LOG_CTX_SET(proc_ctx->
log_ctx);
637 ret_code=
fifo_get(iput_fifo_ctx, (
void**)&avpacket_iput, &fifo_elem_size);
638 CHECK_DO(ret_code== STAT_SUCCESS || ret_code== STAT_EAGAIN,
goto end);
639 if(ret_code== STAT_EAGAIN) {
647 oput_fifo_ctx, LOG_CTX_GET());
648 CHECK_DO(ret_code== STAT_SUCCESS || ret_code== STAT_EAGAIN,
goto end);
650 end_code= STAT_SUCCESS;
652 if(avpacket_iput!= NULL)
670 CHECK_DO(proc_ctx!= NULL,
return STAT_ERROR);
671 CHECK_DO(str!= NULL,
return STAT_ERROR);
673 LOG_CTX_SET(proc_ctx->
log_ctx);
677 ffmpeg_mlhe_dec_settings_ctx=
679 video_settings_dec_ctx=
685 if(ret_code!= STAT_SUCCESS)
693 (
volatile void*)video_settings_dec_ctx, 0,
706 int ret_code, end_code= STAT_ERROR;
709 AVCodecContext *avcodecctx= NULL;
712 cJSON *cjson_rest= NULL, *cjson_settings= NULL;
717 CHECK_DO(proc_ctx!= NULL,
return STAT_ERROR);
718 CHECK_DO(rest_fmt< PROC_IF_REST_FMT_ENUM_MAX,
return STAT_ERROR);
719 CHECK_DO(ref_reponse!= NULL,
return STAT_ERROR);
721 LOG_CTX_SET(proc_ctx->
log_ctx);
726 cjson_rest= cJSON_CreateObject();
727 CHECK_DO(cjson_rest!= NULL,
goto end);
741 ffmpeg_mlhe_dec_settings_ctx=
743 video_settings_dec_ctx=
748 &cjson_settings, LOG_CTX_GET());
749 CHECK_DO(ret_code== STAT_SUCCESS && cjson_settings!= NULL,
goto end);
755 cJSON_AddItemToObject(cjson_rest,
"settings", cjson_settings);
756 cjson_settings= NULL;
762 CHECK_DO(avcodecctx!= NULL,
goto end);
776 CHECK_DO(*ref_reponse!= NULL && strlen((
char*)*ref_reponse)> 0,
780 *ref_reponse= (
void*)cjson_rest;
784 LOGE(
"Unknown format requested for processor REST\n");
788 end_code= STAT_SUCCESS;
790 if(cjson_settings!= NULL)
791 cJSON_Delete(cjson_settings);
792 if(cjson_rest!= NULL)
793 cJSON_Delete(cjson_rest);
810 LOG_CTX_INIT(log_ctx);
813 CHECK_DO(ffmpeg_mlhe_dec_settings_ctx!= NULL,
return STAT_ERROR);
815 video_settings_dec_ctx=
820 if(ret_code!= STAT_SUCCESS)
839 LOG_CTX_INIT(log_ctx);
842 CHECK_DO(ffmpeg_mlhe_dec_settings_ctx!= NULL,
return);
844 video_settings_dec_ctx=
static int ffmpeg_mlhe_enc_rest_get(proc_ctx_t *proc_ctx, const proc_if_rest_fmt_t rest_fmt, void **ref_reponse)
static proc_ctx_t * ffmpeg_mlhe_enc_open(const proc_if_t *proc_if, const char *settings_str, log_ctx_t *log_ctx, va_list arg)
void avframe_release(void **ref_avfame)
int fifo_get(fifo_ctx_t *fifo_ctx, void **ref_elem, size_t *ref_elem_size)
static int ffmpeg_mlhe_dec_rest_get(proc_ctx_t *proc_ctx, const proc_if_rest_fmt_t rest_fmt, void **ref_reponse)
#define CJSON_PRINT(CJSON_PTR)
Facilities to convert processor's input/output frame to FFmpeg's formats and vice versa...
proc_frame_ctx_t * avframe_2_proc_frame_ctx(const void *avframe_arg)
static int ffmpeg_mlhe_enc_process_frame(proc_ctx_t *proc_ctx, fifo_ctx_t *iput_fifo_ctx, fifo_ctx_t *oput_fifo_ctx)
int video_settings_enc_ctx_init(volatile video_settings_enc_ctx_t *video_settings_enc_ctx)
int video_settings_dec_ctx_restful_get(volatile video_settings_dec_ctx_t *video_settings_dec_ctx, cJSON **ref_cjson_rest, log_ctx_t *log_ctx)
void ffmpeg_video_reset_on_new_settings(proc_ctx_t *proc_ctx, volatile void *video_settings_opaque, int flag_is_encoder, log_ctx_t *log_ctx)
static int ffmpeg_mlhe_enc_rest_put(proc_ctx_t *proc_ctx, const char *str)
struct video_settings_dec_ctx_s video_settings_dec_ctx
Video encoder and decoder generic settings.
struct ffmpeg_video_dec_ctx_s ffmpeg_video_dec_ctx
int ffmpeg_video_enc_frame(ffmpeg_video_enc_ctx_t *ffmpeg_video_enc_ctx, AVFrame *avframe_iput, fifo_ctx_t *oput_fifo_ctx, log_ctx_t *log_ctx)
int video_settings_dec_ctx_init(volatile video_settings_dec_ctx_t *video_settings_dec_ctx)
struct video_settings_enc_ctx_s video_settings_enc_ctx
int video_settings_enc_ctx_restful_put(volatile video_settings_enc_ctx_t *video_settings_enc_ctx, const char *str, log_ctx_t *log_ctx)
static int ffmpeg_mlhe_enc_settings_ctx_init(volatile ffmpeg_mlhe_enc_settings_ctx_t *ffmpeg_mlhe_enc_settings_ctx, log_ctx_t *log_ctx)
Generic processor module context (see type proc_ctx_t) extension for video encoders and decoders...
struct ffmpeg_mlhe_enc_ctx_s ffmpeg_mlhe_enc_ctx_t
const proc_if_t proc_if_ffmpeg_mlhe_enc
volatile struct ffmpeg_mlhe_dec_settings_ctx_s ffmpeg_mlhe_dec_settings_ctx
static void ffmpeg_mlhe_enc_close(proc_ctx_t **ref_proc_ctx)
static void ffmpeg_mlhe_dec_close(proc_ctx_t **ref_proc_ctx)
void video_settings_enc_ctx_deinit(volatile video_settings_enc_ctx_t *video_settings_enc_ctx)
struct ffmpeg_video_enc_ctx_s ffmpeg_video_enc_ctx
void avpacket_release(void **ref_avpacket)
int ffmpeg_video_dec_frame(ffmpeg_video_dec_ctx_t *ffmpeg_video_dec_ctx, AVPacket *avpacket_iput, fifo_ctx_t *oput_fifo_ctx, log_ctx_t *log_ctx)
AVCodecContext * avcodecctx
void ffmpeg_video_dec_ctx_deinit(ffmpeg_video_dec_ctx_t *ffmpeg_video_dec_ctx, log_ctx_t *log_ctx)
static void ffmpeg_mlhe_enc_settings_ctx_deinit(volatile ffmpeg_mlhe_enc_settings_ctx_t *ffmpeg_mlhe_enc_settings_ctx, log_ctx_t *log_ctx)
#define CHECK_DO(COND, ACTION)
Character string response.
FFmpeg LHE/MLHE video encoder and decoder wrappers.
enum proc_if_rest_fmt_enum proc_if_rest_fmt_t
int video_settings_enc_ctx_restful_get(volatile video_settings_enc_ctx_t *video_settings_enc_ctx, cJSON **ref_cjson_rest, log_ctx_t *log_ctx)
static int ffmpeg_mlhe_dec_settings_ctx_init(volatile ffmpeg_mlhe_dec_settings_ctx_t *ffmpeg_mlhe_dec_settings_ctx, log_ctx_t *log_ctx)
struct ffmpeg_mlhe_dec_settings_ctx_s ffmpeg_mlhe_dec_settings_ctx_t
proc_frame_ctx_t * avpacket_2_proc_frame_ctx(const void *avpacket_arg)
static int ffmpeg_mlhe_dec_process_frame(proc_ctx_t *proc_ctx, fifo_ctx_t *iput_fifo_ctx, fifo_ctx_t *oput_fifo_ctx)
static void ffmpeg_mlhe_dec_settings_ctx_deinit(volatile ffmpeg_mlhe_dec_settings_ctx_t *ffmpeg_mlhe_dec_settings_ctx, log_ctx_t *log_ctx)
int ffmpeg_video_enc_ctx_init(ffmpeg_video_enc_ctx_t *ffmpeg_video_enc_ctx, int avcodecid, const video_settings_enc_ctx_t *video_settings_enc_ctx, log_ctx_t *log_ctx)
volatile struct ffmpeg_mlhe_enc_settings_ctx_s ffmpeg_mlhe_enc_settings_ctx
struct ffmpeg_mlhe_enc_settings_ctx_s ffmpeg_mlhe_enc_settings_ctx_t
void * proc_frame_ctx_2_avpacket(const proc_frame_ctx_t *proc_frame_ctx)
AVCodecContext * avcodecctx
static proc_ctx_t * ffmpeg_mlhe_dec_open(const proc_if_t *proc_if, const char *settings_str, log_ctx_t *log_ctx, va_list arg)
void * proc_frame_ctx_2_avframe(const proc_frame_ctx_t *proc_frame_ctx)
struct ffmpeg_mlhe_dec_ctx_s ffmpeg_mlhe_dec_ctx_t
int video_settings_dec_ctx_restful_put(volatile video_settings_dec_ctx_t *video_settings_dec_ctx, const char *str, log_ctx_t *log_ctx)
void ffmpeg_video_enc_ctx_deinit(ffmpeg_video_enc_ctx_t *ffmpeg_video_enc_ctx, log_ctx_t *log_ctx)
void video_settings_dec_ctx_deinit(volatile video_settings_dec_ctx_t *video_settings_dec_ctx)
const proc_if_t proc_if_ffmpeg_mlhe_dec
int ffmpeg_video_dec_ctx_init(ffmpeg_video_dec_ctx_t *ffmpeg_video_dec_ctx, int avcodecid, const video_settings_dec_ctx_t *video_settings_dec_ctx, log_ctx_t *log_ctx)
static int ffmpeg_mlhe_dec_rest_put(proc_ctx_t *proc_ctx, const char *str)