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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
fb7c72af3a61 Copy nuv header only when the video codec is nuv
reimar
parents: 2274
diff changeset
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
937b5d76c3dd Set codec_id correctly for RJPG codec_tag
reimar
parents: 2537
diff changeset
88 if (vst->codec->codec_tag == MKTAG('R', 'J', 'P', 'G'))
937b5d76c3dd Set codec_id correctly for RJPG codec_tag
reimar
parents: 2537
diff changeset
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
33a90cc1a5de fix "incorrect frame size" errors with small.nuv
michael
parents: 2006
diff changeset
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
2f0154760e5f Get rid of unnecessary pointer casts.
diego
parents: 2001
diff changeset
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
1ea33ee5ed04 Check av_new_stream return value, fixes CID79 RUN2
reimar
parents: 2771
diff changeset
154 if (!vst)
1ea33ee5ed04 Check av_new_stream return value, fixes CID79 RUN2
reimar
parents: 2771
diff changeset
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
1ea33ee5ed04 Check av_new_stream return value, fixes CID79 RUN2
reimar
parents: 2771
diff changeset
170 if (!ast)
1ea33ee5ed04 Check av_new_stream return value, fixes CID79 RUN2
reimar
parents: 2771
diff changeset
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
2f0154760e5f Get rid of unnecessary pointer casts.
diego
parents: 2001
diff changeset
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
fb7c72af3a61 Copy nuv header only when the video codec is nuv
reimar
parents: 2274
diff changeset
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
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1358
diff changeset
202 size = PKTSIZE(AV_RL32(&hdr[8]));
1044
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
203 switch (frametype) {
2536
fb7c72af3a61 Copy nuv header only when the video codec is nuv
reimar
parents: 2274
diff changeset
204 case NUV_EXTRADATA:
fb7c72af3a61 Copy nuv header only when the video codec is nuv
reimar
parents: 2274
diff changeset
205 if (!ctx->rtjpg_video) {
fb7c72af3a61 Copy nuv header only when the video codec is nuv
reimar
parents: 2274
diff changeset
206 url_fskip(pb, size);
fb7c72af3a61 Copy nuv header only when the video codec is nuv
reimar
parents: 2274
diff changeset
207 break;
fb7c72af3a61 Copy nuv header only when the video codec is nuv
reimar
parents: 2274
diff changeset
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
fb7c72af3a61 Copy nuv header only when the video codec is nuv
reimar
parents: 2274
diff changeset
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
fb7c72af3a61 Copy nuv header only when the video codec is nuv
reimar
parents: 2274
diff changeset
218 pkt->pos = url_ftell(pb) - copyhdrsize;
1673
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1358
diff changeset
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
fb7c72af3a61 Copy nuv header only when the video codec is nuv
reimar
parents: 2274
diff changeset
221 memcpy(pkt->data, hdr, copyhdrsize);
fb7c72af3a61 Copy nuv header only when the video codec is nuv
reimar
parents: 2274
diff changeset
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
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1358
diff changeset
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
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
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 };