/* * Class: com_sun_media_protocol_sunvideo_XILCapture * Method: xilSetQuality * Signature: (I)Z */ JNIEXPORT jboolean JNICALL Java_com_sun_media_protocol_sunvideo_XILCapture_xilSetQuality(JNIEnv *env, jobject jxil, jint jquality) { int quality = (int)jquality; InstanceState *inst = (InstanceState *) GetLongField(env, jxil, "peer"); if (inst == NULL) return FALSE; /* Debug Message*/ PRINT("In xilSetQuality\n"); if (quality < 1) quality = 50; /* force to default quality */ if (quality > 100) quality = 100; /* limit to maximum quality */ if (quality == inst->quality) return TRUE; /* if no change, return */ inst->quality = quality; if (inst->started && inst->xil_cis != NULL) { xil_cis_set_attribute(inst->xil_cis, "COMPRESSION_QUALITY", (void *)inst->quality); } setFormat(env, jxil, inst); return TRUE; }
void XILOutputAssistor::setq(int q) { int qt[8][8]; XilJpegQTable xq; inq_ = q; sentfirstheader=0; jpeg_luma_qt(q, (int*)qt); xq.table = 0; xq.value = qt; (void)xil_cis_set_attribute(cis_, "QUANTIZATION_TABLE", (void*)&xq); jpeg_chroma_qt(q, (int*)qt); xq.table = 1; xq.value = qt; (void)xil_cis_set_attribute(cis_, "QUANTIZATION_TABLE", (void*)&xq); }
static void updateXilCis(InstanceState *inst) { /* Debug Message */ PRINT("In updateXilCis\n"); if (inst) { xil_cis_destroy(inst->xil_cis); inst->xil_cis = NULL; inst->xil_cis = xil_cis_create(inst->xil_state, inst->cis_type); if (inst->do_cis == MPEG) { XilMpeg1Pattern mpattern; char *pattern = "IIII"; mpattern.pattern = pattern; mpattern.repeat_count = 0; xil_cis_set_keep_frames(inst->xil_cis, 6); xil_cis_set_max_frames(inst->xil_cis, 6); xil_cis_set_attribute(inst->xil_cis, "COMPRESSOR_PATTERN", (void *)&mpattern); xil_cis_set_attribute(inst->xil_cis, "COMPRESSOR_INSERT_VIDEO_SEQUENCE_END", (void *)TRUE); } else { xil_cis_set_keep_frames(inst->xil_cis, 1); xil_cis_set_max_frames(inst->xil_cis, 1); } if (inst->do_cis == JPEG) { xil_cis_set_attribute(inst->xil_cis, "ENCODE_411_INTERLEAVED", (void *) TRUE); xil_cis_set_attribute(inst->xil_cis, "IGNORE_HISTORY", (void *) TRUE); xil_cis_set_attribute(inst->xil_cis, "COMPRESSED_DATA_FORMAT", (void *) INTERCHANGE); if (inst->quality != 0) { xil_cis_set_attribute(inst->xil_cis, "COMPRESSION_QUALITY", (void *)inst->quality); } } } }
int XILOutputAssistor::consume(const VideoFrame* vf) { int len=0,dofree=0; u_char *bp,*p=NULL; //fprintf(stderr,"XILOutputAssistor(%s)::"__FUNCTION__"\n",filename_); switch (type_) { case FT_JPEG|FT_HW: { JpegFrame* jf = (JpegFrame*)vf; if ( (jf->q_ != inq_) || (jf->width_ != width_) || (jf->height_ != height_) ) reset(jf->q_, jf->width_, jf->height_); len=jf->len_; bp=jf->bp_; dofree=1; if (sentfirstheader) { p = new u_char[sizeof(jfif_header2)+len]; memcpy(p,jfif_header2,sizeof(jfif_header2)); memcpy(p+sizeof(jfif_header2),bp,len); len+=sizeof(jfif_header2); } else { p = new u_char [sizeof(jfif_header1)+len]; memcpy(p,jfif_header1,sizeof(jfif_header1)); memcpy(p+sizeof(jfif_header1),bp,len); len+=sizeof(jfif_header1); sentfirstheader=1; } break; } case FT_CELLB: { CellBFrame* hf = (CellBFrame*) vf; len=hf->len_; p=hf->bp_; xil_cis_set_attribute(cis_, "WIDTH", (void *)hf->width_); xil_cis_set_attribute(cis_, "HEIGHT", (void *)hf->height_); break; } case FT_H261: { H261Frame* hf = (H261Frame*) vf; len=hf->len_; p=hf->bp_; while ((p[0]==0)&&(p[1]==0)) { p++;len--; } break; } } xil_cis_put_bits(cis_,len,1/*framecount*/,p); if (dofree) delete[] p; //SV-XXX: Debian outputtype = xil_cis_get_output_type(cis_); xil_imagetype_get_info(outputtype, &cis_xsize, &cis_ysize,&cis_nbands, &cis_datatype); if (!imageYCC || lastcisw!=cis_xsize || lastcish!=cis_ysize) { lastcish = cis_ysize; lastcisw = cis_xsize; //fprintf(stderr," w=%d,h=%d\n",cis_xsize,cis_ysize); if (imageYCC) xil_destroy(imageYCC); imageYCC = xil_create(xil_,cis_xsize,cis_ysize,cis_nbands,cis_datatype); return 0; } xil_decompress(cis_, imageYCC); xil_sync(imageYCC); //xil_cis_reset(cis_); return (0); }
int XILWindowAssistor::consume(const VideoFrame* vf) { int len=0,dofree=0; u_char *bp,*p=NULL; float scale[3], offset[3]; XilColorspace ycc, rgb; // fprintf(stderr,"XILWindowAssistor::"__FUNCTION__"\n"); switch (type_) { case FT_JPEG|FT_HW: { JpegFrame* jf = (JpegFrame*)vf; if ( (jf->type_ != lastjpegtype_) || (jf->q_ != inq_) || (jf->width_ != width_) || (jf->height_ != height_) ) { //fprintf(stderr,"w=%d,h=%d,q=%d\n",jf->width_,jf->height_,jf->q_); reset(jf->type_,jf->q_, jf->width_, jf->height_); } len=jf->len_; bp=jf->bp_; dofree=1; if (sentfirstheader) { p = new u_char[sizeof(jfif_header2)+len]; memcpy(p,jfif_header2,sizeof(jfif_header2)); memcpy(p+sizeof(jfif_header2),bp,len); len+=sizeof(jfif_header2); } else { p = new u_char[sizeof(jfif_header1)+len]; memcpy(p,jfif_header1,sizeof(jfif_header1)); memcpy(p+sizeof(jfif_header1),bp,len); len+=sizeof(jfif_header1); sentfirstheader=1; } break; } case FT_CELLB: { CellBFrame* hf = (CellBFrame*) vf; len=hf->len_; p=hf->bp_; xil_cis_set_attribute(cis_, "WIDTH", (void *)hf->width_); xil_cis_set_attribute(cis_, "HEIGHT", (void *)hf->height_); break; } case FT_H261: { H261Frame* hf = (H261Frame*) vf; len=hf->len_; p=hf->bp_; //Don't accept double zero bytes. xil chokes on that. while ((p[0]==0)&&(p[1]==0)&&len) { p++;len--; } break; } } xil_cis_put_bits(cis_,len,1/*framecount*/,p); if (dofree) delete[] p; //move this to the end, if you use put_bits_ptr //SV-XXX: Debian outputtype = xil_cis_get_output_type(cis_); xil_imagetype_get_info(outputtype, &cis_xsize, &cis_ysize,&cis_nbands, &cis_datatype); if (!imageYCC || (lastcisw!=cis_xsize) || (lastcish!=cis_ysize)) { lastcish = cis_ysize; lastcisw = cis_xsize; //fprintf(stderr," w=%d,h=%d,b=%d,t=%d\n",cis_xsize,cis_ysize,cis_nbands,cis_datatype); if (imageYCC) xil_destroy(imageYCC); if (ximage_) xil_destroy(ximage_); ximage_ = xil_create(xil_,cis_xsize,cis_ysize,cis_nbands,cis_datatype); imageYCC = xil_create(xil_,cis_xsize,cis_ysize,cis_nbands,cis_datatype); } if (visual == PSEUDOCOLOR) { scale[0] = 255.0 / (235.0 - 16.0); scale[1] = 255.0 / (240.0 - 16.0); scale[2] = 255.0 / (240.0 - 16.0); offset[0] = -16.0 * scale[0]; offset[1] = -16.0 * scale[1]; offset[2] = -16.0 * scale[2]; if (!x_cmap) { colorcube = xil_lookup_get_by_name(xil_, "cc855"); dmask = xil_dithermask_get_by_name(xil_, "dm443"); xil_cmap = create_cmap(&x_cmap, FT_JPEG, NULL, xil_lookup_get_by_name(xil_, "yuv_to_rgb"), colorcube ); } /* Begin XIL Molecule... */ xil_decompress( cis_, imageYCC ); xil_rescale(imageYCC, imageYCC, scale, offset); xil_scale(imageYCC,ximage_,"nearest",(1.0*targetw_)/lastcisw,(1.0*targeth_)/lastcish); xil_ordered_dither( ximage_, displayimage_, colorcube, dmask); /* End of XIL Molecule */ } if (visual == TRUECOLOR) { ycc = xil_colorspace_get_by_name(xil_, "ycc601"); rgb = xil_colorspace_get_by_name(xil_, "rgb709"); /* for H261, XIL may drop core on the last frame * to avoid this, only continue as long as 2 or * more frames in the CIS */ /* Begin XIL molecule */ xil_set_attribute(displayimage_,"HW_DECOMPRESS_CIS",(void *)-1); xil_decompress(cis_, imageYCC); if ((targetw_ == lastcisw) && (targeth_ == lastcish)) { xil_set_colorspace(imageYCC, ycc); xil_set_colorspace(displayimage_, rgb); xil_color_convert(imageYCC, displayimage_); } else { xil_set_colorspace(imageYCC, ycc); xil_set_colorspace(ximage_, rgb); xil_color_convert(imageYCC, ximage_); xil_scale(ximage_,displayimage_,"nearest",(1.0*targetw_)/lastcisw,(1.0*targeth_)/lastcish); } /* End of XIL molecule */ } xil_cis_sync(cis_); xil_toss(imageYCC); xil_toss(ximage_); xil_cis_reset(cis_); return (0); }