胳膊麻是什么原因| 6月11日什么星座| 吃什么能提高记忆力| 愚公移山是什么意思| 脚心痒是什么预兆| 吃什么食物补铁| 胃酸过多吃点什么食物比较好| 红色加黑色是什么颜色| 甲沟炎涂什么药膏| copd是什么病的简称| 古今内衣是什么档次| 为什么不建议开眼角| 惊蛰后是什么节气| 端倪是什么意思| 肝衰竭是什么原因引起的| 为什么伴娘要未婚| 凉虾是什么| 头皮发红是什么原因| 就这样吧是什么意思| 广肚是什么| peni是什么意思| 什么是包皮| 想呕吐是什么原因| 属兔的婚配什么属相好| 五爷是什么菩萨| 桑蚕丝被有什么好处| 为什么会长溃疡| 腹泻吃什么| 忍者神龟是什么意思| 感冒流黄鼻涕吃什么药| 银行卡销户是什么意思| 胃糜烂吃什么药可以根治| 黑枸杞和什么一起泡水喝比较好| 血脂低是什么原因| 拔完智齿第三天可以吃什么| 梦到人死了是什么意思| 绝育手术对女性有什么危害| 寒是什么意思| 公检法是什么| 什么地走路| uspa是什么牌子| 亮丽是什么意思| ipo是什么| 肾疼是因为什么| 素手是什么意思| 被蜱虫咬了挂什么科| 花木兰属什么生肖| 全血粘度低切偏高是什么意思| grn什么颜色| 碳是什么| 祉是什么意思| 油菜是什么菜| 贫血不能吃什么| 什么是鼻窦炎| 爱豆是什么意思| 宗人府是干什么的| 学生早餐吃什么方便又营养| 血热是什么症状| 容忍是什么意思| 牙周炎有什么症状| 焦虑症吃什么药最好| hpv是检查什么的| 1.14是什么星座| 什么的公园| 三角形为什么具有稳定性| 下午两点多是什么时辰| 阴虱是什么样子图片| 山狸是什么动物| 孩子肚脐眼下面疼是什么原因| 女人气虚吃什么补最快| 菩提子是什么材质| 10月4日是什么星座| 无氧运动是什么意思| 头孢和什么药不能一起吃| 梦见自己掉牙齿是什么征兆| 心影增大是什么意思| 什么是阴道炎| 胆红素偏高是什么原因| 湿气重吃什么水果| 鹦鹉代表什么生肖| 烧仙草是什么东西| 果肉属于什么组织| 什么的银发| 剑走偏锋是什么意思| 吃什么长内膜最快最有效| 7.9什么星座| 非你莫属是什么意思| 积滞是什么意思| 间接胆红素是什么意思| 阿胶是什么做的| 山东的简称是什么| 唾手可得是什么意思| 京东自营是什么意思| 征求是什么意思| 颈椎反弓有什么症状| 元气是什么意思| 甲功五项是什么意思| cfmoto是什么牌子| 老虎拉车的歇后语是什么| 亚洲没有什么气候| 女人小腹痛什么原因| 促甲状腺激素偏低是什么意思| 百香果什么时候开花结果| 回苏灵又叫什么| 直捣黄龙是什么意思| 孤寡老人是什么意思| 徒劳无功是什么意思| jdk是什么| 中药学学什么| 华语是什么语言| 疱疹吃什么药见效快| 吃中药不能吃什么东西| fte是什么意思| 重组人干扰素a2b主要是治疗什么病| 胃不舒服可以吃什么水果| 扁平足是什么样的| 钼靶检查是什么| 胃烧灼感吃什么药| 什么是精神分裂| 大佐相当于中国的什么军衔| 狗皮肤溃烂用什么药| 爸爸是什么意思| 地中海贫血是什么意思| ins是什么社交软件| 头颈出汗多是什么原因| xxoo是什么意思| 糖链抗原高是什么原因| 百合花什么时候种植| 94年属什么| 左肾钙化灶什么意思| 白喉采取什么隔离| 梦见悬崖峭壁是什么意思| 眼睛突出是什么原因| mrt是什么意思| 打日本电话前面加什么| 1120是什么星座| imao什么意思| 皮下水肿是什么原因| 消防队属于什么编制| 北五行属什么| 霉菌有什么症状| 大悲咒是什么意思| 什么心竭什么| 乳腺彩超能查出什么| gap什么意思| 冻顶乌龙茶属于什么茶| 立秋日有什么禁忌| 藏红花的功效是什么| 135是什么意思| 男性尿道炎是什么原因引起的| 耘字五行属什么| 考教师编制需要什么条件| 为什么吐后反而舒服了| 萎缩性胃炎什么症状| 县长是什么级别的干部| 遇难是什么意思| 上不下大是什么字| 有什么好看的电视剧| 怀孕为什么会恶心想吐| 8月18日什么星座| 浑身出汗是什么原因| 头昏是什么原因引起的| 肛门有灼烧感什么原因| 怀孕什么时候可以同房| 肝脏钙化灶是什么意思| 瘿瘤是什么意思| 太后是什么意思| 脸上长斑的原因是什么引起的| 小便短赤是什么症状| 心理学属于什么学科| 69属什么| 妈妈的姐姐的儿子叫什么| 头晕眼花吃什么药| 胃肠炎可以吃什么水果| 女性尿道炎吃什么药| 灭蚂蚁什么药最有效| 18属什么生肖| 小乌龟吃什么食物| 脑部ct挂什么科| 来世是什么意思| 天伦之乐是什么意思啊| 幽门螺杆菌挂什么科| 弥漫性肝病是什么意思| 月经不调看什么科室| 既视感是什么意思| luxury是什么牌子| 七个月宝宝可以吃什么辅食| 10月15日是什么星座| 月经期间喝红糖水有什么好处| 隆科多为什么不姓佟| 女性解脲支原体阳性吃什么药| 三文鱼不能和什么一起吃| 海狗是什么动物| 清朝皇帝姓什么| 胖脸适合什么发型| rv医学上是什么意思| 房颤有什么症状| 卵泡刺激素是什么意思| 鸟屎掉头上有什么预兆| 肛门周围痒是什么原因| 呕血是什么意思| 什么是面瘫| 双侧骶髂关节致密性骨炎是什么病| 深圳居住证有什么用| bpm什么意思| 受用是什么意思| 哗众取宠是什么意思| 上当是什么意思| 朱砂是什么做的| 湿气重喝什么茶好| 线下是什么意思| 进德勤一般要什么学历| 国企属于什么编制| 无功无过是什么意思| 哲五行属什么| 2014是什么年| 甲减吃什么食物好| 淋巴结为什么会肿大| 什么饮料解酒效果最好| 三尖瓣反流是什么意思| 九斗一簸箕有什么说法| 农历9月21日是什么星座| icu是什么意思| 血氧低是什么原因| 什么样的疤痕影响当兵| 屋上土是什么意思| 半套是什么意思| 超市属于什么行业| 为什么会得经期综合症| 眼睛做激光手术有什么后遗症| 身心疲惫是什么意思| 脚后跟开裂是什么原因| 胃溃疡吃什么| 分水岭是什么意思| 小孩子睡觉磨牙是什么原因| 今年七夕节是什么时候| 人活着意义是什么| 夜未央什么意思| 开塞露是干什么用的| 吃什么能补肾| 2006年出生的是什么命| 楠字五行属什么| 身上长癣是什么原因引起的| 女人身体弱带什么辟邪| ms什么意思| 为什么会得肾结石| 牙疼是什么病的前兆| 女m是什么意思| 吹空调头疼是什么原因| 尿结石挂什么科| 六角龙鱼吃什么| 什么食物对肝有好处| 吃什么可以壮阳| 为什么会湿气重| 金水宝胶囊有什么作用| 血镁偏高是什么原因| 如如不动是什么意思| 许三多最后是什么军衔| 曹操什么星座| 早上起床吐痰带血是什么原因| gcp是什么意思| 什么是激素药| 身主天机是什么意思| 哈哈是什么意思| 百度

空降兵属于什么兵种


Directory: ../../../ffmpeg/
File: src/libavformat/r3d.c
Date: 2025-08-04 00:43:16
Exec Total Coverage
Lines: 144 228 63.2%
Functions: 7 10 70.0%
Branches: 41 93 44.1%

Line Branch Exec Source
1 /*
2 * R3D REDCODE demuxer
3 * Copyright (c) 2008 Baptiste Coudurier <baptiste dot coudurier at gmail dot com>
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 #include "libavutil/intreadwrite.h"
23 #include "libavutil/dict.h"
24 #include "libavutil/mathematics.h"
25 #include "avformat.h"
26 #include "demux.h"
27 #include "internal.h"
28
29 typedef struct R3DContext {
30 unsigned video_offsets_count;
31 unsigned rdvo_offset;
32
33 int audio_channels;
34 } R3DContext;
35
36 typedef struct Atom {
37 unsigned size;
38 uint32_t tag;
39 uint64_t offset;
40 } Atom;
41
42 9 static int read_atom(AVFormatContext *s, Atom *atom)
43 {
44 9 atom->offset = avio_tell(s->pb);
45 9 atom->size = avio_rb32(s->pb);
46
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7 times.
9 if (atom->size < 8)
47 2 return -1;
48 7 atom->tag = avio_rl32(s->pb);
49 7 av_log(s, AV_LOG_TRACE, "atom %u %.4s offset %#"PRIx64"\n",
50 7 atom->size, (char*)&atom->tag, atom->offset);
51 7 return atom->size;
52 }
53
54 1 static int r3d_read_red1(AVFormatContext *s)
55 {
56 1 AVStream *st = avformat_new_stream(s, NULL);
57 1 R3DContext *r3d = s->priv_data;
58 char filename[258];
59 int tmp;
60 int ret;
61 int av_unused tmp2;
62 AVRational framerate;
63
64
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if (!st)
65 return AVERROR(ENOMEM);
66 1 st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
67 1 st->codecpar->codec_id = AV_CODEC_ID_JPEG2000;
68
69 1 tmp = avio_r8(s->pb); // major version
70 1 tmp2 = avio_r8(s->pb); // minor version
71 1 av_log(s, AV_LOG_TRACE, "version %d.%d\n", tmp, tmp2);
72
73 1 tmp = avio_rb16(s->pb); // unknown
74 1 av_log(s, AV_LOG_TRACE, "unknown1 %d\n", tmp);
75
76 1 tmp = avio_rb32(s->pb);
77 1 avpriv_set_pts_info(st, 32, 1, tmp);
78
79 1 tmp = avio_rb32(s->pb); // filenum
80 1 av_log(s, AV_LOG_TRACE, "filenum %d\n", tmp);
81
82 1 avio_skip(s->pb, 32); // unknown
83
84 1 st->codecpar->width = avio_rb32(s->pb);
85 1 st->codecpar->height = avio_rb32(s->pb);
86
87 1 tmp = avio_rb16(s->pb); // unknown
88 1 av_log(s, AV_LOG_TRACE, "unknown2 %d\n", tmp);
89
90 1 framerate.num = avio_rb16(s->pb);
91 1 framerate.den = avio_rb16(s->pb);
92
2/4
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 if (framerate.num > 0 && framerate.den > 0) {
93 #if FF_API_R_FRAME_RATE
94 1 st->r_frame_rate =
95 #endif
96 1 st->avg_frame_rate = framerate;
97 }
98
99 1 r3d->audio_channels = avio_r8(s->pb); // audio channels
100 1 av_log(s, AV_LOG_TRACE, "audio channels %d\n", tmp);
101
102 1 ret = avio_read(s->pb, filename, 257);
103
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if (ret < 257)
104 return ret < 0 ? ret : AVERROR_EOF;
105 1 filename[sizeof(filename)-1] = 0;
106 1 av_dict_set(&st->metadata, "filename", filename, 0);
107
108 1 av_log(s, AV_LOG_TRACE, "filename %s\n", filename);
109 1 av_log(s, AV_LOG_TRACE, "resolution %dx%d\n", st->codecpar->width, st->codecpar->height);
110 1 av_log(s, AV_LOG_TRACE, "timescale %d\n", st->time_base.den);
111 1 av_log(s, AV_LOG_TRACE, "frame rate %d/%d\n",
112 framerate.num, framerate.den);
113
114 1 return 0;
115 }
116
117 static int r3d_read_rdvo(AVFormatContext *s, Atom *atom)
118 {
119 R3DContext *r3d = s->priv_data;
120 AVStream *st = s->streams[0];
121 int i;
122
123 r3d->video_offsets_count = (atom->size - 8) / 4;
124
125 for (i = 0; i < r3d->video_offsets_count; i++) {
126 unsigned video_offset = avio_rb32(s->pb);
127 if (!video_offset) {
128 r3d->video_offsets_count = i;
129 break;
130 }
131 av_log(s, AV_LOG_TRACE, "video offset %d: %#x\n", i, video_offset);
132 }
133
134 if (st->avg_frame_rate.num)
135 st->duration = av_rescale_q(r3d->video_offsets_count,
136 av_inv_q(st->avg_frame_rate),
137 st->time_base);
138 av_log(s, AV_LOG_TRACE, "duration %"PRId64"\n", st->duration);
139
140 return 0;
141 }
142
143 static void r3d_read_reos(AVFormatContext *s)
144 {
145 R3DContext *r3d = s->priv_data;
146 int av_unused tmp;
147
148 r3d->rdvo_offset = avio_rb32(s->pb);
149 avio_rb32(s->pb); // rdvs offset
150 avio_rb32(s->pb); // rdao offset
151 avio_rb32(s->pb); // rdas offset
152
153 tmp = avio_rb32(s->pb);
154 av_log(s, AV_LOG_TRACE, "num video chunks %d\n", tmp);
155
156 tmp = avio_rb32(s->pb);
157 av_log(s, AV_LOG_TRACE, "num audio chunks %d\n", tmp);
158
159 avio_skip(s->pb, 6*4);
160 }
161
162 1 static int r3d_read_header(AVFormatContext *s)
163 {
164 1 FFFormatContext *const si = ffformatcontext(s);
165 1 R3DContext *r3d = s->priv_data;
166 Atom atom;
167 int ret;
168
169
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
1 if (read_atom(s, &atom) < 0) {
170 av_log(s, AV_LOG_ERROR, "error reading atom\n");
171 return -1;
172 }
173
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if (atom.tag == MKTAG('R','E','D','1')) {
174
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
1 if ((ret = r3d_read_red1(s)) < 0) {
175 av_log(s, AV_LOG_ERROR, "error parsing 'red1' atom\n");
176 return ret;
177 }
178 } else {
179 av_log(s, AV_LOG_ERROR, "could not find 'red1' atom\n");
180 return -1;
181 }
182
183 /* we cannot create the audio stream now because we do not know the
184 * sample rate */
185
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if (r3d->audio_channels)
186 1 s->ctx_flags |= AVFMTCTX_NOHEADER;
187
188 1 si->data_offset = avio_tell(s->pb);
189 1 av_log(s, AV_LOG_TRACE, "data offset %#"PRIx64"\n", si->data_offset);
190
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL))
191 return 0;
192 // find REOB/REOF/REOS to load index
193 1 avio_seek(s->pb, avio_size(s->pb)-48-8, SEEK_SET);
194
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
1 if (read_atom(s, &atom) < 0)
195 av_log(s, AV_LOG_ERROR, "error reading end atom\n");
196
197
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if (atom.tag != MKTAG('R','E','O','B') &&
198
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 atom.tag != MKTAG('R','E','O','F') &&
199
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 atom.tag != MKTAG('R','E','O','S'))
200 1 goto out;
201
202 r3d_read_reos(s);
203
204 if (r3d->rdvo_offset) {
205 avio_seek(s->pb, r3d->rdvo_offset, SEEK_SET);
206 if (read_atom(s, &atom) < 0)
207 av_log(s, AV_LOG_ERROR, "error reading 'rdvo' atom\n");
208 if (atom.tag == MKTAG('R','D','V','O')) {
209 if (r3d_read_rdvo(s, &atom) < 0)
210 av_log(s, AV_LOG_ERROR, "error parsing 'rdvo' atom\n");
211 }
212 }
213
214 out:
215 1 avio_seek(s->pb, si->data_offset, SEEK_SET);
216 1 return 0;
217 }
218
219 3 static int r3d_read_redv(AVFormatContext *s, AVPacket *pkt, Atom *atom)
220 {
221 3 AVStream *st = s->streams[0];
222 int tmp;
223 int av_unused tmp2;
224 3 int64_t pos = avio_tell(s->pb);
225 unsigned dts;
226 int ret;
227
228 3 dts = avio_rb32(s->pb);
229
230 3 tmp = avio_rb32(s->pb);
231 3 av_log(s, AV_LOG_TRACE, "frame num %d\n", tmp);
232
233 3 tmp = avio_r8(s->pb); // major version
234 3 tmp2 = avio_r8(s->pb); // minor version
235 3 av_log(s, AV_LOG_TRACE, "version %d.%d\n", tmp, tmp2);
236
237 3 tmp = avio_rb16(s->pb); // unknown
238 3 av_log(s, AV_LOG_TRACE, "unknown %d\n", tmp);
239
240
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if (tmp > 4) {
241 tmp = avio_rb16(s->pb); // unknown
242 av_log(s, AV_LOG_TRACE, "unknown %d\n", tmp);
243
244 tmp = avio_rb16(s->pb); // unknown
245 av_log(s, AV_LOG_TRACE, "unknown %d\n", tmp);
246
247 tmp = avio_rb32(s->pb);
248 av_log(s, AV_LOG_TRACE, "width %d\n", tmp);
249 tmp = avio_rb32(s->pb);
250 av_log(s, AV_LOG_TRACE, "height %d\n", tmp);
251
252 tmp = avio_rb32(s->pb);
253 av_log(s, AV_LOG_TRACE, "metadata len %d\n", tmp);
254 }
255 3 tmp = atom->size - 8 - (avio_tell(s->pb) - pos);
256
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if (tmp < 0)
257 return -1;
258 3 ret = av_get_packet(s->pb, pkt, tmp);
259
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if (ret < 0) {
260 av_log(s, AV_LOG_ERROR, "error reading video packet\n");
261 return -1;
262 }
263
264 3 pkt->stream_index = 0;
265 3 pkt->dts = dts;
266
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 if (st->avg_frame_rate.num)
267 3 pkt->duration = (uint64_t)st->time_base.den*
268 3 st->avg_frame_rate.den/st->avg_frame_rate.num;
269 3 av_log(s, AV_LOG_TRACE, "pkt dts %"PRId64" duration %"PRId64"\n", pkt->dts, pkt->duration);
270
271 3 return 0;
272 }
273
274 2 static int r3d_read_reda(AVFormatContext *s, AVPacket *pkt, Atom *atom)
275 {
276 2 R3DContext *r3d = s->priv_data;
277 AVStream *st;
278 int av_unused tmp, tmp2;
279 int samples, size;
280 2 int64_t pos = avio_tell(s->pb);
281 unsigned dts;
282 int ret;
283
284
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
2 if (s->nb_streams < 2) {
285 1 st = avformat_new_stream(s, NULL);
286
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if (!st)
287 return AVERROR(ENOMEM);
288 1 st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
289 1 st->codecpar->codec_id = AV_CODEC_ID_PCM_S32BE;
290 1 st->codecpar->ch_layout.nb_channels = r3d->audio_channels;
291 1 avpriv_set_pts_info(st, 32, 1, s->streams[0]->time_base.den);
292 } else {
293 1 st = s->streams[1];
294 }
295
296 2 dts = avio_rb32(s->pb);
297
298 2 st->codecpar->sample_rate = avio_rb32(s->pb);
299
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (st->codecpar->sample_rate <= 0) {
300 av_log(s, AV_LOG_ERROR, "Bad sample rate\n");
301 return AVERROR_INVALIDDATA;
302 }
303
304 2 samples = avio_rb32(s->pb);
305
306 2 tmp = avio_rb32(s->pb);
307 2 av_log(s, AV_LOG_TRACE, "packet num %d\n", tmp);
308
309 2 tmp = avio_rb16(s->pb); // unknown
310 2 av_log(s, AV_LOG_TRACE, "unknown %d\n", tmp);
311
312 2 tmp = avio_r8(s->pb); // major version
313 2 tmp2 = avio_r8(s->pb); // minor version
314 2 av_log(s, AV_LOG_TRACE, "version %d.%d\n", tmp, tmp2);
315
316 2 tmp = avio_rb32(s->pb); // unknown
317 2 av_log(s, AV_LOG_TRACE, "unknown %d\n", tmp);
318
319 2 size = atom->size - 8 - (avio_tell(s->pb) - pos);
320
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (size < 0)
321 return -1;
322 2 ret = av_get_packet(s->pb, pkt, size);
323
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (ret < 0) {
324 av_log(s, AV_LOG_ERROR, "error reading audio packet\n");
325 return ret;
326 }
327
328 2 pkt->stream_index = 1;
329 2 pkt->dts = dts;
330
331
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 if (st->codecpar->sample_rate && samples > 0)
332 2 pkt->duration = av_rescale(samples, st->time_base.den, st->codecpar->sample_rate);
333 2 av_log(s, AV_LOG_TRACE, "pkt dts %"PRId64" duration %"PRId64" samples %d sample rate %d\n",
334 2 pkt->dts, pkt->duration, samples, st->codecpar->sample_rate);
335
336 2 return 0;
337 }
338
339 7 static int r3d_read_packet(AVFormatContext *s, AVPacket *pkt)
340 {
341 7 R3DContext *r3d = s->priv_data;
342 Atom atom;
343 7 int err = 0;
344
345
1/2
✓ Branch 0 taken 7 times.
✗ Branch 1 not taken.
7 while (!err) {
346
2/2
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 5 times.
7 if (read_atom(s, &atom) < 0) {
347 2 err = -1;
348 2 break;
349 }
350
2/3
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
5 switch (atom.tag) {
351 3 case MKTAG('R','E','D','V'):
352
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if (s->streams[0]->discard == AVDISCARD_ALL)
353 goto skip;
354
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 if (!(err = r3d_read_redv(s, pkt, &atom)))
355 3 return 0;
356 break;
357 2 case MKTAG('R','E','D','A'):
358
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (!r3d->audio_channels)
359 return -1;
360
3/4
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
2 if (s->nb_streams >= 2 && s->streams[1]->discard == AVDISCARD_ALL)
361 goto skip;
362
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 if (!(err = r3d_read_reda(s, pkt, &atom)))
363 2 return 0;
364 break;
365 default:
366 skip:
367 avio_skip(s->pb, atom.size-8);
368 }
369 }
370 2 return err;
371 }
372
373 7241 static int r3d_probe(const AVProbeData *p)
374 {
375
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 7240 times.
7241 if (AV_RL32(p->buf + 4) == MKTAG('R','E','D','1'))
376 1 return AVPROBE_SCORE_MAX;
377 7240 return 0;
378 }
379
380 static int r3d_seek(AVFormatContext *s, int stream_index, int64_t sample_time, int flags)
381 {
382 AVStream *st = s->streams[0]; // video stream
383 R3DContext *r3d = s->priv_data;
384 int frame_num;
385
386 if (!st->avg_frame_rate.num)
387 return -1;
388
389 frame_num = av_rescale_q(sample_time, st->time_base,
390 av_inv_q(st->avg_frame_rate));
391 av_log(s, AV_LOG_TRACE, "seek frame num %d timestamp %"PRId64"\n",
392 frame_num, sample_time);
393
394 if (frame_num < r3d->video_offsets_count) {
395 if (avio_seek(s->pb, r3d->video_offsets_count, SEEK_SET) < 0)
396 return -1;
397 } else {
398 av_log(s, AV_LOG_ERROR, "could not seek to frame %d\n", frame_num);
399 return -1;
400 }
401
402 return 0;
403 }
404
405 const FFInputFormat ff_r3d_demuxer = {
406 .p.name = "r3d",
407 .p.long_name = NULL_IF_CONFIG_SMALL("REDCODE R3D"),
408 .priv_data_size = sizeof(R3DContext),
409 .read_probe = r3d_probe,
410 .read_header = r3d_read_header,
411 .read_packet = r3d_read_packet,
412 .read_seek = r3d_seek,
413 };
414

mac版本是什么意思 菌丝是什么 十二月十号是什么星座 湿疹有什么特效药 吃什么补记忆力最快
胎儿打嗝是什么原因 间质性改变是什么意思 舌尖溃疡是什么原因 眼屎多是什么原因 马头岩肉桂是什么茶
芙蓉是什么意思 羞羞是什么意思 14年婚姻是什么婚 与生俱来是什么意思 为什么一同房就出血
珮字五行属什么 柑橘溃疡病用什么药 工装裤配什么鞋 乳腺低回声是什么意思 母亲ab型父亲o型孩子什么血型
弥漫性肝病是什么意思hcv7jop7ns3r.cn 控诉是什么意思hcv8jop4ns3r.cn 4.14是什么星座hcv9jop7ns2r.cn 微量元素挂什么科ff14chat.com 五音是什么hcv9jop7ns0r.cn
门庭若什么hcv8jop1ns3r.cn 黑发晶五行属什么hcv8jop2ns0r.cn 什么是破窗效应hcv9jop6ns9r.cn 胆囊结石不宜吃什么hcv8jop3ns8r.cn 我一言难尽忍不住伤心是什么歌hcv8jop0ns2r.cn
孔雀的尾巴像什么zhiyanzhang.com 烂脚丫用什么药能治除根hcv9jop6ns8r.cn 马拉色菌是什么hcv8jop6ns9r.cn 做喉镜能检查出什么病hcv8jop3ns8r.cn 为什么明星不激光祛斑hcv8jop7ns0r.cn
1450是什么意思hcv9jop7ns9r.cn 盗墓笔记讲的是什么故事qingzhougame.com 层林尽染是什么季节hcv9jop7ns1r.cn 耳石症是什么意思hcv9jop5ns5r.cn 什么样的水果hcv8jop4ns6r.cn
百度