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/>}