Exemplo n.º 1
0
int XviDDec::DecodeXviD(BYTE *inmemory, int inmemsize,
				int *rest, BYTE *outmemory,DWORD pitch)
{
	int used_bytes = 0;
	xvid_dec_stats_t xvid_dec_stats;

	if(bInit){
		mp4_buffer = inmemory;
		useful_bytes = inmemsize;
		mp4_ptr = mp4_buffer;
		bInit = FALSE;
	}
	out_buffer = outmemory;
	if(bContinue){
		useful_bytes += inmemsize;
		bContinue = FALSE;
	}
	if(FALSE==bFlash){
		do{
			/* Decode frame */
			used_bytes = dec_main(mp4_ptr, out_buffer, useful_bytes, &xvid_dec_stats,pitch);
			/* Update buffer pointers */
			if(used_bytes > 0) {
				mp4_ptr += used_bytes;
				useful_bytes -= used_bytes;
				/* Total size */
				totalsize += used_bytes;
			}
		}while((xvid_dec_stats.type<XVID_TYPE_IVOP || xvid_dec_stats.type>XVID_TYPE_BVOP) && useful_bytes>0);

		if(useful_bytes<=0)
			bFlash = TRUE;
	}else{
        do {
		    used_bytes = dec_main(NULL, out_buffer, -1, &xvid_dec_stats,pitch);
        }while(used_bytes>=0 && xvid_dec_stats.type <= 0);
		if (used_bytes < 0){
			bFlash = FALSE;
			return XviD_DEC_END;
		}
	}
	filenr++;
	if (mp4_ptr > mp4_buffer + buffer_size*3/4) {
		*rest = (mp4_buffer + buffer_size - mp4_ptr);

		// Move data if needed
		if (*rest > 0)
			memcpy(mp4_buffer, mp4_ptr, *rest);

		// Update mp4_ptr
		mp4_ptr = mp4_buffer;
		bContinue = TRUE;
		return XviD_DEC_NEEDMORE;
	}
	return XviD_DEC_CONTINUE;
}
Exemplo n.º 2
0
// Function name	: PASCAL VideoCallbackProc
// Description	    : Encode the captured frame
// Return type		: LRESULT FAR 
// Argument         : HWND hWnd
// Argument         : LPVIDEOHDR lpVHdr
LRESULT FAR PASCAL VideoCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr)
{
	unsigned char *bufi, *buf;
	int type=0;
	int quant=0;
	int declen=0;
	int enclen=0;
	bufi = new unsigned char[lpVHdr->dwBytesUsed+40];	//original image
	buf = new unsigned char[lpVHdr->dwBytesUsed];		//coded stream

	memcpy((void *)(bufi), lpVHdr->lpData, lpVHdr->dwBytesUsed);
	
	unsigned char *buf1;
	buf1 = buf;
	

	if (m_vfwState==ENCDEC) {
   //Encode
		buf1 = (unsigned char*)ICSeqCompressFrame(&pc,0,bufi, &IsKeyFrame,&FrameSize);
		//enc_main(bufi, buf, (int *)&FrameSize, &IsKeyFrame, -1);
		////////////////////////////////
		if (bSaveAVI){
			AVIStreamSetFormat(pMainFrame->ps,pMainFrame->m_Frame++,lpbiTmp,sizeof(BITMAPINFO));
			AVIStreamWrite(pMainFrame->ps,pMainFrame->m_Frame, 1, (LPBYTE)buf1,
						 lpbiTmp->bmiHeader.biSizeImage,AVIIF_KEYFRAME,NULL,NULL);
		}
		////////////////////////////////
   //Decode
		ICDecompress(hic2,0,&lpbiTmp->bmiHeader,buf1,&lpbiOut->bmiHeader,&bufo[40]);
	} else {
		enc_main(bufi,buf, &IsKeyFrame,&type,&quant,&enclen);
		declen = dec_main(buf, bufi, enclen,lpbiIn->bmiHeader.biWidth);
		pMainFrame->conv.YV12_to_RGB24(bufi,
									   bufi+(lpbiIn->bmiHeader.biWidth*lpbiIn->bmiHeader.biHeight),
									   bufi+(lpbiIn->bmiHeader.biWidth*lpbiIn->bmiHeader.biHeight*5/4),
									   &bufo[40],
									   lpbiIn->bmiHeader.biWidth,
									   lpbiIn->bmiHeader.biHeight);
	}

	pMainFrame->GetActiveView()->InvalidateRect(NULL,FALSE);											

	delete bufi;
	delete buf;

	return (LRESULT) TRUE;
}
Exemplo n.º 3
0
void *dec_thread(void *data)
{
	struct argst *args = (struct argst *) data;

	return (void *)dec_main(args->argc, args->argv);
}
Exemplo n.º 4
0
void main(void)
{
	const char *outrecfilename = "F:\\╡Бйтнд╪Ч\\test3.yuv";
	const char *filename = "F:\\╡Бйтнд╪Ч\\test.m4v";
	int frame, size, got_picture;
	FILE *fin, *fout;
	uint8_t inbuf[INBUF_SIZE ], *inbuf_ptr;
	int v_YuvInfo[5];
	int32 used_bytes;
	xvid_dec_stats_t xvid_dec_stats;
	char *pZoom;
	int i;
	int h;

	
	fin = fopen(filename, "rb");
	if (!fin)
	{
		fprintf(stderr, "could not open %s\n", filename);
		exit(1);
	}
	
	fout = fopen(outrecfilename, "wb");
	if (!fin) 
	{
		fprintf(stderr, "could not open %s\n", outrecfilename);
		exit(1);
	}

	dec_init(0, 0);

	size=0;
	used_bytes=0;
	i=0;
	while (1)
	{
		size += fread(inbuf+size, 1, INBUF_SIZE-size, fin);
	
		inbuf_ptr = inbuf;
		used_bytes=dec_main(inbuf_ptr,   
			v_YuvInfo, 
			size, &xvid_dec_stats, pZoom,
			0);
		if(used_bytes>0 && xvid_dec_stats.type>0)
		{
			for(h=0;h< YDIM;h++)
				fwrite(v_YuvInfo[0]+v_YuvInfo[3]*h, 1, XDIM, fout );
			for(h=0;h<YDIM/2;h++)
				fwrite(v_YuvInfo[1]+v_YuvInfo[3]*h/2, 1, XDIM/2, fout );
			for(h=0;h<YDIM/2;h++)
				fwrite(v_YuvInfo[2]+v_YuvInfo[3]*h/2, 1, XDIM/2, fout );
		}

		if(used_bytes>0)
		{
			size -= used_bytes;
			inbuf_ptr += used_bytes;
			memmove(inbuf, inbuf_ptr, size);
		}

		i++;
		if(i>500)break;
	}

	dec_stop();
	fclose(fin);
	fclose(fout);

}