annotate nuv.c @ 2293:9aea08e128f9 libavformat

treat NONE as U8 to fix qtNONE/000_0032.MOV, this should not any have side effect since if bps is 16 in stsd, codec will be changed to s16be, just yell if this breaks any sample
author bcoudurier
date Mon, 30 Jul 2007 10:00:42 +0000
parents b21c2af60bc9
children fb7c72af3a61
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;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
27 } NUVContext;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
28
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
29 typedef enum {
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
30 NUV_VIDEO = 'V',
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
31 NUV_EXTRADATA = 'D',
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
32 NUV_AUDIO = 'A',
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
33 NUV_SEEKP = 'R',
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
34 NUV_MYTHEXT = 'X'
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
35 } frametype_t;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
36
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
37 static int nuv_probe(AVProbeData *p) {
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
38 if (!memcmp(p->buf, "NuppelVideo", 12))
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
39 return AVPROBE_SCORE_MAX;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
40 if (!memcmp(p->buf, "MythTVVideo", 12))
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
41 return AVPROBE_SCORE_MAX;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
42 return 0;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
43 }
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
44
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
45 //! little macro to sanitize packet size
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
46 #define PKTSIZE(s) (s & 0xffffff)
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
47
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
48 /**
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
49 * \brief read until we found all data needed for decoding
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
50 * \param vst video stream of which to change parameters
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
51 * \param ast video stream of which to change parameters
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
52 * \param myth set if this is a MythTVVideo format file
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
53 * \return 1 if all required codec data was found
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
54 */
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
55 static int get_codec_data(ByteIOContext *pb, AVStream *vst,
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
56 AVStream *ast, int myth) {
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
57 frametype_t frametype;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
58 if (!vst && !myth)
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
59 return 1; // no codec data needed
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
60 while (!url_feof(pb)) {
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
61 int size, subtype;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
62 frametype = get_byte(pb);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
63 switch (frametype) {
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
64 case NUV_EXTRADATA:
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
65 subtype = get_byte(pb);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
66 url_fskip(pb, 6);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
67 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
68 if (vst && subtype == 'R') {
1044
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
69 vst->codec->extradata_size = size;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
70 vst->codec->extradata = av_malloc(size);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
71 get_buffer(pb, vst->codec->extradata, size);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
72 size = 0;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
73 if (!myth)
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
74 return 1;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
75 }
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
76 break;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
77 case NUV_MYTHEXT:
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
78 url_fskip(pb, 7);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
79 size = PKTSIZE(get_le32(pb));
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
80 if (size != 128 * 4)
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
81 break;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
82 get_le32(pb); // version
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
83 if (vst) {
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
84 vst->codec->codec_tag = get_le32(pb);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
85 vst->codec->codec_id =
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
86 codec_get_id(codec_bmp_tags, vst->codec->codec_tag);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
87 } else
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
88 url_fskip(pb, 4);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
89
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
90 if (ast) {
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
91 ast->codec->codec_tag = get_le32(pb);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
92 ast->codec->sample_rate = get_le32(pb);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
93 ast->codec->bits_per_sample = get_le32(pb);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
94 ast->codec->channels = get_le32(pb);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
95 ast->codec->codec_id =
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
96 wav_codec_get_id(ast->codec->codec_tag,
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
97 ast->codec->bits_per_sample);
2100
33a90cc1a5de fix "incorrect frame size" errors with small.nuv
michael
parents: 2006
diff changeset
98 ast->need_parsing = AVSTREAM_PARSE_FULL;
1044
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
99 } else
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
100 url_fskip(pb, 4 * 4);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
101
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
102 size -= 6 * 4;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
103 url_fskip(pb, size);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
104 return 1;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
105 case NUV_SEEKP:
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
106 size = 11;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
107 break;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
108 default:
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
109 url_fskip(pb, 7);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
110 size = PKTSIZE(get_le32(pb));
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
111 break;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
112 }
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
113 url_fskip(pb, size);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
114 }
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
115 return 0;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
116 }
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
117
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
118 static int nuv_header(AVFormatContext *s, AVFormatParameters *ap) {
2006
2f0154760e5f Get rid of unnecessary pointer casts.
diego
parents: 2001
diff changeset
119 NUVContext *ctx = s->priv_data;
1044
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
120 ByteIOContext *pb = &s->pb;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
121 char id_string[12], version_string[5];
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
122 double aspect, fps;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
123 int is_mythtv, width, height, v_packs, a_packs;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
124 int stream_nr = 0;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
125 AVStream *vst = NULL, *ast = NULL;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
126 get_buffer(pb, id_string, 12);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
127 is_mythtv = !memcmp(id_string, "MythTVVideo", 12);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
128 get_buffer(pb, version_string, 5);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
129 url_fskip(pb, 3); // padding
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
130 width = get_le32(pb);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
131 height = get_le32(pb);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
132 get_le32(pb); // unused, "desiredwidth"
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
133 get_le32(pb); // unused, "desiredheight"
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
134 get_byte(pb); // 'P' == progressive, 'I' == interlaced
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
135 url_fskip(pb, 3); // padding
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
136 aspect = av_int2dbl(get_le64(pb));
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
137 fps = av_int2dbl(get_le64(pb));
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
138
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
139 // number of packets per stream type, -1 means unknown, e.g. streaming
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
140 v_packs = get_le32(pb);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
141 a_packs = get_le32(pb);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
142 get_le32(pb); // text
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
143
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
144 get_le32(pb); // keyframe distance (?)
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
145
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
146 if (v_packs) {
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
147 ctx->v_id = stream_nr++;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
148 vst = av_new_stream(s, ctx->v_id);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
149 vst->codec->codec_type = CODEC_TYPE_VIDEO;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
150 vst->codec->codec_id = CODEC_ID_NUV;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
151 vst->codec->codec_tag = MKTAG('R', 'J', 'P', 'G');
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
152 vst->codec->width = width;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
153 vst->codec->height = height;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
154 vst->codec->bits_per_sample = 10;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
155 vst->codec->sample_aspect_ratio = av_d2q(aspect, 10000);
1749
3711f46dcb98 10l to whoever wrote this (wrong fps, fixes nirvana.nuv)
michael
parents: 1673
diff changeset
156 vst->r_frame_rate = av_d2q(fps, 60000);
1044
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
157 av_set_pts_info(vst, 32, 1, 1000);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
158 } else
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
159 ctx->v_id = -1;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
160
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
161 if (a_packs) {
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
162 ctx->a_id = stream_nr++;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
163 ast = av_new_stream(s, ctx->a_id);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
164 ast->codec->codec_type = CODEC_TYPE_AUDIO;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
165 ast->codec->codec_id = CODEC_ID_PCM_S16LE;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
166 ast->codec->channels = 2;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
167 ast->codec->sample_rate = 44100;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
168 ast->codec->bit_rate = 2 * 2 * 44100 * 8;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
169 ast->codec->block_align = 2 * 2;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
170 ast->codec->bits_per_sample = 16;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
171 av_set_pts_info(ast, 32, 1, 1000);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
172 } else
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
173 ctx->a_id = -1;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
174
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
175 get_codec_data(pb, vst, ast, is_mythtv);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
176 return 0;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
177 }
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
178
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
179 #define HDRSIZE 12
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
180
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
181 static int nuv_packet(AVFormatContext *s, AVPacket *pkt) {
2006
2f0154760e5f Get rid of unnecessary pointer casts.
diego
parents: 2001
diff changeset
182 NUVContext *ctx = s->priv_data;
1044
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
183 ByteIOContext *pb = &s->pb;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
184 uint8_t hdr[HDRSIZE];
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
185 frametype_t frametype;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
186 int ret, size;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
187 while (!url_feof(pb)) {
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
188 ret = get_buffer(pb, hdr, HDRSIZE);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
189 if (ret <= 0)
1109
725b291bf94f read_packet return value must be < 0 when no packet is returned, including EOF.
reimar
parents: 1064
diff changeset
190 return ret ? ret : -1;
1044
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
191 frametype = hdr[0];
1673
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1358
diff changeset
192 size = PKTSIZE(AV_RL32(&hdr[8]));
1044
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
193 switch (frametype) {
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
194 case NUV_VIDEO:
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
195 case NUV_EXTRADATA:
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
196 if (ctx->v_id < 0) {
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
197 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
198 url_fskip(pb, size);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
199 break;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
200 }
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
201 ret = av_new_packet(pkt, HDRSIZE + size);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
202 if (ret < 0)
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
203 return ret;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
204 pkt->pos = url_ftell(pb);
1673
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1358
diff changeset
205 pkt->pts = AV_RL32(&hdr[4]);
1044
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
206 pkt->stream_index = ctx->v_id;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
207 memcpy(pkt->data, hdr, HDRSIZE);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
208 ret = get_buffer(pb, pkt->data + HDRSIZE, size);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
209 return ret;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
210 case NUV_AUDIO:
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
211 if (ctx->a_id < 0) {
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
212 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
213 url_fskip(pb, size);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
214 break;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
215 }
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
216 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
217 pkt->pts = AV_RL32(&hdr[4]);
1044
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
218 pkt->stream_index = ctx->a_id;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
219 return ret;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
220 case NUV_SEEKP:
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
221 // contains no data, size value is invalid
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
222 break;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
223 default:
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
224 url_fskip(pb, size);
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
225 break;
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
226 }
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
227 }
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2100
diff changeset
228 return AVERROR(EIO);
1044
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
229 }
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
230
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
231 AVInputFormat nuv_demuxer = {
1044
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
232 "nuv",
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
233 "NuppelVideo format",
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
234 sizeof(NUVContext),
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
235 nuv_probe,
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
236 nuv_header,
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
237 nuv_packet,
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
238 NULL,
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
239 NULL,
3aeb079a7e74 NuppelVideo/MythTVVideo support, including rtjpeg decoder
reimar
parents:
diff changeset
240 };