1. 程式人生 > >基於ZedBoard的Webcam設計(四):MJPG編碼和AVI封裝

基於ZedBoard的Webcam設計(四):MJPG編碼和AVI封裝

1 void Widget::paintEvent(QPaintEvent *) 2 { 3 rs = vd->get_frame(&yuv_buffer_pointer,&len); 4 5 if(last_state==2 && state == 0) 6 { 7 //write hdrl 8 hdrl.avih.width =640;// (width); 9 hdrl.avih.height = 480;//(height); 10 hdrl.strl.strf.width = 640
;//(width); 11 hdrl.strl.strf.height = 480;//(height); 12 hdrl.strl.strf.image_sz = 640*480*3;//(width * height * 3); 13 14 15 sizeofhdrl=sizeof(hdrl); 16 17 mjpgfile->avi_jpeg_stream = fopen(avifilename, "wb"); 18 19 fputc('R', mjpgfile->avi_jpeg_stream); 20 fputc('
I', mjpgfile->avi_jpeg_stream); 21 fputc('F', mjpgfile->avi_jpeg_stream); 22 fputc('F', mjpgfile->avi_jpeg_stream); 23 print_quartet(0/*riff_sz*/);//riff file size 24 fputc('A', mjpgfile->avi_jpeg_stream); 25 fputc('V', mjpgfile->avi_jpeg_stream); 26
fputc('I', mjpgfile->avi_jpeg_stream); 27 fputc(' ', mjpgfile->avi_jpeg_stream); 28 29 fwrite(&hdrl, sizeofhdrl, 1, mjpgfile->avi_jpeg_stream);// write head 30 31 fputc('L', mjpgfile->avi_jpeg_stream); 32 fputc('I', mjpgfile->avi_jpeg_stream); 33 fputc('S', mjpgfile->avi_jpeg_stream); 34 fputc('T', mjpgfile->avi_jpeg_stream); 35 36 print_quartet(0/*jpg_sz + 8*TOTALFRAMES + 4*/);// size again 37 fputc('m', mjpgfile->avi_jpeg_stream); 38 fputc('o', mjpgfile->avi_jpeg_stream); 39 fputc('v', mjpgfile->avi_jpeg_stream); 40 fputc('i', mjpgfile->avi_jpeg_stream); 41 42 avifilename[5]++; 43 } 44 45 if(state==1) 46 { 47 framecnt++; 48 fputc('0', mjpgfile->avi_jpeg_stream); 49 fputc('0', mjpgfile->avi_jpeg_stream); 50 fputc('d', mjpgfile->avi_jpeg_stream); 51 fputc('c', mjpgfile->avi_jpeg_stream); 52 print_quartet(0); 53 54 mjpgfile->jpeg_encode(&yuv_buffer_pointer); 55 56 //printf("%ld\n",mjpgfile->jpgsize); 57 58 fseek(mjpgfile->avi_jpeg_stream,-4-(long)mjpgfile->jpgsize,SEEK_CUR); 59 print_quartet(mjpgfile->jpgsize); 60 61 fseek(mjpgfile->avi_jpeg_stream,6,SEEK_CUR); 62 fwrite("AVI1",4, 1, mjpgfile->avi_jpeg_stream); 63 64 fseek(mjpgfile->avi_jpeg_stream,mjpgfile->jpgsize-10,SEEK_CUR); 65 66 67 } 68 if(last_state==1 && state==2) 69 { 70 71 fseek(mjpgfile->avi_jpeg_stream,4,SEEK_SET); 72 print_quartet(mjpgfile->movisize+sizeofhdrl);//riff file size 73 fseek(mjpgfile->avi_jpeg_stream,4,SEEK_CUR); 74 75 //overwrite hdrl 76 hdrl.avih.us_per_frame = 1000000/12;//(per_usec); 77 hdrl.avih.max_bytes_per_sec = mjpgfile->movisize*12/framecnt; 78 hdrl.avih.tot_frames = framecnt; 79 hdrl.strl.list_odml.frames =framecnt;// (TOTALFRAMES); 80 hdrl.strl.strh.scale = 1;// 81 hdrl.strl.strh.length =10;// 82 hdrl.strl.strh.rate = 12; 83 84 fwrite(&hdrl, sizeofhdrl, 1, mjpgfile->avi_jpeg_stream);// write head 85 fseek(mjpgfile->avi_jpeg_stream,4,SEEK_CUR); 86 87 print_quartet(mjpgfile->movisize);// size again 88 fclose(mjpgfile->avi_jpeg_stream); 89 } 90 last_state=state; 91 92 convert_yuv_to_rgb_buffer(); 93 94 frame->loadFromData(rgb_buffer,640 * 480 * 3); 95 ui->label->setPixmap(QPixmap::fromImage(*frame,Qt::AutoColor)); 96 97 98 rs = vd->unget_frame(); 99 }