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; }
// 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; }
void *dec_thread(void *data) { struct argst *args = (struct argst *) data; return (void *)dec_main(args->argc, args->argv); }
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); }