Changeset 3736

Show
Ignore:
Timestamp:
01/22/07 07:39:01 (2 years ago)
Author:
hverkuil
Message:

ivtvrec and ps-analyzer improvements.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • ivtvtv/trunk/ivtvrec.cpp

    r3714 r3736  
    3333{ 
    3434        switch (ch) { 
     35        case 'p': 
     36                ioctl(fh, IVTV_IOC_PAUSE_ENCODE, 0); 
     37                break; 
     38        case 'r': 
     39                ioctl(fh, IVTV_IOC_RESUME_ENCODE, 0); 
     40                break; 
    3541        } 
    3642} 
     
    4551        int fin, fout, fidx; 
    4652        struct ivtv_index idx; 
     53        int quit = 0; 
    4754 
    4855        if (argc < 3) { 
     
    6976        time_t t1, t2; 
    7077        int sz; 
     78        fd_set fd_in; 
     79        int gop = 1; 
    7180 
    7281        t1 = time(NULL) - 1; 
    73         while ((sz=read(fin, buf, sizeof(buf))) > 0) { 
    74                 write(fout, buf, sz); 
    75                 t2 = time(NULL); 
    76                 if (t1 != t2) { 
    77                         t1 = t2; 
    78                         ioctl(fin, IVTV_IOC_G_INDEX, &idx); 
    79                         printf("entries %d\n", idx.entries); 
    80                         for (unsigned i = 0; i < idx.entries; i++) { 
    81                                 if (idx.entry[i].flags != IVTV_IDX_FL_I) 
    82                                         continue; 
    83                                 stamps s; 
    84                                 s.offset = idx.entry[i].offset; 
    85                                 s.pts = idx.entry[i].pts; 
    86                                 write(fidx, &s, sizeof(s)); 
     82        ioctl(fin, IVTV_IOC_S_GOP_END, &gop); 
     83 
     84        read(fin, buf, 0);  // kickstart the recording 
     85        ioctl(fin, IVTV_IOC_RESUME_ENCODE, 0); 
     86        while (!quit) { 
     87                FD_ZERO(&fd_in); 
     88                FD_SET(0, &fd_in); 
     89                FD_SET(fin, &fd_in); 
     90                int res = select(fin + 1, &fd_in, NULL, NULL, NULL); 
     91 
     92                if (res < 0) 
     93                        break; 
     94                if (FD_ISSET(0, &fd_in)) { 
     95                        char ch; 
     96                        while (read(0, &ch, 1) > 0) { 
     97                                if (ch == '\n') 
     98                                        break; 
     99                                if (ch == 'q') { 
     100//                                      quit = 1; 
     101                                        ioctl(fin, VIDIOC_STREAMOFF, &gop); 
     102                                } 
     103                                process(fin, ch); 
    87104                        } 
    88                         fflush(stdout); 
    89105                } 
     106                if (!FD_ISSET(fin, &fd_in)) 
     107                        continue; 
     108                if ((sz=read(fin, buf, sizeof(buf))) > 0) { 
     109                        write(fout, buf, sz); 
     110                        t2 = time(NULL); 
     111                        if (t1 != t2) { 
     112                                t1 = t2; 
     113                                ioctl(fin, IVTV_IOC_G_INDEX, &idx); 
     114                                for (unsigned i = 0; i < idx.entries; i++) { 
     115                printf("%d %lld %d\n", idx.entry[i].flags, idx.entry[i].offset, idx.entry[i].length); 
     116                                        if (idx.entry[i].flags != IVTV_IDX_FL_I) 
     117                                                continue; 
     118                                        stamps s; 
     119                                        s.offset = idx.entry[i].offset; 
     120                                        s.pts = idx.entry[i].pts; 
     121                                        write(fidx, &s, sizeof(s)); 
     122                                } 
     123                                fflush(stdout); 
     124                        } 
     125                } 
     126                if (sz == 0) 
     127                        break; 
     128        } 
     129        ioctl(fin, IVTV_IOC_G_INDEX, &idx); 
     130        for (unsigned i = 0; i < idx.entries; i++) { 
     131                printf("%d %lld %d\n", idx.entry[i].flags, idx.entry[i].offset, idx.entry[i].length); 
     132                if (idx.entry[i].flags != IVTV_IDX_FL_I) 
     133                        continue; 
     134                stamps s; 
     135                s.offset = idx.entry[i].offset; 
     136                s.pts = idx.entry[i].pts; 
     137                write(fidx, &s, sizeof(s)); 
    90138        } 
    91139        return 0; 
  • ivtvtv/trunk/ps-analyzer.cpp

    r3711 r3736  
    5757} 
    5858 
    59 static void psread(int fh, void *buf, int cnt
     59static void psread(int fh, void *buf, int cnt, bool valid_eof = false
    6060{ 
    61         if (read(fh, buf, cnt) == cnt) 
     61        int res = read(fh, buf, cnt); 
     62 
     63        if (res == cnt) 
    6264                return; 
    63         if (cnt == 0
     65        if (res == 0 && valid_eof
    6466                fprintf(stderr, "end of file\n"); 
    6567        else 
     
    146148        int fh; 
    147149        off64_t pos = 0; 
     150        off64_t len; 
    148151 
    149152        if (argc < 2) { 
     
    158161        } 
    159162 
     163        len = lseek64(fh, 0, SEEK_END); 
    160164        while (1) { 
    161165                lseek64(fh, pos, SEEK_SET); 
     
    174178                while (1) { 
    175179                        pos = lseek64(fh, 0, SEEK_CUR); 
    176                         psread(fh, &marker, 4); 
     180                        psread(fh, &marker, 4, pos == len); 
    177181                        marker = swap32(marker); 
    178182                        if (marker == 0x000001ba || marker == 0x000001b9)