3 * Copyright (c) 2006 Reimar Doeffinger.
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
35 static int nuv_probe(AVProbeData
*p
) {
38 if (!memcmp(p
->buf
, "NuppelVideo", 12))
39 return AVPROBE_SCORE_MAX
;
40 if (!memcmp(p
->buf
, "MythTVVideo", 12))
41 return AVPROBE_SCORE_MAX
;
45 //! little macro to sanitize packet size
46 #define PKTSIZE(s) (s & 0xffffff)
49 * \brief read until we found all data needed for decoding
50 * \param vst video stream of which to change parameters
51 * \param ast video stream of which to change parameters
52 * \param myth set if this is a MythTVVideo format file
53 * \return 1 if all required codec data was found
55 static int get_codec_data(ByteIOContext
*pb
, AVStream
*vst
,
56 AVStream
*ast
, int myth
) {
57 frametype_t frametype
;
59 return 1; // no codec data needed
60 while (!url_feof(pb
)) {
62 frametype
= get_byte(pb
);
65 subtype
= get_byte(pb
);
67 size
= PKTSIZE(get_le32(pb
));
69 vst
->codec
->extradata_size
= size
;
70 vst
->codec
->extradata
= av_malloc(size
);
71 get_buffer(pb
, vst
->codec
->extradata
, size
);
79 size
= PKTSIZE(get_le32(pb
));
82 get_le32(pb
); // version
84 vst
->codec
->codec_tag
= get_le32(pb
);
85 vst
->codec
->codec_id
=
86 codec_get_id(codec_bmp_tags
, vst
->codec
->codec_tag
);
91 ast
->codec
->codec_tag
= get_le32(pb
);
92 ast
->codec
->sample_rate
= get_le32(pb
);
93 ast
->codec
->bits_per_sample
= get_le32(pb
);
94 ast
->codec
->channels
= get_le32(pb
);
95 ast
->codec
->codec_id
=
96 wav_codec_get_id(ast
->codec
->codec_tag
,
97 ast
->codec
->bits_per_sample
);
109 size
= PKTSIZE(get_le32(pb
));
117 static int nuv_header(AVFormatContext
*s
, AVFormatParameters
*ap
) {
118 NUVContext
*ctx
= (NUVContext
*)s
->priv_data
;
119 ByteIOContext
*pb
= &s
->pb
;
120 char id_string
[12], version_string
[5];
122 int is_mythtv
, width
, height
, v_packs
, a_packs
;
124 AVStream
*vst
= NULL
, *ast
= NULL
;
125 get_buffer(pb
, id_string
, 12);
126 is_mythtv
= !memcmp(id_string
, "MythTVVideo", 12);
127 get_buffer(pb
, version_string
, 5);
128 url_fskip(pb
, 3); // padding
129 width
= get_le32(pb
);
130 height
= get_le32(pb
);
131 get_le32(pb
); // unused, "desiredwidth"
132 get_le32(pb
); // unused, "desiredheight"
133 get_byte(pb
); // 'P' == progressive, 'I' == interlaced
134 url_fskip(pb
, 3); // padding
135 aspect
= av_int2dbl(get_le64(pb
));
136 fps
= av_int2dbl(get_le64(pb
));
138 // number of packets per stream type, -1 means unknown, e.g. streaming
139 v_packs
= get_le32(pb
);
140 a_packs
= get_le32(pb
);
141 get_le32(pb
); // text
143 get_le32(pb
); // keyframe distance (?)
146 ctx
->v_id
= stream_nr
++;
147 vst
= av_new_stream(s
, ctx
->v_id
);
148 vst
->codec
->codec_type
= CODEC_TYPE_VIDEO
;
149 vst
->codec
->codec_id
= CODEC_ID_NUV
;
150 vst
->codec
->codec_tag
= MKTAG('R', 'J', 'P', 'G');
151 vst
->codec
->width
= width
;
152 vst
->codec
->height
= height
;
153 vst
->codec
->bits_per_sample
= 10;
154 vst
->codec
->sample_aspect_ratio
= av_d2q(aspect
, 10000);
155 vst
->r_frame_rate
= av_d2q(1.0 / fps
, 10000);
156 av_set_pts_info(vst
, 32, 1, 1000);
161 ctx
->a_id
= stream_nr
++;
162 ast
= av_new_stream(s
, ctx
->a_id
);
163 ast
->codec
->codec_type
= CODEC_TYPE_AUDIO
;
164 ast
->codec
->codec_id
= CODEC_ID_PCM_S16LE
;
165 ast
->codec
->channels
= 2;
166 ast
->codec
->sample_rate
= 44100;
167 ast
->codec
->bit_rate
= 2 * 2 * 44100 * 8;
168 ast
->codec
->block_align
= 2 * 2;
169 ast
->codec
->bits_per_sample
= 16;
170 av_set_pts_info(ast
, 32, 1, 1000);
174 get_codec_data(pb
, vst
, ast
, is_mythtv
);
180 static int nuv_packet(AVFormatContext
*s
, AVPacket
*pkt
) {
181 NUVContext
*ctx
= (NUVContext
*)s
->priv_data
;
182 ByteIOContext
*pb
= &s
->pb
;
183 uint8_t hdr
[HDRSIZE
];
184 frametype_t frametype
;
186 while (!url_feof(pb
)) {
187 ret
= get_buffer(pb
, hdr
, HDRSIZE
);
191 size
= PKTSIZE(LE_32(&hdr
[8]));
196 av_log(s
, AV_LOG_ERROR
, "Video packet in file without video stream!\n");
200 ret
= av_new_packet(pkt
, HDRSIZE
+ size
);
203 pkt
->pos
= url_ftell(pb
);
204 pkt
->pts
= LE_32(&hdr
[4]);
205 pkt
->stream_index
= ctx
->v_id
;
206 memcpy(pkt
->data
, hdr
, HDRSIZE
);
207 ret
= get_buffer(pb
, pkt
->data
+ HDRSIZE
, size
);
211 av_log(s
, AV_LOG_ERROR
, "Audio packet in file without audio stream!\n");
215 ret
= av_get_packet(pb
, pkt
, size
);
216 pkt
->pts
= LE_32(&hdr
[4]);
217 pkt
->stream_index
= ctx
->a_id
;
220 // contains no data, size value is invalid
230 static AVInputFormat nuv_iformat
= {
232 "NuppelVideo format",
242 av_register_input_format(&nuv_iformat
);