10
static void error_callback(const char *msg, void *client_data) {
11
FILE *stream = (FILE*)client_data;
12
fprintf(stream, "[R3D ERR] %s", msg);
15
static void warning_callback(const char *msg, void *client_data) {
16
FILE *stream = (FILE*)client_data;
17
fprintf(stream, "[R3D WARN] %s", msg);
20
static void info_callback(const char *msg, void *client_data) {
22
fprintf(stdout, "[R3D INFO] %s", msg);
29
struct redcode_frame_raw * redcode_decode_video_raw(
30
struct redcode_frame * frame, int scale)
32
struct redcode_frame_raw * rv = NULL;
33
opj_dparameters_t parameters; /* decompression parameters */
34
opj_event_mgr_t event_mgr; /* event manager */
35
opj_image_t *image = NULL;
36
opj_dinfo_t* dinfo = NULL; /* handle to a decompressor */
37
opj_cio_t *cio = NULL;
39
memset(&event_mgr, 0, sizeof(opj_event_mgr_t));
40
event_mgr.error_handler = error_callback;
41
event_mgr.warning_handler = warning_callback;
42
event_mgr.info_handler = info_callback;
44
opj_set_default_decoder_parameters(¶meters);
46
parameters.decod_format = JP2_CFMT;
49
parameters.cp_reduce = 1;
50
} else if (scale == 4) {
51
parameters.cp_reduce = 2;
52
} else if (scale == 8) {
53
parameters.cp_reduce = 3;
56
/* JPEG 2000 compressed image data */
58
/* get a decoder handle */
59
dinfo = opj_create_decompress(CODEC_JP2);
61
/* catch events using our callbacks and give a local context */
62
opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr);
64
/* setup the decoder decoding parameters using the current image
65
and user parameters */
66
opj_setup_decoder(dinfo, ¶meters);
68
/* open a byte stream */
69
cio = opj_cio_open((opj_common_ptr)dinfo,
70
frame->data + frame->offset, frame->length);
72
image = opj_decode(dinfo, cio);
76
"ERROR -> j2k_to_image: failed to decode image!\n");
77
opj_destroy_decompress(dinfo);
82
/* close the byte stream */
85
/* free remaining structures */
87
opj_destroy_decompress(dinfo);
90
if((image->numcomps * image->x1 * image->y1) == 0) {
91
opj_image_destroy(image);
95
rv = (struct redcode_frame_raw *) calloc(
96
1, sizeof(struct redcode_frame_raw));
99
rv->width = image->comps[0].w;
100
rv->height = image->comps[0].h;
105
int redcode_decode_video_float(struct redcode_frame_raw * frame,
106
float * out, int scale)
110
opj_image_t *image = (opj_image_t*) frame->data;
112
if (image->numcomps != 4) {
113
fprintf(stderr, "R3D: need 4 planes, but got: %d\n",
118
for (i = 0; i < 4; i++) {
119
planes[i] = image->comps[i].data;
123
redcode_ycbcr2rgb_fullscale(
124
planes, frame->width, frame->height, out);
125
} else if (scale == 2) {
126
redcode_ycbcr2rgb_halfscale(
127
planes, frame->width, frame->height, out);
128
} else if (scale == 4) {
129
redcode_ycbcr2rgb_quarterscale(
130
planes, frame->width, frame->height, out);
133
opj_image_destroy(image);