JPG and AVI Synthesis

Source: Internet
Author: User

LList. h file:

# Ifndef _ llist_h _ <br/> # DEFINE _ llist_h _ <br/> typedef struct _ list; <br/> struct _ list <br/> {<br/> void * data; <br/> list * Next; <br/> list * Prev; <br/>}; <br/> list * list_erase (list * l); <br/> list * list_erased (list * l ); <br/> void list_rerase (list * l); <br/> void list_rerased (list * l); <br/> void list_insert (list * l, void * data ); <br/> list * list_push_front (list * l, void * data); <br/> list * list_push_back (list * l, void * data ); <br/> void list_pop_front (list * l); <br/> void list_pop_back (list * l); <br/> void list_popd_front (list * l ); <br/> void list_popd_back (list * l); <br/> list * list_front (list * l); <br/> list * list_back (list * l ); <br/> void list_remove (list * l, void * data); <br/> list * list_find (list * l, void * data ); <br/> list * list_nth (list * l, unsigned int N); <br/> unsigned int list_size (list * l); <br/> # endif <br/> 

LList. c file:

# Include "lList. H "<br/> # include <stdlib. h> <br/> list * list_erase (list * l) <br/> {<br/> list * Next = L-> next; <br/> If (L-> PREV) <br/> L-> Prev-> next = next; <br/> If (next) <br/> L-> next-> Prev = L-> Prev; <br/> free (l); <br/> return next; <br/>}< br/> list * list_erased (list * l) <br/>{< br/> If (L-> data) <br/>{< br/> free (L-> data); <br/> L-> DATA = 0; <br/>}< br/> return list_erase (l); <br/>}< br/> void list_reras E (list * l) <br/>{< br/> If (L-> next) <br/> list_rerase (L-> next ); <br/> L-> next = 0; <br/> free (l); <br/>}< br/> void list_rerased (list * l) <br/>{< br/> If (L-> next) <br/> list_rerased (L-> next); <br/> L-> next = 0; <br/> If (L-> data) <br/>{< br/> free (L-> data); <br/> L-> DATA = 0; <br/>}< br/> free (l); <br/>}< br/> void list_insert (list * l, void * Data) <br/>{< br/> list * Next = (list *) malloc (sizeof (list); <br/> Next-> DATA = L-> data; <br/> next-> next = L-> next; <br/> next-> Prev = L; <br/> L-> DATA = data; <br/> L-> next = next; <br/>}< br/> list * list_push_front (list * l, void * Data) <br/>{< br/> L = list_front (l); <br/> L-> Prev = (list *) malloc (sizeof (list); <br/> L-> Prev-> DATA = data; <br/> L-> Prev-> next = L; <br/> L-> Prev = 0; <br/> return l-> Prev; <br/>}< br/> list * list_push_back (list * l, void * Data) <br/> {<Br/> L = list_back (l); <br/> L-> next = (list *) malloc (sizeof (list )); <br/> L-> next-> DATA = data; <br/> L-> next = 0; <br/> L-> next-> Prev = L; <br/> return l-> next; <br/>}< br/> void list_pop_front (list * l) <br/>{< br/> list_erase (list_front (l); <br/>}< br/> void list_pop_back (list * l) <br/>{< br/> list_erase (list_back (l); <br/>}< br/> void list_popd_front (list * l) <br/> {<br/> list_erased (list_front (L); <br/>}< br/> void list_popd_back (list * l) <br/>{< br/> list_erased (list_back (l )); <br/>}< br/> list * list_front (list * l) <br/>{< br/> while (L-> PREV) <br/> L = L-> Prev; <br/> return l; <br/>}< br/> list * list_back (list * l) <br/>{< br/> while (L-> next) <br/> L = L-> next; <br/> return l; <br/>}< br/> void list_remove (list * l, void * Data) <br/>{< br/> list * L2; <br/> while (L2 = list_find (L, data) <br/> L = List_erase (L2); <br/>}< br/> list * list_find (list * l, void * Data) <br/>{< br/> while (L & (L-> data! = Data) <br/> L = L-> next; <br/> return l; <br/>}< br/> list * list_nth (list * l, unsigned int N) <br/>{< br/> unsigned int I; <br/> for (I = 0; (I <n) & (L ); + + I, L = L-> next); <br/> return l; <br/>}< br/> unsigned int list_size (list * l) <br/>{< br/> int I; <br/> for (I = 0; (l); ++ I, L = L-> next ); <br/> return I; <br/>}< br/> 

Avifmt. h file:

# Ifndef _ avifmt_h _ <br/> # DEFINE _ avifmt_h _ <br/> # define swap2 (x) (x> 8) & 0x00ff) | (x <8) & 0xff00) <br/> # define swap4 (x) (x> 24) & 0x000000ff) | (x> 8) & 0x0000ff00) | (x <8) & 0x00ff0000) | (x <24) & 0xff000000 )) <br/> # define lilend2 (a) <br/> # define lilend4 (a) <br/> # define bigend2 () swap2 (a) <br/> # define bigend4 (a) swap4 (a) <br/> typedef int word; <br/> typedef unsigned int DWORD; <br/> typedef char byte; <br/> const DWORD avif_hasindex = 0x00000010; <br/> const DWORD avif_mustuseindex = 0x00000020; <br/> const DWORD avif_isinterleaved = 0x00000100; <br/> const DWORD avif_trustcktype = 0x00000800; <br/> const DWORD avif_wascapturefile = 0x00010000; <br/> const DWORD avif_copyrighted = 0x00020000; <br/> struct avi_avih <br/>{< br/> DWORD us_per_frame; <br/> DWORD max_bytes_per_sec; <br/> DWORD padding; <br/> DWORD flags; <br/> DWORD tot_frames; <br/> DWORD init_frames; <br/> DWORD streams; <br/> DWORD buff_sz; <br/> DWORD width; <br/> DWORD height; <br/> DWORD reserved [4]; <br/> }; <br/> struct rcframe <br/> {<br/> short int left; <br/> short int top; <br/> short int right; <br/> short int bottom; <br/>}; <br/> struct avi_strh <br/>{< br/> unsigned char type [4]; <br/> unsigned char handler [4]; <br/> DWORD flags; <br/> DWORD priority; <br/> DWORD init_frames; <br/> DWORD scale; <br/> DWORD rate; <br/> DWORD start; <br/> DWORD length; <br/> DWORD buff_sz; <br/> DWORD quality; <br/> DWORD sample_sz; <br/> struct rcframe RC; <br/> }; </P> <p> ///////////////////////////////// //////////////////////////////////////// /<br/> struct avi_strf <br/>{< br/> dword sz; <br/> DWORD width; <br/> DWORD height; <br/> DWORD planes_bit_cnt; <br/> unsigned char compression [4]; <br/> DWORD image_sz; <br/> DWORD xpels_meter; <br/> DWORD ypels_meter; <br/> DWORD num_colors; <br/> DWORD imp_colors; <br/> }; <br/> struct avi_list_hdr <br/>{< br/> unsigned char ID [4]; <br/> dword sz; <br/> unsigned char type [4]; <br/>}; <br/> struct avi_list_odml <br/>{< br/> struct avi_list_hdr list_hdr; <br/> unsigned char ID [4]; <br/> dword sz; <br/> DWORD frames; <br/>}; <br/> struct avi_list_strl <br/>{< br/> struct avi_list_hdr list_hdr; <br/> unsigned char strh_id [4]; <br/> DWORD strh_sz; <br/> struct avi_strh strh; <br/> unsigned char strf_id [4]; <br/> DWORD strf_sz; <br/> struct avi_strf STRF; <br/> struct avi_list_odml list_odml; <br/> }; <br/> struct avi_list_hdrl <br/> {<br/> struct avi_list_hdr list_hdr; <br/> unsigned char avih_id [4]; <br/> DWORD avih_sz; <br/> struct avi_avih avih; <br/> struct avi_list_strl strl; <br/>}; <br/> # endif <br/> 

Export toavi. c file:

# Define version_maj 1 <br/> # define version_min 0 <br/> # include <stdio. h> <br/> # include "avifmt. H "<br/> # include <string. h> <br/> # include <sys/STAT. h> <br/> # include <fcntl. h> <br/> # include <stdlib. h> <br/> # include <Io. h> <br/> # include "lList. H "<br/> typedef struct _ jpeg_data 1__data; <br/> typedef unsigned long off64_t; <br/> struct _ jpeg_data <br/>{< br/> DWORD size; <br/> DWORD offset; <br/> char Nam E [0]; <br/>}; <br/> # define pai_data_sz (sizeof (DWORD) * 2) <br/> # define path_max255 <br/> off_t file_sz (char * fN) <br/>{< br/> struct stat S; <br/> If (STAT (FN, & S) =-1) <br/> return-1; <br/> return S. st_size; <br/>}< br/> off_t get_file_sz (list * l) <br/>{< br/> off_t TMP, ret = 0; <br/> for (; (l); L = L-> next) <br/> {<br/> If (TMP = file_sz (jpeg_data *) l-> data)-> name) =-1) <br/> return-1; <br/> (J Peg_data *) L-> data)-> size = (DWORD) TMP; <br/> TMP + = (4-(TMP % 4) % 4 ); <br/> RET + = TMP; <br/>}< br/> return ret; <br/>}< br/> list * get_file_list_argv (INT argc, char ** argv) <br/>{< br/> list * ret = (list *) malloc (sizeof (list), * l = ret; <br/> pai_data * TMP; <br/> int I; <br/> ret-> DATA = 0; <br/> ret-> Prev = 0; <br/> ret-> next = 0; <br/> for (I = 0; I <argc; ++ I) <br/> {<br/> TMP = (pai_data *) mallo C (strlen (argv [I]) + 1 + jpeg_data_sz); <br/> strcpy (TMP-> name, argv [I]); <br/> If (L-> DATA = 0) <br/> L-> DATA = TMP; <br/> else <br/> L = list_push_back (L, TMP); <br/>}< br/> return ret; <br/>}< br/> void print_quartet (unsigned int I, file * out) <br/>{< br/> putc (I % 0x100, out); <br/> I/= 0x100; <br/> putc (I % 0x100, out); <br/> I/= 0x100; <br/> putc (I % 0x100, out); <br/> I/= 0x100; <br/> putc (I % 0x100, O Ut); <br/>}< br/> int main () <br/> {<br/> file * out; <br/> char tempstr [255]; <br/> DWORD per_usec = 1; <br/> DWORD width = 1; <br/> DWORD Height = 1; <br/> DWORD frames = 1; <br/> unsigned int FPS; <br/> unsigned short img0; <br/> off64_t jpg_sz_64, riff_sz_64; <br/> long jpg_sz = 1; <br/> const off64_t max_riff_sz = 2147483648l; // 2 GB limit <br/> DWORD riff_sz; </P> <p> int FD; <br/> long NBR, NBW, tnbw = 0; <B R/> char buff [512]; <br/> off_t mfsz, remnant; <br/> list * frlst = 0, * f = 0; </P> <p> int I; <br/> char * Fold = "E: // image // background image //"; <br/> int imgnum; <br/> char ** imgname; <br/> struct avi_list_hdrl hdrl = <br/>{< br/> {'l', 'I ', 'S ', 't'}, <br/> lilend4 (sizeof (struct avi_list_hdrl)-8), <br/> {'h', 'D ', 'R', 'L'} <br/>}, <br/> {'A', 'V', 'I', 'H '}, <br/> lilend4 (sizeof (struct avi_avih), <br/>{< br/> lile Nd4 (per_usec), <br/> lilend4 (1000000 * (jpg_sz/frames)/per_usec), <br/> lilend4 (0), <br/> lilend4 (avif_hasindex ), <br/> lilend4 (frames), <br/> lilend4 (0), <br/> lilend4 (1), <br/> lilend4 (0 ), <br/> lilend4 (width), <br/> lilend4 (height), <br/> {lilend4 (0), lilend4 (0), lilend4 (0 ), lilend4 (0) }< br/>}, <br/>{< br/> {'l', 'I','s ', 'T'}, <br/> lilend4 (sizeof (struct avi_list_strl)-8), <br/> {'s ', 't', 'R ', 'L'} <br/>}, <br/> {'s ', 't', 'R', 'H '}, <br/> lilend4 (sizeof (struct avi_strh), <br/>{< br/> {'V', 'I', 'D','s '}, <br/> {'M', 'J', 'P', 'G'}, <br/> lilend4 (0), <br/> lilend4 (0 ), <br/> lilend4 (0), <br/> lilend4 (per_usec), <br/> lilend4 (1000000), <br/> lilend4 (0 ), <br/> lilend4 (frames), <br/> lilend4 (0), <br/> lilend4 (0), <br/> lilend4 (0 ), <br/> lilend2 (0), <br/> lilend2 (0), <br/> lilend2 (160), <br/> lilend2 (120) <BR/>}, <br/> {'s ', 't', 'R', 'F'}, <br/> sizeof (struct avi_strf ), <br/>{< br/> lilend4 (sizeof (struct avi_strf), <br/> lilend4 (width), <br/> lilend4 (height ), <br/> lilend4 (1 + (24 <16), <br/> {'M', 'J', 'P', 'G '}, <br/> lilend4 (width * height * 3), <br/> lilend4 (0), <br/> lilend4 (0), <br/> lilend4 (0 ), <br/> lilend4 (0) <br/>}, <br/>{< br/> {'l', 'I ', 'S ', 't'}, <br/> lilend4 (16), <br/> {'O', 'D', 'M', 'l '} <Br/>}, <br/> {'D', 'M', 'l', 'H'}, <br/> lilend4 (4 ), <br/> lilend4 (frames) <br/>}< br/>}; // end of ldrl </P> <p> imgnum = 70; <br/> imgname = (char **) malloc (imgnum) * sizeof (char *); <br/> for (I = 0; I imgname [I] = (char *) malloc (sizeof (char) * 50); <br/> sprintf (imgname [I], "%s000003d.jpg", fold, (I + 1); <br/>}</P> <p> frlst = get_file_list_argv (imgnum, imgname ); </P> <p> frames = list_size (fr LST); </P> <p> jpg_sz_64 = get_file_sz (frlst); </P> <p> If (jpg_sz_64 =-1) <br/>{< br/> fprintf (stderr, "couldn't determine size of images/N"); <br/> return-2; <br/>}</P> <p> riff_sz_64 = sizeof (struct avi_list_hdrl) + 4 + 4 + jpg_sz_64 + 8 * frames + 8 + 8 + 16 * frames; <br/> If (riff_sz_64> = max_riff_sz) <br/>{< br/> fprintf (stderr, "riff wowould exceed 2 GB limit/N "); <br/> return-3; <br/>}</P> <p> jpg_sz = (L ONG) jpg_sz_64; <br/> riff_sz = (DWORD) riff_sz_64; <br/> If (img0 = 2) <br/>{< br/> printf ("% lu/N", (unsigned long) riff_sz + 8ul); <br/> return 0; <br/>}< br/> out = fopen ("test. avi "," WB "); <br/> putc ('R', out); <br/> putc ('I', out ); <br/> putc ('F', out); <br/> putc ('F', out); <br/> print_quartet (riff_sz, out ); <br/> putc ('A', out); <br/> putc ('V', out); <br/> putc ('I', out ); <br/> putc ('', out); </P> <p> HDR L. avih. us_per_frame = lilend4 (per_usec); <br/> hdrl. avih. max_bytes_per_sec = lilend4 (1000000 * (jpg_sz/frames)/per_usec); <br/> hdrl. avih. tot_frames = lilend4 (frames); <br/> hdrl. avih. width = lilend4 (width); <br/> hdrl. avih. height = lilend4 (height); <br/> hdrl. strl. strh. scale = lilend4 (per_usec); <br/> hdrl. strl. strh. rate = lilend4 (1000000); <br/> hdrl. strl. strh. length = lilend4 (frames); <br/> hdrl. strl. STRF. width = lilend4 (width); <br/> hdrl. strl. STRF. height = lilend4 (height); <br/> hdrl. strl. STRF. image_sz = lilend4 (width * height * 3); <br/> hdrl. strl. list_odml.frames = lilend4 (frames); <br/> fwrite (& hdrl, sizeof (hdrl), 1, out); </P> <p> putc ('l ', out); <br/> putc ('I', out); <br/> putc ('s', out); <br/> putc ('T ', out); <br/> print_quartet (jpg_sz + 8 * frames + 4, out); <br/> putc ('M', out ); <br/> putc ('O', ou T); <br/> putc ('V', out); <br/> putc ('I', out ); </P> <p> for (F = frlst; (f); F = f-> next) <br/>{< br/> putc ('0 ', out); <br/> putc ('0', out); <br/> putc ('D', out); <br/> putc ('C ', out); <br/> mfsz = (jpeg_data *) F-> data)-> size; <br/> remnant = (4-(mfsz % 4 )) % 4; <br/> print_quartet (mfsz + remnant, out); <br/> (jpeg_data *) F-> data)-> size + = remnant; <br/> If (F = frlst) <br/> (jpeg_data *) F-> data)-> offset = 4; <br/> else <br/> (jpeg_data *) F-> data)-> offset = (jpeg_data *) F-> Prev-> data) -> Offset + (jpeg_data *) F-> Prev-> data)-> size + 8; <br/> strcpy (tempstr, (jpeg_data *) f-> data)-> name); <br/> If (FD = _ open (tempstr, o_rdonly | o_binary) <0) <br/>{< br/> fprintf (stderr, "couldn't open file! /N "); <br/> return-6; <br/>}< br/> NBW = 0; <br/> If (NBR = _ read (FD, buff, 6 ))! = 6) <br/>{< br/> fprintf (stderr, "error/N"); <br/> return-7; <br/>}< br/> fwrite (buff, NBR, 1, out); <br/> _ read (FD, buff, 4 ); <br/> fwrite ("avi1", 4, 1, out); <br/> NBW = 10; <br/> while (NBR = _ read (FD, buff, 512)> 0) <br/>{< br/> fwrite (buff, NBR, 1, out); <br/> NBW + = NBR; <br/>}< br/> If (remnant> 0) <br/>{< br/> fwrite (buff, remnant, 1, out ); <br/> NBW + = remnant; <br/>}< br/> tnbw + = NBW; <br/> _ clo Se (FD); <br/>}< br/> If (tnbw! = Jpg_sz) <br/>{< br/> fprintf (stderr, "error writing images (wrote % LD bytes, expected % LD bytes)/n", tnbw, jpg_sz ); <br/> return-8; <br/>}</P> <p> putc ('I', out); <br/> putc ('D ', out); <br/> putc ('x', out); <br/> putc ('1', out); <br/> print_quartet (16 * frames, out); <br/> for (F = frlst; (f); F = f-> next) <br/>{< br/> putc ('0 ', out); <br/> putc ('0', out); <br/> putc ('D', out); <br/> putc ('C ', out); <br/> print_quartet (18, out); <br/> print_quartet (jpeg_data *) F-> data)-> offset, out ); <br/> print_quartet (jpeg_data *) F-> data)-> size, out); <br/>}< br/> fclose (out ); <br/> return 0; <br/>} 

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.