annotate libmpdemux/demux_nut.c @ 20902:bfb6eacd9c4a

Update OSD contents only after the correct values for the frame are known. The most visible inaccuracy caused by the previous update location was that the OSD always showed position 0 after seeking with demux_mkv. Split frame decoding and filtering because with -correct-pts the pts value that should be displayed for the frame is only known after decoding but is needed before filtering (during which the OSD is drawn).
author uau
date Tue, 14 Nov 2006 12:29:20 +0000
parents ecb27a14d88d
children fd91718e6c76
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
19861
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
1 #include <stdio.h>
20815
f58ac12a92b7 shut warning on "realloc undefined" in demuxer.h
ods15
parents: 20814
diff changeset
2 #include <stdlib.h>
19861
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
3
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
4 #include "config.h"
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
5 #include "mp_msg.h"
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
6
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
7 #include "stream.h"
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
8 #include "demuxer.h"
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
9 #include "stheader.h"
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
10
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
11 #define USE_LIBNUT
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
12 #ifdef USE_LIBNUT
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
13
20893
ecb27a14d88d update to libnut, rename nut.h->libnut.h
ods15
parents: 20852
diff changeset
14 #include <libnut.h>
19861
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
15
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
16 typedef struct {
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
17 int last_pts; // FIXME
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
18 nut_context_t * nut;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
19 nut_stream_header_t * s;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
20 } nut_priv_t;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
21
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
22 static size_t mp_read(void * h, size_t len, uint8_t * buf) {
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
23 stream_t * stream = (stream_t*)h;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
24
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
25 if(stream_eof(stream)) return 0;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
26
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
27 return stream_read(stream, buf, len);
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
28 }
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
29
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
30 static off_t mp_seek(void * h, long long pos, int whence) {
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
31 stream_t * stream = (stream_t*)h;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
32
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
33 if (stream->end_pos < stream_tell(stream))
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
34 stream->end_pos = stream_tell(stream);
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
35
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
36 if (whence == SEEK_CUR) pos += stream_tell(stream);
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
37 else if (whence == SEEK_END) pos += stream->end_pos;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
38 else if (whence != SEEK_SET) return -1;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
39
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
40 if (pos < stream->end_pos && stream->eof) stream_reset(stream);
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
41 if (stream_seek(stream, pos) == 0) return -1;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
42
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
43 return pos;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
44 }
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
45
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
46 #define ID_STRING "nut/multimedia container"
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
47 #define ID_LENGTH (strlen(ID_STRING) + 1)
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
48
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
49 static int nut_check_file(demuxer_t * demuxer) {
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
50 uint8_t buf[ID_LENGTH];
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
51 nut_priv_t * priv = demuxer->priv = calloc(1, sizeof(nut_priv_t));
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
52
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
53 if (stream_read(demuxer->stream, buf, ID_LENGTH) != ID_LENGTH) return 0;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
54
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
55 if (memcmp(buf, ID_STRING, ID_LENGTH)) return 0;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
56
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
57 stream_seek(demuxer->stream, 0);
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
58 return DEMUXER_TYPE_NUT;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
59 }
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
60
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
61 static demuxer_t * demux_open_nut(demuxer_t * demuxer) {
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
62 extern int index_mode;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
63 nut_demuxer_opts_t dopts = {
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
64 .input = {
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
65 .priv = demuxer->stream,
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
66 .seek = mp_seek,
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
67 .read = mp_read,
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
68 .eof = NULL,
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
69 .file_pos = stream_tell(demuxer->stream),
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
70 },
19957
41153a5b5f8e sync to new libnut
ods15
parents: 19861
diff changeset
71 .alloc = { .malloc = NULL },
19861
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
72 .read_index = index_mode
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
73 };
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
74 nut_priv_t * priv = demuxer->priv;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
75 nut_context_t * nut = priv->nut = nut_demuxer_init(&dopts);
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
76 nut_stream_header_t * s;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
77 int ret;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
78 int i;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
79
20814
c3e142d35fac update libnut API
ods15
parents: 19958
diff changeset
80 if ((ret = nut_read_headers(nut, &s, NULL))) {
19861
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
81 if (ret < 0) mp_msg(MSGT_HEADER, MSGL_ERR, "NUT error: %s\n",
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
82 nut_error(-ret));
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
83 nut_demuxer_uninit(nut);
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
84 free(priv);
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
85 return NULL;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
86 }
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
87
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
88 priv->s = s;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
89
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
90 for (i = 0; s[i].type != -1 && i < 2; i++) switch(s[i].type) {
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
91 case NUT_AUDIO_CLASS: {
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
92 WAVEFORMATEX *wf =
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
93 calloc(sizeof(WAVEFORMATEX) +
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
94 s[i].codec_specific_len, 1);
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
95 sh_audio_t* sh_audio = new_sh_audio(demuxer, i);
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
96 int j;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
97
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
98 sh_audio->wf= wf; sh_audio->ds = demuxer->audio;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
99 sh_audio->audio.dwSampleSize = 0; // FIXME
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
100 sh_audio->audio.dwScale = s[i].time_base.nom;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
101 sh_audio->audio.dwRate = s[i].time_base.den;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
102 sh_audio->format = 0;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
103 for (j = 0; j < s[i].fourcc_len && j < 4; j++)
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
104 sh_audio->format |= s[i].fourcc[j]<<(j*8);
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
105 sh_audio->channels = s[i].channel_count;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
106 sh_audio->samplerate =
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
107 s[i].samplerate_nom / s[i].samplerate_denom;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
108 sh_audio->i_bps = 0; // FIXME
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
109
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
110 wf->wFormatTag = sh_audio->format;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
111 wf->nChannels = s[i].channel_count;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
112 wf->nSamplesPerSec =
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
113 s[i].samplerate_nom / s[i].samplerate_denom;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
114 wf->nAvgBytesPerSec = 0; // FIXME
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
115 wf->nBlockAlign = 0; // FIXME
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
116 wf->wBitsPerSample = 0; // FIXME
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
117 wf->cbSize = s[i].codec_specific_len;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
118 if (s[i].codec_specific_len)
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
119 memcpy(wf + 1, s[i].codec_specific,
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
120 s[i].codec_specific_len);
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
121
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
122 demuxer->audio->id = i;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
123 demuxer->audio->sh= demuxer->a_streams[i];
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
124 break;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
125 }
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
126 case NUT_VIDEO_CLASS: {
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
127 BITMAPINFOHEADER * bih =
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
128 calloc(sizeof(BITMAPINFOHEADER) +
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
129 s[i].codec_specific_len, 1);
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
130 sh_video_t * sh_video = new_sh_video(demuxer, i);
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
131 int j;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
132
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
133 sh_video->bih = bih;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
134 sh_video->ds = demuxer->video;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
135 sh_video->disp_w = s[i].width;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
136 sh_video->disp_h = s[i].height;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
137 sh_video->video.dwScale = s[i].time_base.nom;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
138 sh_video->video.dwRate = s[i].time_base.den;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
139
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
140 sh_video->fps = sh_video->video.dwRate/
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
141 (float)sh_video->video.dwScale;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
142 sh_video->frametime = 1./sh_video->fps;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
143 sh_video->format = 0;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
144 for (j = 0; j < s[i].fourcc_len && j < 4; j++)
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
145 sh_video->format |= s[i].fourcc[j]<<(j*8);
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
146 if (!s[i].sample_height) sh_video->aspect = 0;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
147 else sh_video->aspect =
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
148 s[i].sample_width / (float)s[i].sample_height;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
149 sh_video->i_bps = 0; // FIXME
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
150
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
151 bih->biSize = sizeof(BITMAPINFOHEADER) +
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
152 s[i].codec_specific_len;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
153 bih->biWidth = s[i].width;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
154 bih->biHeight = s[i].height;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
155 bih->biBitCount = 0; // FIXME
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
156 bih->biSizeImage = 0; // FIXME
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
157 bih->biCompression = sh_video->format;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
158
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
159 if (s[i].codec_specific_len)
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
160 memcpy(bih + 1, s[i].codec_specific,
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
161 s[i].codec_specific_len);
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
162
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
163 demuxer->video->id = i;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
164 demuxer->video->sh = demuxer->v_streams[i];
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
165 break;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
166 }
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
167 }
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
168
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
169 return demuxer;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
170 }
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
171
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
172 static int demux_nut_fill_buffer(demuxer_t * demuxer, demux_stream_t * dsds) {
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
173 nut_priv_t * priv = demuxer->priv;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
174 nut_context_t * nut = priv->nut;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
175 demux_packet_t *dp;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
176 demux_stream_t *ds;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
177 nut_packet_t pd;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
178 int ret;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
179 double pts;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
180
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
181 demuxer->filepos = stream_tell(demuxer->stream);
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
182 if (stream_eof(demuxer->stream)) return 0;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
183
19958
e50391b26740 simplifications, any error from libnut is fatal
ods15
parents: 19957
diff changeset
184 ret = nut_read_next_packet(nut, &pd);
e50391b26740 simplifications, any error from libnut is fatal
ods15
parents: 19957
diff changeset
185 if (ret < 0) {
e50391b26740 simplifications, any error from libnut is fatal
ods15
parents: 19957
diff changeset
186 mp_msg(MSGT_HEADER, MSGL_ERR, "NUT error: %s\n",
e50391b26740 simplifications, any error from libnut is fatal
ods15
parents: 19957
diff changeset
187 nut_error(-ret));
19861
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
188 }
19958
e50391b26740 simplifications, any error from libnut is fatal
ods15
parents: 19957
diff changeset
189 if (ret) return 0; // fatal error
19861
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
190
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
191 pts = (double)pd.pts * priv->s[pd.stream].time_base.nom /
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
192 priv->s[pd.stream].time_base.den;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
193
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
194 if (pd.stream == demuxer->audio->id) {
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
195 ds = demuxer->audio;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
196 if (!demuxer->video->sh) {
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
197 ((sh_audio_t*)ds->sh)->delay = pts;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
198 }
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
199 }
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
200 else if (pd.stream == demuxer->video->id) {
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
201 ds = demuxer->video;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
202 }
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
203 else {
19958
e50391b26740 simplifications, any error from libnut is fatal
ods15
parents: 19957
diff changeset
204 ret = nut_skip_packet(nut, &pd.len);
e50391b26740 simplifications, any error from libnut is fatal
ods15
parents: 19957
diff changeset
205 if (ret < 0) {
e50391b26740 simplifications, any error from libnut is fatal
ods15
parents: 19957
diff changeset
206 mp_msg(MSGT_HEADER, MSGL_ERR, "NUT error: %s\n",
e50391b26740 simplifications, any error from libnut is fatal
ods15
parents: 19957
diff changeset
207 nut_error(-ret));
19861
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
208 }
19958
e50391b26740 simplifications, any error from libnut is fatal
ods15
parents: 19957
diff changeset
209 if (ret) return 0; // fatal error
19861
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
210 return 1;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
211 }
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
212
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
213 if (pd.stream == 0) priv->last_pts = pd.pts;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
214
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
215 dp = new_demux_packet(pd.len);
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
216
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
217 dp->pts = pts;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
218
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
219 dp->pos = demuxer->filepos;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
220 dp->flags= (pd.flags & NUT_FLAG_KEY) ? 0x10 : 0;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
221
19958
e50391b26740 simplifications, any error from libnut is fatal
ods15
parents: 19957
diff changeset
222 ret = nut_read_frame(nut, &pd.len, dp->buffer);
e50391b26740 simplifications, any error from libnut is fatal
ods15
parents: 19957
diff changeset
223 if (ret < 0) {
e50391b26740 simplifications, any error from libnut is fatal
ods15
parents: 19957
diff changeset
224 mp_msg(MSGT_HEADER, MSGL_ERR, "NUT error: %s\n",
e50391b26740 simplifications, any error from libnut is fatal
ods15
parents: 19957
diff changeset
225 nut_error(-ret));
19861
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
226 }
19958
e50391b26740 simplifications, any error from libnut is fatal
ods15
parents: 19957
diff changeset
227 if (ret) return 0; // fatal error
e50391b26740 simplifications, any error from libnut is fatal
ods15
parents: 19957
diff changeset
228
19861
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
229 ds_add_packet(ds, dp); // append packet to DS stream
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
230 return 1;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
231 }
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
232
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
233 static void demux_seek_nut(demuxer_t * demuxer, float time_pos, float audio_delay, int flags) {
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
234 nut_context_t * nut = ((nut_priv_t*)demuxer->priv)->nut;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
235 nut_priv_t * priv = demuxer->priv;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
236 sh_audio_t * sh_audio = demuxer->audio->sh;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
237 int nutflags = 0;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
238 int ret;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
239 const int tmp[] = { 0, -1 };
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
240
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
241 if (!(flags & 1)) {
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
242 nutflags |= 1; // relative
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
243 if (time_pos > 0) nutflags |= 2; // forwards
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
244 }
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
245
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
246 if (flags & 2) // percent
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
247 time_pos *= priv->s[0].max_pts *
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
248 (double)priv->s[0].time_base.nom /
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
249 priv->s[0].time_base.den;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
250
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
251 ret = nut_seek(nut, time_pos, nutflags, tmp);
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
252 if (ret < 0)
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
253 mp_msg(MSGT_HEADER, MSGL_ERR, "NUT error: %s\n", nut_error(-ret));
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
254 if (sh_audio) resync_audio_stream(sh_audio);
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
255 }
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
256
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
257 static int demux_control_nut(demuxer_t * demuxer, int cmd, void * arg) {
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
258 nut_priv_t * priv = demuxer->priv;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
259 switch (cmd) {
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
260 case DEMUXER_CTRL_GET_TIME_LENGTH:
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
261 *((double *)arg) = priv->s[0].max_pts *
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
262 (double)priv->s[0].time_base.nom /
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
263 priv->s[0].time_base.den;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
264 return DEMUXER_CTRL_OK;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
265 case DEMUXER_CTRL_GET_PERCENT_POS:
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
266 if (priv->s[0].max_pts == 0)
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
267 return DEMUXER_CTRL_DONTKNOW;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
268 *((int *)arg) = priv->last_pts * 100 /
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
269 (double)priv->s[0].max_pts;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
270 return DEMUXER_CTRL_OK;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
271 default:
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
272 return DEMUXER_CTRL_NOTIMPL;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
273 }
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
274 }
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
275
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
276 static void demux_close_nut(demuxer_t *demuxer) {
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
277 nut_context_t * nut = ((nut_priv_t*)demuxer->priv)->nut;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
278 nut_demuxer_uninit(nut);
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
279 free(((nut_priv_t*)demuxer->priv)->s);
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
280 free(demuxer->priv);
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
281 demuxer->priv = NULL;
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
282 }
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
283
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
284
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
285 demuxer_desc_t demuxer_desc_nut = {
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
286 "NUT demuxer",
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
287 "nut",
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
288 "libnut",
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
289 "Oded Shimon (ods15)",
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
290 "NUT demuxer, requires libnut",
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
291 DEMUXER_TYPE_NUT,
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
292 1, // safe check demuxer
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
293 nut_check_file,
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
294 demux_nut_fill_buffer,
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
295 demux_open_nut,
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
296 demux_close_nut,
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
297 demux_seek_nut,
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
298 demux_control_nut
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
299 };
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
300
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
301 #endif // USE_LIBNUT
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents:
diff changeset
302