summaryrefslogtreecommitdiff
path: root/src/encoder.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/encoder.c')
-rw-r--r--src/encoder.c34
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) {