基於ZedBoard的Webcam設計(四):MJPG編碼和AVI封裝
阿新 • • 發佈:2019-02-07
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 }