Mercurial > libavformat.hg
annotate nuv.c @ 3754:8d267b43eaba libavformat
Move malloc() down until after all initializations, so that the resource is
only allocated if initialization worked. This means that on failure, we
don't have to deallocate it.
author | rbultje |
---|---|
date | Sat, 23 Aug 2008 18:46:30 +0000 |
parents | 50106b4dd6ba |
children | 27537074f2a9 |
rev | line source |
---|---|
1044
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
1 /* |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
2 * NuppelVideo demuxer. |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
3 * Copyright (c) 2006 Reimar Doeffinger. |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
4 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1172
diff
changeset
|
5 * This file is part of FFmpeg. |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1172
diff
changeset
|
6 * |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1172
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
1044
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Lesser General Public |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
9 * License as published by the Free Software Foundation; either |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1172
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
1044
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
11 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1172
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
1044
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
15 * Lesser General Public License for more details. |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
16 * |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
17 * You should have received a copy of the GNU Lesser General Public |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1172
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
1044
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
20 */ |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
21 #include "avformat.h" |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
1169
diff
changeset
|
22 #include "riff.h" |
1044
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
23 |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
24 typedef struct { |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
25 int v_id; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
26 int a_id; |
2536 | 27 int rtjpg_video; |
1044
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
28 } NUVContext; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
29 |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
30 typedef enum { |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
31 NUV_VIDEO = 'V', |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
32 NUV_EXTRADATA = 'D', |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
33 NUV_AUDIO = 'A', |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
34 NUV_SEEKP = 'R', |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
35 NUV_MYTHEXT = 'X' |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
36 } frametype_t; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
37 |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
38 static int nuv_probe(AVProbeData *p) { |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
39 if (!memcmp(p->buf, "NuppelVideo", 12)) |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
40 return AVPROBE_SCORE_MAX; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
41 if (!memcmp(p->buf, "MythTVVideo", 12)) |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
42 return AVPROBE_SCORE_MAX; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
43 return 0; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
44 } |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
45 |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
46 //! little macro to sanitize packet size |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
47 #define PKTSIZE(s) (s & 0xffffff) |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
48 |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
49 /** |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
50 * \brief read until we found all data needed for decoding |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
51 * \param vst video stream of which to change parameters |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
52 * \param ast video stream of which to change parameters |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
53 * \param myth set if this is a MythTVVideo format file |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
54 * \return 1 if all required codec data was found |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
55 */ |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
56 static int get_codec_data(ByteIOContext *pb, AVStream *vst, |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
57 AVStream *ast, int myth) { |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
58 frametype_t frametype; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
59 if (!vst && !myth) |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
60 return 1; // no codec data needed |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
61 while (!url_feof(pb)) { |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
62 int size, subtype; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
63 frametype = get_byte(pb); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
64 switch (frametype) { |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
65 case NUV_EXTRADATA: |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
66 subtype = get_byte(pb); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
67 url_fskip(pb, 6); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
68 size = PKTSIZE(get_le32(pb)); |
1064
bd570485d419
Avoid crash if there is a rtjpeg quant header but no video stream in file
reimar
parents:
1044
diff
changeset
|
69 if (vst && subtype == 'R') { |
1044
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
70 vst->codec->extradata_size = size; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
71 vst->codec->extradata = av_malloc(size); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
72 get_buffer(pb, vst->codec->extradata, size); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
73 size = 0; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
74 if (!myth) |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
75 return 1; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
76 } |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
77 break; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
78 case NUV_MYTHEXT: |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
79 url_fskip(pb, 7); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
80 size = PKTSIZE(get_le32(pb)); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
81 if (size != 128 * 4) |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
82 break; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
83 get_le32(pb); // version |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
84 if (vst) { |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
85 vst->codec->codec_tag = get_le32(pb); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
86 vst->codec->codec_id = |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
87 codec_get_id(codec_bmp_tags, vst->codec->codec_tag); |
2552 | 88 if (vst->codec->codec_tag == MKTAG('R', 'J', 'P', 'G')) |
89 vst->codec->codec_id = CODEC_ID_NUV; | |
1044
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
90 } else |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
91 url_fskip(pb, 4); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
92 |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
93 if (ast) { |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
94 ast->codec->codec_tag = get_le32(pb); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
95 ast->codec->sample_rate = get_le32(pb); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
96 ast->codec->bits_per_sample = get_le32(pb); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
97 ast->codec->channels = get_le32(pb); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
98 ast->codec->codec_id = |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
99 wav_codec_get_id(ast->codec->codec_tag, |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
100 ast->codec->bits_per_sample); |
2100 | 101 ast->need_parsing = AVSTREAM_PARSE_FULL; |
1044
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
102 } else |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
103 url_fskip(pb, 4 * 4); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
104 |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
105 size -= 6 * 4; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
106 url_fskip(pb, size); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
107 return 1; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
108 case NUV_SEEKP: |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
109 size = 11; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
110 break; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
111 default: |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
112 url_fskip(pb, 7); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
113 size = PKTSIZE(get_le32(pb)); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
114 break; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
115 } |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
116 url_fskip(pb, size); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
117 } |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
118 return 0; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
119 } |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
120 |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
121 static int nuv_header(AVFormatContext *s, AVFormatParameters *ap) { |
2006 | 122 NUVContext *ctx = s->priv_data; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2552
diff
changeset
|
123 ByteIOContext *pb = s->pb; |
1044
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
124 char id_string[12], version_string[5]; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
125 double aspect, fps; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
126 int is_mythtv, width, height, v_packs, a_packs; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
127 int stream_nr = 0; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
128 AVStream *vst = NULL, *ast = NULL; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
129 get_buffer(pb, id_string, 12); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
130 is_mythtv = !memcmp(id_string, "MythTVVideo", 12); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
131 get_buffer(pb, version_string, 5); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
132 url_fskip(pb, 3); // padding |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
133 width = get_le32(pb); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
134 height = get_le32(pb); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
135 get_le32(pb); // unused, "desiredwidth" |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
136 get_le32(pb); // unused, "desiredheight" |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
137 get_byte(pb); // 'P' == progressive, 'I' == interlaced |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
138 url_fskip(pb, 3); // padding |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
139 aspect = av_int2dbl(get_le64(pb)); |
3598
50106b4dd6ba
Fix handling of old nuv files where an aspect of 1 actually means 4/3
reimar
parents:
3597
diff
changeset
|
140 if (aspect > 0.9999 && aspect < 1.0001) |
50106b4dd6ba
Fix handling of old nuv files where an aspect of 1 actually means 4/3
reimar
parents:
3597
diff
changeset
|
141 aspect = 4.0 / 3.0; |
1044
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
142 fps = av_int2dbl(get_le64(pb)); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
143 |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
144 // number of packets per stream type, -1 means unknown, e.g. streaming |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
145 v_packs = get_le32(pb); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
146 a_packs = get_le32(pb); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
147 get_le32(pb); // text |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
148 |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
149 get_le32(pb); // keyframe distance (?) |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
150 |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
151 if (v_packs) { |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
152 ctx->v_id = stream_nr++; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
153 vst = av_new_stream(s, ctx->v_id); |
3401 | 154 if (!vst) |
155 return AVERROR(ENOMEM); | |
1044
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
156 vst->codec->codec_type = CODEC_TYPE_VIDEO; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
157 vst->codec->codec_id = CODEC_ID_NUV; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
158 vst->codec->width = width; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
159 vst->codec->height = height; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
160 vst->codec->bits_per_sample = 10; |
3597
cfa94f80be53
aspect stored in nuv files must be converted from display- to sample-aspect.
reimar
parents:
3547
diff
changeset
|
161 vst->codec->sample_aspect_ratio = av_d2q(aspect * height / width, 10000); |
1749
3711f46dcb98
10l to whoever wrote this (wrong fps, fixes nirvana.nuv)
michael
parents:
1673
diff
changeset
|
162 vst->r_frame_rate = av_d2q(fps, 60000); |
1044
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
163 av_set_pts_info(vst, 32, 1, 1000); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
164 } else |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
165 ctx->v_id = -1; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
166 |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
167 if (a_packs) { |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
168 ctx->a_id = stream_nr++; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
169 ast = av_new_stream(s, ctx->a_id); |
3401 | 170 if (!ast) |
171 return AVERROR(ENOMEM); | |
1044
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
172 ast->codec->codec_type = CODEC_TYPE_AUDIO; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
173 ast->codec->codec_id = CODEC_ID_PCM_S16LE; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
174 ast->codec->channels = 2; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
175 ast->codec->sample_rate = 44100; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
176 ast->codec->bit_rate = 2 * 2 * 44100 * 8; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
177 ast->codec->block_align = 2 * 2; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
178 ast->codec->bits_per_sample = 16; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
179 av_set_pts_info(ast, 32, 1, 1000); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
180 } else |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
181 ctx->a_id = -1; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
182 |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
183 get_codec_data(pb, vst, ast, is_mythtv); |
3547
771cf9f79fd6
10l, fix nuv_header for the case when there is no video stream.
reimar
parents:
3424
diff
changeset
|
184 ctx->rtjpg_video = vst && vst->codec->codec_id == CODEC_ID_NUV; |
1044
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
185 return 0; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
186 } |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
187 |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
188 #define HDRSIZE 12 |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
189 |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
190 static int nuv_packet(AVFormatContext *s, AVPacket *pkt) { |
2006 | 191 NUVContext *ctx = s->priv_data; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2552
diff
changeset
|
192 ByteIOContext *pb = s->pb; |
1044
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
193 uint8_t hdr[HDRSIZE]; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
194 frametype_t frametype; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
195 int ret, size; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
196 while (!url_feof(pb)) { |
2536 | 197 int copyhdrsize = ctx->rtjpg_video ? HDRSIZE : 0; |
1044
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
198 ret = get_buffer(pb, hdr, HDRSIZE); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
199 if (ret <= 0) |
1109
725b291bf94f
read_packet return value must be < 0 when no packet is returned, including EOF.
reimar
parents:
1064
diff
changeset
|
200 return ret ? ret : -1; |
1044
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
201 frametype = hdr[0]; |
1673 | 202 size = PKTSIZE(AV_RL32(&hdr[8])); |
1044
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
203 switch (frametype) { |
2536 | 204 case NUV_EXTRADATA: |
205 if (!ctx->rtjpg_video) { | |
206 url_fskip(pb, size); | |
207 break; | |
208 } | |
1044
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
209 case NUV_VIDEO: |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
210 if (ctx->v_id < 0) { |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
211 av_log(s, AV_LOG_ERROR, "Video packet in file without video stream!\n"); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
212 url_fskip(pb, size); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
213 break; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
214 } |
2536 | 215 ret = av_new_packet(pkt, copyhdrsize + size); |
1044
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
216 if (ret < 0) |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
217 return ret; |
2536 | 218 pkt->pos = url_ftell(pb) - copyhdrsize; |
1673 | 219 pkt->pts = AV_RL32(&hdr[4]); |
1044
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
220 pkt->stream_index = ctx->v_id; |
2536 | 221 memcpy(pkt->data, hdr, copyhdrsize); |
222 ret = get_buffer(pb, pkt->data + copyhdrsize, size); | |
1044
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
223 return ret; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
224 case NUV_AUDIO: |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
225 if (ctx->a_id < 0) { |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
226 av_log(s, AV_LOG_ERROR, "Audio packet in file without audio stream!\n"); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
227 url_fskip(pb, size); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
228 break; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
229 } |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
230 ret = av_get_packet(pb, pkt, size); |
1673 | 231 pkt->pts = AV_RL32(&hdr[4]); |
1044
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
232 pkt->stream_index = ctx->a_id; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
233 return ret; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
234 case NUV_SEEKP: |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
235 // contains no data, size value is invalid |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
236 break; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
237 default: |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
238 url_fskip(pb, size); |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
239 break; |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
240 } |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
241 } |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2100
diff
changeset
|
242 return AVERROR(EIO); |
1044
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
243 } |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
244 |
1169 | 245 AVInputFormat nuv_demuxer = { |
1044
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
246 "nuv", |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
3401
diff
changeset
|
247 NULL_IF_CONFIG_SMALL("NuppelVideo format"), |
1044
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
248 sizeof(NUVContext), |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
249 nuv_probe, |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
250 nuv_header, |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
251 nuv_packet, |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
252 NULL, |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
253 NULL, |
3aeb079a7e74
NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff
changeset
|
254 }; |