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_mp3_enc",
"encoder",
"audio/MPA",
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_mp3_dec",
"decoder",
"audio/MPA",
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_mp3_enc_ctx!= NULL,
goto end);
212 ffmpeg_mp3_enc_settings_ctx=
218 CHECK_DO(ret_code== STAT_SUCCESS,
goto end);
223 CHECK_DO(ret_code== STAT_SUCCESS,
goto end);
228 ffmpeg_mp3_enc_settings_ctx;
232 (
int)AV_CODEC_ID_MP3,
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_mp3_enc_ctx)->log_ctx);
271 free(ffmpeg_mp3_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_mp3_enc_settings_ctx=
344 audio_settings_enc_ctx=
350 if(ret_code!= STAT_SUCCESS)
358 (
volatile void*)audio_settings_enc_ctx, 1,
371 int ret_code, end_code= STAT_ERROR;
374 AVCodecContext *avcodecctx= NULL;
377 cJSON *cjson_rest= NULL, *cjson_settings= NULL;
378 cJSON *cjson_aux= 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_mp3_enc_settings_ctx=
408 audio_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);
430 cjson_aux= cJSON_CreateNumber((
double)avcodecctx->frame_size);
431 CHECK_DO(cjson_aux!= NULL,
goto end);
432 cJSON_AddItemToObject(cjson_rest,
"expected_frame_size_iput", cjson_aux);
441 CHECK_DO(*ref_reponse!= NULL && strlen((
char*)*ref_reponse)> 0,
445 *ref_reponse= (
void*)cjson_rest;
449 LOGE(
"Unknown format requested for processor REST\n");
453 end_code= STAT_SUCCESS;
455 if(cjson_settings!= NULL)
456 cJSON_Delete(cjson_settings);
457 if(cjson_rest!= NULL)
458 cJSON_Delete(cjson_rest);
475 LOG_CTX_INIT(log_ctx);
478 CHECK_DO(ffmpeg_mp3_enc_settings_ctx!= NULL,
return STAT_ERROR);
480 audio_settings_enc_ctx=
485 if(ret_code!= STAT_SUCCESS)
504 LOG_CTX_INIT(log_ctx);
507 CHECK_DO(ffmpeg_mp3_enc_settings_ctx!= NULL,
return);
509 audio_settings_enc_ctx=
524 const char *settings_str,
log_ctx_t *log_ctx, va_list arg)
526 int ret_code, end_code= STAT_ERROR;
533 LOG_CTX_INIT(log_ctx);
536 CHECK_DO(proc_if!= NULL,
return NULL);
537 CHECK_DO(settings_str!= NULL,
return NULL);
543 CHECK_DO(ffmpeg_mp3_dec_ctx!= NULL,
goto end);
546 ffmpeg_mp3_dec_settings_ctx=
552 CHECK_DO(ret_code== STAT_SUCCESS,
goto end);
557 CHECK_DO(ret_code== STAT_SUCCESS,
goto end);
562 ffmpeg_mp3_dec_settings_ctx;
566 (
int)AV_CODEC_ID_MP3,
569 CHECK_DO(ret_code== STAT_SUCCESS,
goto end);
571 end_code= STAT_SUCCESS;
573 if(end_code!= STAT_SUCCESS)
586 if(ref_proc_ctx== NULL)
590 LOG_CTX_INIT(((
proc_ctx_t*)ffmpeg_mp3_dec_ctx)->log_ctx);
604 free(ffmpeg_mp3_dec_ctx);
616 int ret_code, end_code= STAT_ERROR;
619 AVPacket *avpacket_iput= NULL;
620 size_t fifo_elem_size= 0;
624 CHECK_DO(proc_ctx!= NULL,
return STAT_ERROR);
625 CHECK_DO(iput_fifo_ctx!= NULL,
return STAT_ERROR);
626 CHECK_DO(oput_fifo_ctx!= NULL,
return STAT_ERROR);
628 LOG_CTX_SET(proc_ctx->
log_ctx);
635 ret_code=
fifo_get(iput_fifo_ctx, (
void**)&avpacket_iput, &fifo_elem_size);
636 CHECK_DO(ret_code== STAT_SUCCESS || ret_code== STAT_EAGAIN,
goto end);
637 if(ret_code== STAT_EAGAIN) {
645 oput_fifo_ctx, LOG_CTX_GET());
646 CHECK_DO(ret_code== STAT_SUCCESS || ret_code== STAT_EAGAIN,
goto end);
648 end_code= STAT_SUCCESS;
650 if(avpacket_iput!= NULL)
668 CHECK_DO(proc_ctx!= NULL,
return STAT_ERROR);
669 CHECK_DO(str!= NULL,
return STAT_ERROR);
671 LOG_CTX_SET(proc_ctx->
log_ctx);
675 ffmpeg_mp3_dec_settings_ctx=
677 audio_settings_dec_ctx=
683 if(ret_code!= STAT_SUCCESS)
691 (
volatile void*)audio_settings_dec_ctx, 0,
704 int ret_code, end_code= STAT_ERROR;
708 AVCodecContext *avcodecctx= NULL;
710 cJSON *cjson_rest= NULL, *cjson_settings= NULL;
715 CHECK_DO(proc_ctx!= NULL,
return STAT_ERROR);
716 CHECK_DO(rest_fmt< PROC_IF_REST_FMT_ENUM_MAX,
return STAT_ERROR);
717 CHECK_DO(ref_reponse!= NULL,
return STAT_ERROR);
719 LOG_CTX_SET(proc_ctx->
log_ctx);
724 cjson_rest= cJSON_CreateObject();
725 CHECK_DO(cjson_rest!= NULL,
goto end);
739 ffmpeg_mp3_dec_settings_ctx=
741 audio_settings_dec_ctx=
746 &cjson_settings, LOG_CTX_GET());
747 CHECK_DO(ret_code== STAT_SUCCESS && cjson_settings!= NULL,
goto end);
753 cJSON_AddItemToObject(cjson_rest,
"settings", cjson_settings);
754 cjson_settings= NULL;
760 CHECK_DO(avcodecctx!= NULL,
goto end);
774 CHECK_DO(*ref_reponse!= NULL && strlen((
char*)*ref_reponse)> 0,
778 *ref_reponse= (
void*)cjson_rest;
782 LOGE(
"Unknown format requested for processor REST\n");
786 end_code= STAT_SUCCESS;
788 if(cjson_settings!= NULL)
789 cJSON_Delete(cjson_settings);
790 if(cjson_rest!= NULL)
791 cJSON_Delete(cjson_rest);
808 LOG_CTX_INIT(log_ctx);
811 CHECK_DO(ffmpeg_mp3_dec_settings_ctx!= NULL,
return STAT_ERROR);
813 audio_settings_dec_ctx=
818 if(ret_code!= STAT_SUCCESS)
837 LOG_CTX_INIT(log_ctx);
840 CHECK_DO(ffmpeg_mp3_dec_settings_ctx!= NULL,
return);
842 audio_settings_dec_ctx=
void avframe_release(void **ref_avfame)
int fifo_get(fifo_ctx_t *fifo_ctx, void **ref_elem, size_t *ref_elem_size)
#define CJSON_PRINT(CJSON_PTR)
AVCodecContext * avcodecctx
Facilities to convert processor's input/output frame to FFmpeg's formats and vice versa...
int audio_settings_enc_ctx_restful_get(volatile audio_settings_enc_ctx_t *audio_settings_enc_ctx, cJSON **ref_cjson_rest, log_ctx_t *log_ctx)
proc_frame_ctx_t * avframe_2_proc_frame_ctx(const void *avframe_arg)
const proc_if_t proc_if_ffmpeg_mp3_dec
static void ffmpeg_mp3_dec_settings_ctx_deinit(volatile ffmpeg_mp3_dec_settings_ctx_t *ffmpeg_mp3_dec_settings_ctx, log_ctx_t *log_ctx)
void ffmpeg_audio_enc_ctx_deinit(ffmpeg_audio_enc_ctx_t *ffmpeg_audio_enc_ctx, log_ctx_t *log_ctx)
static int ffmpeg_mp3_enc_rest_put(proc_ctx_t *proc_ctx, const char *str)
struct ffmpeg_audio_enc_ctx_s ffmpeg_audio_enc_ctx
int audio_settings_dec_ctx_init(volatile audio_settings_dec_ctx_t *audio_settings_dec_ctx)
int audio_settings_enc_ctx_init(volatile audio_settings_enc_ctx_t *audio_settings_enc_ctx)
static int ffmpeg_mp3_dec_rest_get(proc_ctx_t *proc_ctx, const proc_if_rest_fmt_t rest_fmt, void **ref_reponse)
void ffmpeg_audio_dec_ctx_deinit(ffmpeg_audio_dec_ctx_t *ffmpeg_audio_dec_ctx, log_ctx_t *log_ctx)
static proc_ctx_t * ffmpeg_mp3_dec_open(const proc_if_t *proc_if, const char *settings_str, log_ctx_t *log_ctx, va_list arg)
int audio_settings_enc_ctx_restful_put(volatile audio_settings_enc_ctx_t *audio_settings_enc_ctx, const char *str, log_ctx_t *log_ctx)
struct audio_settings_enc_ctx_s audio_settings_enc_ctx
int ffmpeg_audio_enc_frame(ffmpeg_audio_enc_ctx_t *ffmpeg_audio_enc_ctx, AVFrame *avframe_iput, fifo_ctx_t *oput_fifo_ctx, log_ctx_t *log_ctx)
int ffmpeg_audio_dec_frame(ffmpeg_audio_dec_ctx_t *ffmpeg_audio_dec_ctx, AVPacket *avpacket_iput, fifo_ctx_t *oput_fifo_ctx, log_ctx_t *log_ctx)
const proc_if_t proc_if_ffmpeg_mp3_enc
Generic processor module context (see type proc_ctx_t) extension for audio encoders and decoders...
struct ffmpeg_audio_dec_ctx_s ffmpeg_audio_dec_ctx
static void ffmpeg_mp3_enc_settings_ctx_deinit(volatile ffmpeg_mp3_enc_settings_ctx_t *ffmpeg_mp3_enc_settings_ctx, log_ctx_t *log_ctx)
struct ffmpeg_mp3_dec_ctx_s ffmpeg_mp3_dec_ctx_t
static int ffmpeg_mp3_dec_process_frame(proc_ctx_t *proc_ctx, fifo_ctx_t *iput_fifo_ctx, fifo_ctx_t *oput_fifo_ctx)
void avpacket_release(void **ref_avpacket)
volatile struct ffmpeg_mp3_dec_settings_ctx_s ffmpeg_mp3_dec_settings_ctx
struct ffmpeg_mp3_enc_settings_ctx_s ffmpeg_mp3_enc_settings_ctx_t
void ffmpeg_audio_reset_on_new_settings(proc_ctx_t *proc_ctx, volatile void *audio_settings_opaque, int flag_is_encoder, log_ctx_t *log_ctx)
struct ffmpeg_mp3_dec_settings_ctx_s ffmpeg_mp3_dec_settings_ctx_t
#define CHECK_DO(COND, ACTION)
Character string response.
static int ffmpeg_mp3_enc_rest_get(proc_ctx_t *proc_ctx, const proc_if_rest_fmt_t rest_fmt, void **ref_reponse)
struct ffmpeg_mp3_enc_ctx_s ffmpeg_mp3_enc_ctx_t
enum proc_if_rest_fmt_enum proc_if_rest_fmt_t
static int ffmpeg_mp3_dec_settings_ctx_init(volatile ffmpeg_mp3_dec_settings_ctx_t *ffmpeg_mp3_dec_settings_ctx, log_ctx_t *log_ctx)
proc_frame_ctx_t * avpacket_2_proc_frame_ctx(const void *avpacket_arg)
volatile struct ffmpeg_mp3_enc_settings_ctx_s ffmpeg_mp3_enc_settings_ctx
void audio_settings_dec_ctx_deinit(volatile audio_settings_dec_ctx_t *audio_settings_dec_ctx)
void audio_settings_enc_ctx_deinit(volatile audio_settings_enc_ctx_t *audio_settings_enc_ctx)
struct audio_settings_dec_ctx_s audio_settings_dec_ctx
AVCodecContext * avcodecctx
Audio encoder and decoder generic settings.
void * proc_frame_ctx_2_avpacket(const proc_frame_ctx_t *proc_frame_ctx)
static int ffmpeg_mp3_enc_process_frame(proc_ctx_t *proc_ctx, fifo_ctx_t *iput_fifo_ctx, fifo_ctx_t *oput_fifo_ctx)
static void ffmpeg_mp3_dec_close(proc_ctx_t **ref_proc_ctx)
int ffmpeg_audio_enc_ctx_init(ffmpeg_audio_enc_ctx_t *ffmpeg_audio_enc_ctx, int avcodecid, const audio_settings_enc_ctx_t *audio_settings_enc_ctx, log_ctx_t *log_ctx)
static proc_ctx_t * ffmpeg_mp3_enc_open(const proc_if_t *proc_if, const char *settings_str, log_ctx_t *log_ctx, va_list arg)
int ffmpeg_audio_dec_ctx_init(ffmpeg_audio_dec_ctx_t *ffmpeg_audio_dec_ctx, int avcodecid, const audio_settings_dec_ctx_t *audio_settings_dec_ctx, log_ctx_t *log_ctx)
void * proc_frame_ctx_2_avframe(const proc_frame_ctx_t *proc_frame_ctx)
static void ffmpeg_mp3_enc_close(proc_ctx_t **ref_proc_ctx)
int audio_settings_dec_ctx_restful_put(volatile audio_settings_dec_ctx_t *audio_settings_dec_ctx, const char *str, log_ctx_t *log_ctx)
int audio_settings_dec_ctx_restful_get(volatile audio_settings_dec_ctx_t *audio_settings_dec_ctx, cJSON **ref_cjson_rest, log_ctx_t *log_ctx)
static int ffmpeg_mp3_dec_rest_put(proc_ctx_t *proc_ctx, const char *str)
static int ffmpeg_mp3_enc_settings_ctx_init(volatile ffmpeg_mp3_enc_settings_ctx_t *ffmpeg_mp3_enc_settings_ctx, log_ctx_t *log_ctx)
FFmpeg MP3 audio encoder and decoder wrappers.