diff options
Diffstat (limited to 'debian/transcode/transcode-1.1.7/import/fileinfo.c')
| -rw-r--r-- | debian/transcode/transcode-1.1.7/import/fileinfo.c | 907 |
1 files changed, 907 insertions, 0 deletions
diff --git a/debian/transcode/transcode-1.1.7/import/fileinfo.c b/debian/transcode/transcode-1.1.7/import/fileinfo.c new file mode 100644 index 00000000..211f7423 --- /dev/null +++ b/debian/transcode/transcode-1.1.7/import/fileinfo.c @@ -0,0 +1,907 @@ +/* + * fileinfo.c + * + * Copyright (C) Thomas Oestreich - June 2001 + * + * This file is part of transcode, a video stream processing tool + * + * transcode is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * transcode is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Make; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#include "config.h" + +#ifdef HAVE_LIBDV +#include <libdv/dv.h> +#endif + +#include <sys/types.h> +#include <unistd.h> +#include <fcntl.h> +#include <stdio.h> +#include <string.h> +#include "libtc/libtc.h" +#include "libtc/xio.h" +#include "ioaux.h" +#include "tc.h" + +/* forward declaration */ +static int scan_header_dv(const char *buf); + +unsigned char asfhdrguid[16]={0x30,0x26,0xB2,0x75,0x8E,0x66,0xCF,0x11,0xA6,0xD9,0x00,0xAA,0x00,0x62,0xCE,0x6C}; + +unsigned char mxfmagic[]={0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01}; + +unsigned char zero_pad[4]={0,0,0,0}; + +static int cmp_32_bits(char *buf, long x) +{ + + if(0) { + tc_log_msg(__FILE__, "MAGIC: 0x%02lx 0x%02lx 0x%02lx 0x%02lx %s", (x >> 24) & 0xff, ((x >> 16) & 0xff), ((x >> 8) & 0xff), ((x ) & 0xff), filetype(x)); + tc_log_msg(__FILE__, " FILE: 0x%02x 0x%02x 0x%02x 0x%02x", buf[0] & 0xff, buf[1] & 0xff, buf[2] & 0xff, buf[3] & 0xff); + } + + if ((uint8_t)buf[0] != ((x >> 24) & 0xff)) + return 0; + if ((uint8_t)buf[1] != ((x >> 16) & 0xff)) + return 0; + if ((uint8_t)buf[2] != ((x >> 8) & 0xff)) + return 0; + if ((uint8_t)buf[3] != ((x ) & 0xff)) + return 0; + + // OK found it + return 1; +} + +static int cmp_28_bits(char *buf, long x) +{ + + if(0) { + tc_log_msg(__FILE__, "MAGIC: 0x%02lx 0x%02lx 0x%02lx 0x%02lx %s", (x >> 24) & 0xff, ((x >> 16) & 0xff), ((x >> 8) & 0xff), ((x ) & 0xff), filetype(x)); + tc_log_msg(__FILE__, " FILE: 0x%02x 0x%02x 0x%02x 0x%02x", buf[0] & 0xff, buf[1] & 0xff, buf[2] & 0xff, buf[3] & 0xff); + } + + if ((uint8_t)buf[0] != ((x >> 24) & 0xff)) + return 0; + if ((uint8_t)buf[1] != ((x >> 16) & 0xff)) + return 0; + if ((uint8_t)buf[2] != ((x >> 8) & 0xff)) + return 0; + if ((uint8_t)(buf[3] & 0xf0) != ((x ) & 0xff)) + return 0; + + // OK found it + return 1; +} + + +static int cmp_16_bits(char *buf, long x) +{ + + int16_t sync_word=0; + + if(0) { + tc_log_msg(__FILE__, "MAGIC: 0x%02lx 0x%02lx 0x%02lx 0x%02lx %s", (x >> 24) & 0xff, ((x >> 16) & 0xff), ((x >> 8) & 0xff), ((x ) & 0xff), filetype(x)); + tc_log_msg(__FILE__, " FILE: 0x%02x 0x%02x 0x%02x 0x%02x", buf[0] & 0xff, buf[1] & 0xff, buf[2] & 0xff, buf[3] & 0xff); + } + + sync_word = (sync_word << 8) + (uint8_t) buf[0]; + sync_word = (sync_word << 8) + (uint8_t) buf[1]; + + if(sync_word == (int16_t) x) return 1; + + // not found; + return 0; +} + +static int save_read(char *buf, int bytes, off_t offset, int fdes) +{ + + // returns 0 if ok, 1 on failure to read first bytes + + // rewind + if(xio_lseek(fdes, offset, SEEK_SET)<0) { + tc_log_warn(__FILE__, "[%s:%d] file seek error: %s", + __FILE__, __LINE__, strerror(errno)); + return(1); + } + + if(xio_read(fdes, buf, bytes)<bytes) { + tc_log_warn(__FILE__, "[%s:%d] file read error: %s", + __FILE__, __LINE__, strerror(errno)); + return(1); + } + + return(0); +} + +#define MAX_PROBE_BYTES 4096 + +long fileinfo(int fdes, int skip) +{ + + char buf[MAX_PROBE_BYTES]; + + off_t off=0; + + int cc=0; + + long id=TC_MAGIC_UNKNOWN, offset; + + // assume this is a valid file descriptor + + // are we at offset defined by skip? + if((offset = xio_lseek(fdes, skip, SEEK_CUR)) < 0) { + if(errno==ESPIPE) return(TC_MAGIC_PIPE); + return(TC_MAGIC_ERROR); + } + + // refuse to work with a file not at offset 0 + if(offset != skip) { + tc_log_error(__FILE__, "file pointer not at requested offset %d - exit", skip); + return(TC_MAGIC_ERROR); + } + + off +=skip; + + /* ------------------------------------------------------------------- + * + * zero padding detection + * + *-------------------------------------------------------------------*/ + + if(save_read(buf, 4, off, fdes)) goto exit; + + while(memcmp(buf, zero_pad, 4)==0) { + off +=4; //preserves byte order + if(off> TC_MAX_SEEK_BYTES) goto exit; + if(save_read(buf, 4, off, fdes)) goto exit; + } + + if(off<0) goto exit; + + //tc_log_msg(__FILE__, "off=%d '%c' '%c' '%c' '%c'", off, buf[0], buf[1], buf[2], buf[3]); + + + /* ------------------------------------------------------------------- + * + * 2 byte section, read 4 bytes + * + *-------------------------------------------------------------------*/ + + if(save_read(buf, 4, off, fdes)) goto exit; + + // AC3 + + if(cmp_16_bits(buf, TC_MAGIC_AC3)) { + id = TC_MAGIC_AC3; + goto exit; + } + + // MP3 audio + + if(cmp_16_bits(buf, TC_MAGIC_MP3)) { + id = TC_MAGIC_MP3; + goto exit; + } + + if(cmp_16_bits(buf, TC_MAGIC_MP3_2_5)) { + id = TC_MAGIC_MP3_2_5; + goto exit; + } + + if(cmp_16_bits(buf, TC_MAGIC_MP3_2)) { + id = TC_MAGIC_MP3_2; + goto exit; + } + + // MP2 audio + + if(cmp_16_bits(buf, TC_MAGIC_MP2) || cmp_16_bits(buf, TC_MAGIC_MP2_FC)) { + id = TC_MAGIC_MP2; + goto exit; + } + + if ( ((((buf[0]<<8)&0xff00)|buf[1])&0xfff8) == 0xfff0) { + if ( (buf[1]&0x02) == 0x02) { + id = TC_MAGIC_MP3; + goto exit; + } + if ( (buf[1]&0x01) == 0x01) { + id = TC_MAGIC_MP2; + goto exit; + } + } + + // TIFF image + + if (cmp_16_bits(buf, TC_MAGIC_TIFF1)) { + id = TC_MAGIC_TIFF1; + goto exit; + } + if (cmp_16_bits(buf, TC_MAGIC_TIFF2)) { + id = TC_MAGIC_TIFF2; + goto exit; + } + + // BMP image + + if (cmp_16_bits(buf, TC_MAGIC_BMP)) { + id = TC_MAGIC_BMP; + goto exit; + } + + // SGI image + + if (cmp_16_bits(buf, TC_MAGIC_SGI)) { + id = TC_MAGIC_SGI; + goto exit; + } + + // PPM image + + if (strncmp (buf, "P6", 2)==0) { + id = TC_MAGIC_PPM; + goto exit; + } + + // PGM image + + if (strncmp (buf, "P5", 2)==0) { + id = TC_MAGIC_PGM; + goto exit; + } + + // SGI image + + if (cmp_16_bits(buf, TC_MAGIC_SGI)) { + id = TC_MAGIC_SGI; + goto exit; + } + + + // transport stream + + if (buf[0] == (uint8_t) TC_MAGIC_TS) { + id = TC_MAGIC_TS; + goto exit; + } + + + /* ------------------------------------------------------------------- + * + * 4 byte section + * + *-------------------------------------------------------------------*/ + + if(save_read(buf, 4, off, fdes)) goto exit; + + + // DTS + + if(cmp_32_bits(buf, TC_MAGIC_DTS)) { + id = TC_MAGIC_DTS; + goto exit; + } + + // VOB + + if(cmp_32_bits(buf, TC_MAGIC_VOB)) { + id = TC_MAGIC_VOB; + goto exit; + } + + // MPEG Video / .VDR + + if(cmp_28_bits(buf, TC_MAGIC_MPEG)) { + id = TC_MAGIC_MPEG; /* FIXME: it's PES? */ + goto exit; + } + + // DV + + if(cmp_32_bits(buf, TC_MAGIC_DV_NTSC)) { + id = TC_MAGIC_DV_NTSC; + goto exit; + } + + // DV + + if(cmp_32_bits(buf, TC_MAGIC_DV_PAL)) { + id = TC_MAGIC_DV_PAL; + goto exit; + } + + // OGG stream + + if (strncmp (buf, "OggS", 4)==0) { + id = TC_MAGIC_OGG; + goto exit; + } + + // M2V + + if(cmp_32_bits(buf, TC_MAGIC_M2V)) { + id = TC_MAGIC_MPEG_ES; + goto exit; + } + + // NUV + + if(cmp_32_bits(buf, TC_MAGIC_NUV)) { + id = TC_MAGIC_NUV; + goto exit; + } + + // OGG + + if (strncasecmp(buf, "OggS", 4) == 0) { + id = TC_MAGIC_OGG; + goto exit; + } + + // Real Media + if(strncasecmp(buf,".RMF", 4)==0) { + id = TC_MAGIC_RMF; + goto exit; + } + + // PV3 + if (memcmp(buf, "PV3\1", 4) == 0 || memcmp(buf, "PV3\2", 4) == 0) { + id = TC_MAGIC_PV3; + goto exit; + } + + // PVN + if (buf[0]=='P' && buf[1]=='V' + && (buf[2]>='4' && buf[2]<='6') + && (buf[3]=='a' || buf[3]=='b' || buf[3]=='d' || buf[3]=='f') + ) { + id = TC_MAGIC_PVN; + goto exit; + } + + + // MP3 audio + odd 0 padding + + if(cmp_16_bits(buf+1, TC_MAGIC_MP3)) { + id = TC_MAGIC_MP3; + goto exit; + } + + if(cmp_16_bits(buf+1, TC_MAGIC_MP3_2_5)) { + id = TC_MAGIC_MP3_2_5; + goto exit; + } + + if(cmp_16_bits(buf+1, TC_MAGIC_MP3_2)) { + id = TC_MAGIC_MP3_2; + goto exit; + } + + if(cmp_16_bits(buf+2, TC_MAGIC_MP3)) { + id = TC_MAGIC_MP3; + goto exit; + } + + if(cmp_16_bits(buf+2, TC_MAGIC_MP3_2_5)) { + id = TC_MAGIC_MP3_2_5; + goto exit; + } + + if(cmp_16_bits(buf+2, TC_MAGIC_MP3_2)) { + id = TC_MAGIC_MP3_2; + goto exit; + } + + if(cmp_32_bits(buf, TC_MAGIC_ID3)) { + id = TC_MAGIC_ID3; + goto exit; + } + + // iTunes sets an ID3 header that way at the beginning. We search for an + // syncword first so it should just work. + if (buf[0] == 'I' && buf[1] == 'D' && buf[2] == '3' && buf[3] == 0x02) { + id = TC_MAGIC_MP3; + goto exit; + } + + /* ------------------------------------------------------------------- + * + * 8 byte section + * + *-------------------------------------------------------------------*/ + + if(save_read(buf, 8, off, fdes)) goto exit; + + // YUV4MPEG + + if (strncmp (buf, "YUV4MPEG", 8)==0) { + id = TC_MAGIC_YUV4MPEG; + goto exit; + } + + // BSDAV + + if (strncmp (buf, "BSDAV", 5)==0) { + id = TC_MAGIC_BSDAV; + goto exit; + } + + // MOV + + if(strncasecmp(buf+4,"moov", 4) ==0 || + strncasecmp(buf+4,"cmov", 4) ==0 || + strncasecmp(buf+4,"mdat", 4) ==0 || + strncasecmp(buf+4,"ftyp", 4) ==0 || + strncasecmp(buf+4,"pnot", 4) ==0) { + id = TC_MAGIC_MOV; + goto exit; + } + + // PNG + + if (cmp_32_bits(buf, TC_MAGIC_PNG) && + cmp_32_bits(buf+4, 0x0D0A1A0A)) { + id = TC_MAGIC_PNG; + goto exit; + } + + // GIF + + if (strncasecmp(buf, "GIF87a", 6) == 0 || + strncasecmp(buf, "GIF89a", 6) == 0) { + id = TC_MAGIC_GIF; + goto exit; + } + + // XML + + if(strncasecmp(buf,"<?xml", 5) ==0) { + id = TC_MAGIC_XML; + goto exit; + } + + // vncrec log file + + if(strncasecmp(buf,"vncLog",6) ==0 ) { + id = TC_MAGIC_VNC; + goto exit; + } + + + /* ------------------------------------------------------------------- + * + * 12 byte section + * + *-------------------------------------------------------------------*/ + + + if(save_read(buf, 12, off, fdes)) goto exit; + + // YUV4MPEG2 + + if (strncmp (buf, "YUV4MPEG2", 9)==0) { + id = TC_MAGIC_YUV4MPEG; + goto exit; + } + + // AVI + if(strncasecmp(buf ,"RIFF",4) ==0 && + strncasecmp(buf+8,"AVI ",4) ==0 ) { + id = TC_MAGIC_AVI; + goto exit; + } + + // JPEG + if (cmp_32_bits(buf, TC_MAGIC_JPEG) && + strncasecmp(buf+6, "JFIF", 4) == 0) { + id = TC_MAGIC_JPEG; + goto exit; + } + if (cmp_16_bits(buf, 0xFFD8)) { + id = TC_MAGIC_JPEG; + goto exit; + } + + // WAVE + if(strncasecmp(buf ,"RIFF",4) ==0 && + strncasecmp(buf+8,"WAVE",4) ==0 ) { + id = TC_MAGIC_WAV; + goto exit; + } + + // CDXA + if(strncasecmp(buf ,"RIFF",4) ==0 && + strncasecmp(buf+8,"CDXA",4) ==0 ) { + id = TC_MAGIC_CDXA; + goto exit; + } + + + /* ------------------------------------------------------------------- + * + * 16 byte section + * + *-------------------------------------------------------------------*/ + + if(save_read(buf, 16, off, fdes)) goto exit; + + //ASF + if(memcmp(asfhdrguid,buf,16)==0) { + id = TC_MAGIC_ASF; + goto exit; + } + + //MXF + if(memcmp(mxfmagic,buf,sizeof(mxfmagic))==0) { + id = TC_MAGIC_MXF; + goto exit; + } + + // MOV + + if(strncasecmp(buf+12,"moov", 4) ==0 || + strncasecmp(buf+12,"cmov", 4) ==0 || + strncasecmp(buf+12,"mdat", 4) ==0 || + strncasecmp(buf+12,"pnot", 4) ==0) { + id = TC_MAGIC_MOV; + goto exit; + } + + /* ------------------------------------------------------------------- + * + * more tests + * + *-------------------------------------------------------------------*/ + + if(save_read(buf, MAX_PROBE_BYTES, off, fdes)) goto exit; + + //DV + cc=scan_header_dv(buf); + + if(cc==1) { + id = TC_MAGIC_DV_PAL; + goto exit; + } + + if(cc==2) { + id = TC_MAGIC_DV_NTSC; + goto exit; + } + + /* ------------------------------------------------------------------- + * + * exit + * + *-------------------------------------------------------------------*/ + + exit: + // reset file pointer + xio_lseek(fdes, 0, SEEK_SET); + return(id); +} + +long streaminfo(int fdes) +{ + + char buf[64]; + + long id=TC_MAGIC_UNKNOWN; + + // assume this is a valid file descriptor + + int bytes=16, ret=0; + + if( (ret = tc_pread(fdes, buf, bytes))<bytes) { + if (ret) + tc_log_error(__FILE__, "File too short (must be 16 bytes at least)"); + else + tc_log_error(__FILE__, "stream read error: %s", strerror(errno)); + return(TC_MAGIC_ERROR); + } + + /* ------------------------------------------------------------------- + * + * 2 byte section + * + *-------------------------------------------------------------------*/ + + // AC3 + + if(cmp_16_bits(buf, TC_MAGIC_AC3)) { + id = TC_MAGIC_AC3; + goto exit; + } + + // MPEG audio + + if(cmp_16_bits(buf, TC_MAGIC_MP3)) { + id = TC_MAGIC_MP3; + goto exit; + } + + if(cmp_16_bits(buf, TC_MAGIC_MP3_2_5)) { + id = TC_MAGIC_MP3_2_5; + goto exit; + } + + if(cmp_16_bits(buf, TC_MAGIC_MP3_2)) { + id = TC_MAGIC_MP3_2; + goto exit; + } + + // transport stream + + if (buf[0] == (uint8_t) TC_MAGIC_TS) { + id = TC_MAGIC_TS; + goto exit; + } + + /* ------------------------------------------------------------------- + * + * 4 byte section + * + *-------------------------------------------------------------------*/ + + // DTS + + if(cmp_32_bits(buf, TC_MAGIC_DTS)) { + id = TC_MAGIC_DTS; + goto exit; + } + + // VOB + + if(cmp_32_bits(buf, TC_MAGIC_VOB)) { + id = TC_MAGIC_VOB; + goto exit; + } + + // DV + + if(cmp_32_bits(buf, TC_MAGIC_DV_NTSC)) { + id = TC_MAGIC_DV_NTSC; + goto exit; + } + + // DV + + if(cmp_32_bits(buf, TC_MAGIC_DV_PAL)) { + id = TC_MAGIC_DV_PAL; + goto exit; + } + + // M2V + + if(cmp_32_bits(buf, TC_MAGIC_M2V)) { + id = TC_MAGIC_MPEG_ES; + goto exit; + } + + // MPEG Video / .VDR + + if(cmp_32_bits(buf, TC_MAGIC_MPEG)) { + id = TC_MAGIC_MPEG; /* FIXME: it's PES? */ + goto exit; + } + + // NUV + + if(cmp_32_bits(buf, TC_MAGIC_NUV)) { + id = TC_MAGIC_NUV; + goto exit; + } + + // MP3 audio + odd 0 padding + + if(cmp_16_bits(buf+1, TC_MAGIC_MP3)) { + id = TC_MAGIC_MP3; + goto exit; + } + + if(cmp_16_bits(buf+1, TC_MAGIC_MP3_2_5)) { + id = TC_MAGIC_MP3_2_5; + goto exit; + } + + if(cmp_16_bits(buf+1, TC_MAGIC_MP3_2)) { + id = TC_MAGIC_MP3_2; + goto exit; + } + + if(cmp_16_bits(buf+2, TC_MAGIC_MP3)) { + id = TC_MAGIC_MP3; + goto exit; + } + + if(cmp_16_bits(buf+2, TC_MAGIC_MP3_2_5)) { + id = TC_MAGIC_MP3_2_5; + goto exit; + } + + if(cmp_16_bits(buf+2, TC_MAGIC_MP3_2)) { + id = TC_MAGIC_MP3_2; + goto exit; + } + + // transport stream + + if (cmp_16_bits(buf, TC_MAGIC_TS)) { + id = TC_MAGIC_TS; + goto exit; + } + + + /* ------------------------------------------------------------------- + * + * 8 byte section + * + *-------------------------------------------------------------------*/ + + // YUV4MPEG + + if (strncmp (buf, "YUV4MPEG", 8)==0) { + id = TC_MAGIC_YUV4MPEG; + goto exit; + } + + // MOV + + if(strncasecmp(buf+4,"moov", 4) ==0 || + strncasecmp(buf+4,"cmov", 4) ==0 || + strncasecmp(buf+4,"mdat", 4) ==0 || + strncasecmp(buf+4,"pnot", 4) ==0) { + id = TC_MAGIC_MOV; + goto exit; + } + + + /* ------------------------------------------------------------------- + * + * 12 byte section + * + *-------------------------------------------------------------------*/ + + // WAVE + if(strncasecmp(buf ,"RIFF",4) ==0 && + strncasecmp(buf+8,"WAVE",4) ==0 ) { + id = TC_MAGIC_WAV; + goto exit; + } + + // OGG + + if (strncasecmp(buf, "OggS", 4) == 0) { + id = TC_MAGIC_OGG; + goto exit; + } + + /* ------------------------------------------------------------------- + * + * 16 byte section + * + *-------------------------------------------------------------------*/ + + if(memcmp(asfhdrguid,buf,16)==0) { + id = TC_MAGIC_ASF; + goto exit; + } + + //MXF + if(memcmp(mxfmagic,buf,sizeof(mxfmagic))==0) { + id = TC_MAGIC_MXF; + goto exit; + } + + /* ------------------------------------------------------------------- + * + * exit + * + *-------------------------------------------------------------------*/ + + exit: + + return(id); +} + +const char *filetype(uint32_t magic) +{ + + switch(magic) { + + case TC_MAGIC_TS: return("MPEG transport stream (TS)"); + case TC_MAGIC_MPEG_PS: /* fallthrough */ + case TC_MAGIC_VOB: return("MPEG program stream (PS)"); + case TC_MAGIC_MPEG_ES: /* fallthrough */ + case TC_MAGIC_M2V: return("MPEG elementary stream (ES)"); + case TC_MAGIC_MPEG_PES: /* fallthrough */ + case TC_MAGIC_MPEG: return("MPEG packetized elementary stream (PES)"); + case TC_MAGIC_AVI: return("RIFF data, AVI video"); + case TC_MAGIC_WAV: return("RIFF data, WAVE audio"); + case TC_MAGIC_CDXA: return("RIFF data, CDXA"); + case TC_MAGIC_MOV: return("Apple QuickTime movie file"); + case TC_MAGIC_ASF: return("advanced streaming format ASF"); + case TC_MAGIC_TIFF1: + case TC_MAGIC_TIFF2: return("TIFF image"); + case TC_MAGIC_JPEG: return("JPEG image"); + case TC_MAGIC_BMP: return("BMP image"); + case TC_MAGIC_PNG: return("PNG image"); + case TC_MAGIC_GIF: return("GIF image"); + case TC_MAGIC_PPM: return("PPM image"); + case TC_MAGIC_PGM: return("PGM image"); + case TC_MAGIC_SGI: return("SGI image"); + case TC_MAGIC_RMF: return("Real Media"); + case TC_MAGIC_XML: return("XML file, need to analyze the content"); + case TC_MAGIC_MXF: return("The Material eXchange Format"); + case TC_MAGIC_OGG: return("OGG Multimedia Container"); + + case TC_MAGIC_RAW: return("RAW stream"); + case TC_MAGIC_AC3: return("AC3 stream"); + case TC_MAGIC_DTS: return("DTS stream"); + case TC_MAGIC_MP3: return("MPEG-1 layer-3 stream"); + case TC_MAGIC_MP3_2: return("MPEG-2 layer-3 stream"); + case TC_MAGIC_MP3_2_5: return("MPEG-2.5 layer-3 stream"); + case TC_MAGIC_MP2: return("MP2 stream"); + case TC_MAGIC_ID3: return("MPEG audio ID3 tag"); + + case TC_MAGIC_DV_NTSC: return("Digital Video (NTSC)"); + case TC_MAGIC_DV_PAL: return("Digital Video (PAL)"); + case TC_MAGIC_DVD: return("DVD image/device"); + case TC_MAGIC_DVD_PAL: return("PAL DVD image/device"); + case TC_MAGIC_DVD_NTSC: return("NTSC DVD image/device"); + case TC_MAGIC_YUV4MPEG: return("YUV4MPEG stream"); + case TC_MAGIC_NUV: return("NuppelVideo stream"); + case TC_MAGIC_VNC: return("VNCrec logfile"); + case TC_MAGIC_PV3: return("PV3 video"); + + case TC_MAGIC_V4L_AUDIO: return("V4L audio device"); + case TC_MAGIC_V4L_VIDEO: return("V4L video device"); + case TC_MAGIC_BKTR_VIDEO: return("bktr video device"); + case TC_MAGIC_SUNAU_AUDIO: return("sunau audio device"); + case TC_MAGIC_BSDAV: return("bsdav stream"); + case TC_MAGIC_OSS_AUDIO: return("OSS audio device"); + case TC_MAGIC_PIPE: return("pipe/fifo (not seekable)"); + case TC_MAGIC_MPLAYER: return("probed by mplayer"); + case TC_MAGIC_X11: return("X11 display source"); + case TC_MAGIC_ERROR: return("error"); + case TC_MAGIC_UNKNOWN: + default: return("unknown file type"); + } +} + +static int scan_header_dv(const char *buf) +{ + int cc = -1; +#ifdef HAVE_LIBDV + dv_decoder_t *dv_decoder = dv_decoder_new(TRUE, FALSE, FALSE); + + // Initialize DV decoder + + if (dv_decoder == NULL) { + tc_log_error(__FILE__, "dv decoder init failed"); + return(-1); + } + + dv_decoder->prev_frame_decoded = 0; + cc = dv_parse_header(dv_decoder, buf); + + dv_decoder_free(dv_decoder); +#endif + return(cc); +} + |
