comparison libmpdemux/demux_nuv.c @ 3801:3cea69dda1b3

added NuppelVideo demuxer, based on Panagiotis Issaris' patch
author alex
date Thu, 27 Dec 2001 21:24:56 +0000
parents
children c2792c5b4f6e
comparison
equal deleted inserted replaced
3800:3080ef830f93 3801:3cea69dda1b3
1 /*
2 * NuppelVideo 0.05 file parser
3 * for MPlayer
4 * by Panagiotis Issaris <takis@lumumba.luc.ac.be>
5 *
6 * Reworked by alex
7 */
8
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <unistd.h>
12
13 #include "config.h"
14 #include "mp_msg.h"
15 #include "help_mp.h"
16 #include "stream.h"
17 #include "demuxer.h"
18 #include "stheader.h"
19 #include "nuppelvideo.h"
20 //#include "RTjpegN.h"
21 //#include "minilzo.h"
22
23
24 struct nuv_signature
25 {
26 char finfo[12]; /* "NuppelVideo" + \0 */
27 char version[5]; /* "0.05" + \0 */
28 };
29
30
31 void demux_seek_nuv ( demuxer_t *demuxer, float rel_seek_secs, int flags )
32 {
33 }
34
35
36 int demux_nuv_fill_buffer ( demuxer_t *demuxer )
37 {
38 struct rtframeheader rtjpeg_frameheader;
39 int orig_pos;
40
41 orig_pos = stream_tell ( demuxer->stream );
42 if (stream_read ( demuxer->stream, (char*)& rtjpeg_frameheader, sizeof ( rtjpeg_frameheader ) ) < sizeof(rtjpeg_frameheader))
43 return 0; /* EOF */
44
45 #if 0
46 printf("NUV frame read: %c packetlength: %d orig: %d new: %d\n", rtjpeg_frameheader.frametype,rtjpeg_frameheader.packetlength, orig_pos, orig_pos+rtjpeg_frameheader.packetlength);
47 #endif
48
49 /* Skip Seekpoint, Text and Sync for now */
50 if ((rtjpeg_frameheader.frametype == 'R') ||
51 (rtjpeg_frameheader.frametype == 'T') ||
52 (rtjpeg_frameheader.frametype == 'S'))
53 return 1;
54
55 if (((rtjpeg_frameheader.frametype == 'D') &&
56 (rtjpeg_frameheader.comptype == 'R')) ||
57 (rtjpeg_frameheader.frametype == 'V'))
58 {
59 /* put RTjpeg tables, Video info to video buffer */
60 stream_seek ( demuxer->stream, orig_pos );
61 ds_read_packet ( demuxer->video, demuxer->stream, rtjpeg_frameheader.packetlength + 12,
62 rtjpeg_frameheader.timecode / 1000, orig_pos, 0 );
63 }
64
65 /* copy PCM only */
66 if (demuxer->audio && (rtjpeg_frameheader.frametype == 'A') &&
67 (rtjpeg_frameheader.comptype == '0'))
68 {
69 /* put Audio to audio buffer */
70 stream_seek ( demuxer->stream, orig_pos );
71 ds_read_packet ( demuxer->audio, demuxer->stream, rtjpeg_frameheader.packetlength + 12,
72 rtjpeg_frameheader.timecode / 1000, orig_pos, 0 );
73 }
74
75 return 1;
76 }
77
78
79 demuxer_t* demux_open_nuv ( demuxer_t* demuxer )
80 {
81 sh_video_t *sh_video = NULL;
82 sh_audio_t *sh_audio = NULL;
83 struct rtfileheader rtjpeg_fileheader;
84 struct rtframeheader rtjpeg_frameheader;
85 unsigned long int tbls[128];
86 int bytes_read;
87
88 /* Go to the start */
89 stream_reset(demuxer->stream);
90 stream_seek(demuxer->stream, 0);
91
92 stream_read ( demuxer->stream, (char*)& rtjpeg_fileheader, sizeof(rtjpeg_fileheader) );
93
94 /* no video */
95 if (rtjpeg_fileheader.videoblocks == 0)
96 {
97 printf("No video blocks in file\n");
98 return NULL;
99 }
100
101 /* Create a new video stream header */
102 sh_video = new_sh_video ( demuxer, 0 );
103
104 /* Make sure the demuxer knows about the new video stream header
105 * (even though new_sh_video() ought to take care of it)
106 */
107 demuxer->video->sh = sh_video;
108
109 /* Make sure that the video demuxer stream header knows about its
110 * parent video demuxer stream (this is getting wacky), or else
111 * video_read_properties() will choke
112 */
113 sh_video->ds = demuxer->video;
114
115 /* Custom fourcc for internal MPlayer use */
116 sh_video->format = mmioFOURCC('N', 'U', 'V', '1');
117
118 sh_video->disp_w = rtjpeg_fileheader.width;
119 sh_video->disp_h = rtjpeg_fileheader.height;
120
121 sh_video->aspect = rtjpeg_fileheader.aspect;
122
123 /* Get the FPS */
124 sh_video->fps = rtjpeg_fileheader.fps;
125 sh_video->frametime = 1 / sh_video->fps;
126
127 #if 0
128 if (rtjpeg_fileheader.audioblocks != 0)
129 {
130 sh_audio = new_sh_audio(demuxer, 0);
131 demuxer->audio->sh = sh_audio;
132 sh_audio->ds = demuxer->audio;
133 sh_audio->format = 0x1;
134 sh_audio->channels = 2;
135 sh_audio->samplerate = 44100;
136
137 sh_audio->wf = malloc(sizeof(WAVEFORMATEX));
138 memset(sh_audio->wf, 0, sizeof(WAVEFORMATEX));
139 sh_audio->wf->wFormatTag = sh_audio->format;
140 sh_audio->wf->nChannels = sh_audio->channels;
141 sh_audio->wf->wBitsPerSample = 16;
142 sh_audio->wf->nSamplesPerSec = sh_audio->samplerate;
143 sh_audio->wf->nAvgBytesPerSec = sh_audio->wf->nChannels*
144 sh_audio->wf->wBitsPerSample*sh_audio->wf->nSamplesPerSec/8;
145 sh_audio->wf->nBlockAlign = sh_audio->channels * 2;
146 sh_audio->wf->cbSize = 0;
147 }
148 #endif
149
150 return demuxer;
151 }
152
153 int nuv_check_file ( demuxer_t* demuxer )
154 {
155 struct nuv_signature ns;
156
157 /* Store original position */
158 int orig_pos = stream_tell(demuxer->stream);
159
160 mp_msg ( MSGT_DEMUX, MSGL_V, "Checking for NuppelVideo\n" );
161
162 stream_read(demuxer->stream,(char*)&ns,sizeof(ns));
163
164 if ( strncmp ( ns.finfo, "NuppelVideo", 12 ) )
165 return 0; /* Not a NuppelVideo file */
166 if ( strncmp ( ns.version, "0.05", 5 ) )
167 return 0; /* Wrong version NuppelVideo file */
168
169 /* Return to original position */
170 stream_seek ( demuxer->stream, orig_pos );
171 return 1;
172 }