diff options
Diffstat (limited to 'src/encoder.c')
| -rw-r--r-- | src/encoder.c | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/src/encoder.c b/src/encoder.c index a670a11..4fa059a 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -12,8 +12,12 @@ * Encoder context */ typedef struct { - /* common encoder stuff */ + /* input image */ + sstv_image_t image; + + /* output configuration */ sstv_mode_t mode; + size_t sample_rate; } sstv_encoder_context_t; /* default encoder contexts, for when no allocation/deallocation routines are provided */ @@ -22,7 +26,7 @@ static uint64_t default_encoder_context_usage = 0x0; sstv_error_t -sstv_create_encoder(sstv_mode_t mode, uint8_t *image, size_t sample_rate, void **out_ctx) +sstv_create_encoder(void **out_ctx, sstv_image_t image, sstv_mode_t mode, size_t sample_rate) { sstv_encoder_context_t *ctx = NULL; @@ -31,12 +35,30 @@ sstv_create_encoder(sstv_mode_t mode, uint8_t *image, size_t sample_rate, void * return SSTV_BAD_PARAMETER; } + /* check image properties */ + { + size_t w, h; + sstv_image_format_t fmt; + sstv_error_t rc; + + rc = sstv_get_mode_image_props(mode, &w, &h, &fmt); + if (rc != SSTV_OK) { + return rc; + } + if (w != image.width || h != image.height) { + return SSTV_BAD_RESOLUTION; + } + if (fmt != image.format) { + return SSTV_BAD_FORMAT; + } + } + /* create context */ if (sstv_malloc_user) { /* user allocator */ ctx = (sstv_encoder_context_t *) sstv_malloc_user(sizeof(sstv_encoder_context_t)); if (!ctx) { - return SSTV_BAD_USER_ALLOC; + return SSTV_ALLOC_FAIL; } } else { size_t i; @@ -55,7 +77,9 @@ sstv_create_encoder(sstv_mode_t mode, uint8_t *image, size_t sample_rate, void * } /* initialize context */ + ctx->image = image; ctx->mode = mode; + ctx->sample_rate = sample_rate; /* set output */ *out_ctx = ctx; @@ -69,6 +93,10 @@ sstv_delete_encoder(void *ctx) { size_t i; + if (!ctx) { + return SSTV_BAD_PARAMETER; + } + /* check default contexts */ for (i = 0; i < SSTV_DEFAULT_ENCODER_CONTEXT_COUNT; i++) { if (ctx == default_encoder_context+i) { |
