1 /*
2 * Psygnosis YOP demuxer
3 *
4 * Copyright (C) 2010 Mohamed Naufal Basheer <naufal11@gmail.com>
5 * derived from the code by
6 * Copyright (C) 2009 Thomas P. Higdon <thomas.p.higdon@gmail.com>
7 *
8 * This file is part of FFmpeg.
9 *
10 * FFmpeg is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
14 *
15 * FFmpeg is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
19 *
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with FFmpeg; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 */
24
29
32
38
40 {
42 probe_packet->
buf[2]<10 &&
43 probe_packet->
buf[3]<10 &&
44 probe_packet->
buf[6] &&
45 probe_packet->
buf[7] &&
46 !(probe_packet->
buf[8] & 1) &&
47 !(probe_packet->
buf[10] & 1) &&
49 AV_RL16(probe_packet->
buf + 12 + 6) < probe_packet->
buf[12] * 3 + 4 + probe_packet->
buf[7] * 2048
50 )
52
53 return 0;
54 }
55
57 {
60
63
65
70
71 // Audio
78
79 // Video
83
85
87 yop->frame_size =
avio_r8(pb) * 2048;
90
92
96
97 yop->palette_size = video_par->
extradata[0] * 3 + 4;
99
100 video_par->
bit_rate = 8 * (yop->frame_size - yop->audio_block_length) * frame_rate;
101
102 // 1840 samples per frame, 1 nibble per sample; hence 1840/2 = 920
103 if (yop->audio_block_length < 920 ||
104 yop->audio_block_length + yop->palette_size >= yop->frame_size) {
107 }
108
110
112
113 return 0;
114 }
115
117 {
120
122 int actual_video_data_size = yop->frame_size -
123 yop->audio_block_length - yop->palette_size;
124
125 yop->video_packet.stream_index = 1;
126
127 if (yop->video_packet.data) {
131 yop->odd_frame ^= 1;
132 return 0;
133 }
135 yop->frame_size - yop->audio_block_length);
138
140
141 ret =
avio_read(pb, yop->video_packet.data, yop->palette_size);
143 goto err_out;
144 }else if (ret < yop->palette_size) {
146 goto err_out;
147 }
148
151 goto err_out;
152
153 // Set position to the start of the frame
154 pkt->
pos = yop->video_packet.pos;
155
157
158 ret =
avio_read(pb, yop->video_packet.data + yop->palette_size,
159 actual_video_data_size);
161 goto err_out;
162 else if (
ret < actual_video_data_size)
164
165 // Arbitrarily return the audio data first
166 return 0;
167
168 err_out:
171 }
172
174 {
177 return 0;
178 }
179
181 int64_t timestamp,
int flags)
182 {
184 int64_t frame_pos, pos_min, pos_max;
185 int frame_count;
186
187 if (!stream_index)
188 return -1;
189
192 frame_count = (pos_max - pos_min) / yop->frame_size;
193
194 timestamp =
FFMAX(0,
FFMIN(frame_count, timestamp));
195
196 frame_pos = timestamp * yop->frame_size + pos_min;
197
198 if (
avio_seek(
s->pb, frame_pos, SEEK_SET) < 0)
199 return -1;
200
202 yop->odd_frame = timestamp & 1;
203
204 return 0;
205 }
206
216 .extensions = "yop",
218 };