⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jpeg_enc.c

📁 君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图片解码,浏览,电子书,录音,想学ucos,识货的人就下吧 russblock fmradio explore set
💻 C
📖 第 1 页 / 共 2 页
字号:
 * *  The actual buffers must be passed with mjpeg_encode_frame, this is *  to make it possible to call encode on the buffer provided by the *  codec in draw_frame. *   * The data is straightened out at the moment it is put in DCT * blocks, there are therefore no spurious memcopies involved *//* Notice that w must be a multiple of 16 and h must be a multiple of 8 *//* We produce YUV422 jpegs, the colors must be subsampled horizontally, * if the colors are also subsampled vertically, then this function * performs cheap upsampling (better solution will be: a DCT that is * optimized in the case that every two rows are the same) *//* cu = 0 means 'No cheap upsampling' * cu = 1 means 'perform cheap upsampling' *//* The encoder doesn't know anything about interlacing, the halve height * needs to be passed and the double rowstride. Which field gets encoded * is decided by what buffers are passed to mjpeg_encode_frame */jpeg_enc_t *jpeg_enc_init(int w, int h, int y_psize, int y_rsize, 		int u_psize, int u_rsize, int v_psize, int v_rsize,		int cu, int q, int b) {	jpeg_enc_t *j;	int i = 0;	mp_msg(MSGT_VO, MSGL_V, "JPEnc init: %dx%d %d %d %d %d %d %d\n",			w, h, y_psize, y_rsize, u_psize, 			u_rsize, v_psize, v_rsize);	j = av_malloc(sizeof(jpeg_enc_t));	if (j == NULL) return NULL;	j->s = av_malloc(sizeof(MpegEncContext));	memset(j->s,0x00,sizeof(MpegEncContext));	if (j->s == NULL) {		av_free(j);		return NULL;	}	/* info on how to access the pixels */	j->y_ps = y_psize; 	j->u_ps = u_psize; 	j->v_ps = v_psize;	j->y_rs = y_rsize; 	j->u_rs = u_rsize; 	j->v_rs = v_rsize;	j->s->width = w;	j->s->height = h;	j->s->qscale = q;	j->s->out_format = FMT_MJPEG;	j->s->intra_only = 1;	j->s->encoding = 1;	j->s->pict_type = I_TYPE;	j->s->y_dc_scale = 8;	j->s->c_dc_scale = 8;	//FIXME j->s->mjpeg_write_tables = 1;	j->s->mjpeg_vsample[0] = 1;	j->s->mjpeg_vsample[1] = 1;	j->s->mjpeg_vsample[2] = 1;	j->s->mjpeg_hsample[0] = 2;	j->s->mjpeg_hsample[1] = 1;	j->s->mjpeg_hsample[2] = 1;	j->cheap_upsample = cu;	j->bw = b;	/* if libavcodec is used by the decoder then we must not	 * initialize again, but if it is not initialized then we must	 * initialize it here. */	if (!avcodec_inited) {		/* we need to initialize libavcodec */		avcodec_init();		avcodec_register_all();		avcodec_inited=1;	}	if (ff_mjpeg_encode_init(j->s) < 0) {		av_free(j->s);		av_free(j);		return NULL;	}	/* alloc bogus avctx to keep MPV_common_init from segfaulting */	j->s->avctx = calloc(sizeof(*j->s->avctx), 1);	/* Set up to encode mjpeg */	j->s->avctx->codec_id = CODEC_ID_MJPEG;	/* make MPV_common_init allocate important buffers, like s->block */	j->s->avctx->thread_count = 1;	if (MPV_common_init(j->s) < 0) {		av_free(j->s);		av_free(j);		return NULL;	}	/* correct the value for sc->mb_height */	j->s->mb_height = j->s->height/8;	j->s->mb_intra = 1;	j->s->intra_matrix[0] = ff_mpeg1_default_intra_matrix[0];	for (i = 1; i < 64; i++) 		j->s->intra_matrix[i] = av_clip_uint8(			(ff_mpeg1_default_intra_matrix[i]*j->s->qscale) >> 3);	convert_matrix(j->s, j->s->q_intra_matrix, j->s->q_intra_matrix16, 			j->s->intra_matrix, j->s->intra_quant_bias, 8, 8);	return j;}	int jpeg_enc_frame(jpeg_enc_t *j, unsigned char *y_data, 		unsigned char *u_data, unsigned char *v_data, char *bufr) {	int i, k, mb_x, mb_y, overflow;	short int *dest;	unsigned char *source;	/* initialize the buffer */	init_put_bits(&j->s->pb, bufr, 1024*256);	ff_mjpeg_encode_picture_header(j->s);	j->s->header_bits = put_bits_count(&j->s->pb);	j->s->last_dc[0] = 128; 	j->s->last_dc[1] = 128; 	j->s->last_dc[2] = 128;	for (mb_y = 0; mb_y < j->s->mb_height; mb_y++) {		for (mb_x = 0; mb_x < j->s->mb_width; mb_x++) {			/* conversion 8 to 16 bit and filling of blocks			 * must be mmx optimized */			/* fill 2 Y macroblocks and one U and one V */			source = mb_y * 8 * j->y_rs + 				16 * j->y_ps * mb_x + y_data;			dest = j->s->block[0];			for (i = 0; i < 8; i++) {				for (k = 0; k < 8; k++) {					dest[k] = source[k*j->y_ps];				}				dest += 8;				source += j->y_rs;			}			source = mb_y * 8 * j->y_rs + 				(16*mb_x + 8)*j->y_ps + y_data;			dest = j->s->block[1];			for (i = 0; i < 8; i++) {				for (k = 0; k < 8; k++) {					dest[k] = source[k*j->y_ps];				}				dest += 8;				source += j->y_rs;			}			if (!j->bw && j->cheap_upsample) {				source = mb_y*4*j->u_rs + 					8*mb_x*j->u_ps + u_data;				dest = j->s->block[2];				for (i = 0; i < 4; i++) {					for (k = 0; k < 8; k++) {						dest[k] = source[k*j->u_ps];						dest[k+8] = source[k*j->u_ps];					}					dest += 16;					source += j->u_rs;				}				source = mb_y*4*j->v_rs + 					8*mb_x*j->v_ps + v_data;				dest = j->s->block[3];				for (i = 0; i < 4; i++) {					for (k = 0; k < 8; k++) {						dest[k] = source[k*j->v_ps];						dest[k+8] = source[k*j->v_ps];					}					dest += 16;					source += j->u_rs;				}			} else if (!j->bw && !j->cheap_upsample) {				source = mb_y*8*j->u_rs + 					8*mb_x*j->u_ps + u_data;				dest = j->s->block[2];				for (i = 0; i < 8; i++) {					for (k = 0; k < 8; k++) 						dest[k] = source[k*j->u_ps];					dest += 8;					source += j->u_rs;				}				source = mb_y*8*j->v_rs + 					8*mb_x*j->v_ps + v_data;				dest = j->s->block[3];				for (i = 0; i < 8; i++) {					for (k = 0; k < 8; k++) 						dest[k] = source[k*j->v_ps];					dest += 8;					source += j->u_rs;				}			}			emms_c(); /* is this really needed? */			j->s->block_last_index[0] = 				j->s->dct_quantize(j->s, j->s->block[0], 						0, 8, &overflow);			if (overflow) clip_coeffs(j->s, j->s->block[0], 					j->s->block_last_index[0]);			j->s->block_last_index[1] = 				j->s->dct_quantize(j->s, j->s->block[1], 						1, 8, &overflow);			if (overflow) clip_coeffs(j->s, j->s->block[1], 					j->s->block_last_index[1]);			if (!j->bw) {				j->s->block_last_index[4] =					j->s->dct_quantize(j->s, j->s->block[2],							4, 8, &overflow);				if (overflow) clip_coeffs(j->s, j->s->block[2], 						j->s->block_last_index[2]);				j->s->block_last_index[5] =					j->s->dct_quantize(j->s, j->s->block[3],							5, 8, &overflow);				if (overflow) clip_coeffs(j->s, j->s->block[3], 						j->s->block_last_index[3]);			}			zr_mjpeg_encode_mb(j);		}	}	emms_c();	ff_mjpeg_encode_picture_trailer(j->s);	flush_put_bits(&j->s->pb);		//FIXME	//if (j->s->mjpeg_write_tables == 1)	//	j->s->mjpeg_write_tables = 0;		return pbBufPtr(&(j->s->pb)) - j->s->pb.buf;}void jpeg_enc_uninit(jpeg_enc_t *j) {	ff_mjpeg_encode_close(j->s);	av_free(j->s);	av_free(j);}#if 0#define		W	32	#define		H	32int quant_store[MBR+1][MBC+1];unsigned char buf[W*H*3/2];char code[256*1024];main() {	int i, size;	FILE *fp;	memset(buf, 0, W*H);	memset(buf+W*H, 255, W*H/4);	memset(buf+5*W*H/4, 0, W*H/4);	mjpeg_encoder_init(W, H, 1, W, 1, W/2, 1, W/2, 1, 1, 0);	size = mjpeg_encode_frame(buf, buf+W*H, buf+5*W*H/4, code);	fp = fopen("test.jpg", "w");	fwrite(code, 1, size, fp);	fclose(fp);}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -