int jpeg_decompress_reconfigure(void *state, struct video_desc desc, int rshift, int gshift, int bshift, int pitch, codec_t out_codec) { struct state_decompress_jpeg *s = (struct state_decompress_jpeg *) state; int ret; assert(out_codec == RGB || out_codec == UYVY); if(s->out_codec == out_codec && s->pitch == pitch && s->rshift == rshift && s->gshift == gshift && s->bshift == bshift && video_desc_eq_excl_param(s->desc, desc, PARAM_INTERLACING)) { return TRUE; } else { s->out_codec = out_codec; s->pitch = pitch; s->rshift = rshift; s->gshift = gshift; s->bshift = bshift; if(s->decoder) { gpujpeg_decoder_destroy(s->decoder); } return configure_with(s, desc); } }
int dxt_glsl_decompress_reconfigure(void *state, struct video_desc desc, int rshift, int gshift, int bshift, int pitch, codec_t out_codec) { struct state_decompress *s = (struct state_decompress *) state; s->pitch = pitch; s->rshift = rshift; s->gshift = gshift; s->bshift = bshift; s->out_codec = out_codec; if(!s->configured) { configure_with(s, desc); } else { dxt_decoder_destroy(s->decoder); configure_with(s, desc); } return s->compressed_len; }
struct video_frame * dxt_glsl_compress(struct module *mod, struct video_frame * tx, int buffer_idx) { struct state_video_compress_rtdxt *s = (struct state_video_compress_rtdxt *) mod->priv_data; int i; unsigned char *line1, *line2; assert(buffer_idx >= 0 && buffer_idx < 2); unsigned int x; gl_context_make_current(&s->gl_context); if(!s->configured) { int ret; ret = configure_with(s, tx); if(!ret) return NULL; } for (x = 0; x < tx->tile_count; ++x) { struct tile *in_tile = vf_get_tile(tx, x); struct tile *out_tile = vf_get_tile(s->out[buffer_idx], x); line1 = (unsigned char *) in_tile->data; line2 = (unsigned char *) s->decoded; for (i = 0; i < (int) in_tile->height; ++i) { s->decoder(line2, line1, s->encoder_input_linesize, 0, 8, 16); line1 += vc_get_linesize(in_tile->width, tx->color_spec); line2 += s->encoder_input_linesize; } if(s->interlaced_input) vc_deinterlace((unsigned char *) s->decoded, s->encoder_input_linesize, in_tile->height); dxt_encoder_compress(s->encoder[x], (unsigned char *) s->decoded, (unsigned char *) out_tile->data); } gl_context_make_current(NULL); return s->out[buffer_idx]; }
struct video_frame * jpeg_compress(struct module *mod, struct video_frame * tx, int buffer_idx) { struct state_video_compress_jpeg *s = (struct state_video_compress_jpeg *) mod->priv_data; int i; unsigned char *line1, *line2; struct video_frame *out; unsigned int x; cudaSetDevice(cuda_devices[0]); if(!s->encoder) { int ret; ret = configure_with(s, tx); if(!ret) { return NULL; } } struct video_desc desc; desc = video_desc_from_frame(tx); // if format changed, reconfigure if(!video_desc_eq_excl_param(s->saved_desc, desc, PARAM_INTERLACING)) { cleanup_state(s); int ret; ret = configure_with(s, tx); if(!ret) { return NULL; } } out = s->out[buffer_idx]; for (x = 0; x < tx->tile_count; ++x) { struct tile *in_tile = vf_get_tile(tx, x); struct tile *out_tile = vf_get_tile(out, x); line1 = (unsigned char *) in_tile->data; line2 = (unsigned char *) s->decoded; for (i = 0; i < (int) in_tile->height; ++i) { s->decoder(line2, line1, s->encoder_input_linesize, 0, 8, 16); line1 += vc_get_linesize(in_tile->width, tx->color_spec); line2 += s->encoder_input_linesize; } line1 = (unsigned char *) out_tile->data + (in_tile->height - 1) * s->encoder_input_linesize; for( ; i < (int) out->tiles[0].height; ++i) { memcpy(line2, line1, s->encoder_input_linesize); line2 += s->encoder_input_linesize; } /*if(s->interlaced_input) vc_deinterlace((unsigned char *) s->decoded, s->encoder_input_linesize, s->out->tiles[0].height);*/ uint8_t *compressed; int size; int ret; struct gpujpeg_encoder_input encoder_input; gpujpeg_encoder_input_set_image(&encoder_input, (uint8_t *) s->decoded); ret = gpujpeg_encoder_encode(s->encoder, &encoder_input, &compressed, &size); if(ret != 0) return NULL; out_tile->data_len = size; memcpy(out_tile->data, compressed, size); } return out; }