diff --git a/libcelt/celt.c b/libcelt/celt.c index 26ec8e14756093ddacb82dc057c9b81f6325fef4..72045d9a0d35ca3a459b7b10df88a4caf13504d9 100644 --- a/libcelt/celt.c +++ b/libcelt/celt.c @@ -918,6 +918,14 @@ int celt_encoder_ctl(CELTEncoder * restrict st, int request, ...) va_start(ap, request); switch (request) { + case CELT_GET_MODE_REQUEST: + { + const CELTMode ** value = va_arg(ap, const CELTMode**); + if (value==0) + goto bad_arg; + *value=st->mode; + } + break; case CELT_SET_COMPLEXITY_REQUEST: { int value = va_arg(ap, celt_int32_t); @@ -1351,6 +1359,14 @@ int celt_decoder_ctl(CELTDecoder * restrict st, int request, ...) va_start(ap, request); switch (request) { + case CELT_GET_MODE_REQUEST: + { + const CELTMode ** value = va_arg(ap, const CELTMode**); + if (value==0) + goto bad_arg; + *value=st->mode; + } + break; case CELT_RESET_STATE: { const CELTMode *mode = st->mode; @@ -1369,11 +1385,9 @@ int celt_decoder_ctl(CELTDecoder * restrict st, int request, ...) } va_end(ap); return CELT_OK; -#if 0 /* Put this back in if you ever need "bad_arg" */ bad_arg: va_end(ap); return CELT_BAD_ARG; -#endif bad_request: va_end(ap); return CELT_UNIMPLEMENTED; diff --git a/libcelt/celt.h b/libcelt/celt.h index aa403641795036ce0f39a24a73c2e40d2e040c49..8ed67f3d9a1ab8e7c7293f4b30a29212ff71d72c 100644 --- a/libcelt/celt.h +++ b/libcelt/celt.h @@ -52,6 +52,7 @@ extern "C" { #endif #define _celt_check_int(x) (((void)((x) == (celt_int32_t)0)), (celt_int32_t)(x)) +#define _celt_check_mode_ptr_ptr(ptr) ((ptr) + ((ptr) - (CELTMode**)(ptr))) /* Error codes */ /** No error */ @@ -68,6 +69,9 @@ extern "C" { #define CELT_UNIMPLEMENTED -5 /* Requests */ +#define CELT_GET_MODE_REQUEST 1 +/** Get the CELTMode used by an encoder or decoder */ +#define CELT_GET_MODE(x) CELT_GET_MODE_REQUEST, _celt_check_mode_ptr_ptr(x) #define CELT_SET_COMPLEXITY_REQUEST 2 /** Controls the complexity from 0-10 (int) */ #define CELT_SET_COMPLEXITY(x) CELT_SET_COMPLEXITY_REQUEST, _celt_check_int(x)