annotate img2.c @ 584:4e3bab6555ae libavformat

When playing ftp://ftp.mplayerhq.hu/MPlayer/samples/V-codecs/QPEG/VWbig6.avi with my decoder (should appear soon) it hadn't changed palette even there are palette change chunks in that AVI. Here is small patch to make it work (zero number of colors to change in that chunk actually means to change ALL colors). patch by (Kostya <cannonball>at<bw-team>dot<com>)
author michael
date Fri, 12 Nov 2004 01:32:35 +0000
parents 7793767ffe35
children 10ad229f9d00
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
497
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
1 /*
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
2 * Image format
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard.
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
4 * Copyright (c) 2004 Michael Niedermayer
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
5 *
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
6 * This library is free software; you can redistribute it and/or
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
7 * modify it under the terms of the GNU Lesser General Public
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
8 * License as published by the Free Software Foundation; either
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
9 * version 2 of the License, or (at your option) any later version.
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
10 *
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
11 * This library is distributed in the hope that it will be useful,
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
14 * Lesser General Public License for more details.
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
15 *
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
16 * You should have received a copy of the GNU Lesser General Public
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
17 * License along with this library; if not, write to the Free Software
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
19 */
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
20 #include "avformat.h"
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
21
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
22 typedef struct {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
23 int img_first;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
24 int img_last;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
25 int img_number;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
26 int img_count;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
27 int is_pipe;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
28 char path[1024];
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
29 } VideoData;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
30
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
31 typedef struct {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
32 enum CodecID id;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
33 const char *str;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
34 } IdStrMap;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
35
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
36 static const IdStrMap img_tags[] = {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
37 { CODEC_ID_MJPEG , "jpeg"},
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
38 { CODEC_ID_MJPEG , "jpg"},
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
39 { CODEC_ID_LJPEG , "ljpg"},
581
03377d4de76a porting png support from -f image to -f image2
michael
parents: 574
diff changeset
40 { CODEC_ID_PNG , "png"},
583
7793767ffe35 move p*m from image/lavf -> image2/lavc
michael
parents: 581
diff changeset
41 { CODEC_ID_PPM , "ppm"},
7793767ffe35 move p*m from image/lavf -> image2/lavc
michael
parents: 581
diff changeset
42 { CODEC_ID_PGM , "pgm"},
7793767ffe35 move p*m from image/lavf -> image2/lavc
michael
parents: 581
diff changeset
43 { CODEC_ID_PGMYUV , "pgmyuv"},
7793767ffe35 move p*m from image/lavf -> image2/lavc
michael
parents: 581
diff changeset
44 { CODEC_ID_PBM , "pbm"},
7793767ffe35 move p*m from image/lavf -> image2/lavc
michael
parents: 581
diff changeset
45 { CODEC_ID_PAM , "pam"},
497
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
46 { CODEC_ID_MPEG1VIDEO, "mpg1-img"},
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
47 { CODEC_ID_MPEG2VIDEO, "mpg2-img"},
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
48 { CODEC_ID_MPEG4 , "mpg4-img"},
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
49 { CODEC_ID_FFV1 , "ffv1-img"},
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
50 {0, NULL}
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
51 };
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
52
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
53 static enum CodecID av_str2id(const IdStrMap *tags, const char *str)
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
54 {
530
michael
parents: 498
diff changeset
55 str= strrchr(str, '.');
michael
parents: 498
diff changeset
56 if(!str) return CODEC_ID_NONE;
michael
parents: 498
diff changeset
57 str++;
497
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
58
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
59 while (tags->id) {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
60 int i;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
61 for(i=0; toupper(tags->str[i]) == toupper(str[i]); i++){
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
62 if(tags->str[i]==0 && str[i]==0)
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
63 return tags->id;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
64 }
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
65
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
66 tags++;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
67 }
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
68 return CODEC_ID_NONE;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
69 }
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
70
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
71 static const char *av_id2str(const IdStrMap *tags, enum CodecID id)
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
72 {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
73 while (tags->id) {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
74 if(tags->id == id)
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
75 return tags->str;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
76 tags++;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
77 }
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
78 return NULL;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
79 }
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
80
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
81 /* return -1 if no image found */
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
82 static int find_image_range(int *pfirst_index, int *plast_index,
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
83 const char *path)
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
84 {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
85 char buf[1024];
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
86 int range, last_index, range1, first_index;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
87
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
88 /* find the first image */
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
89 for(first_index = 0; first_index < 5; first_index++) {
498
7c8687cb7f27 support single images, remove copy/paste junk
michael
parents: 497
diff changeset
90 if (get_frame_filename(buf, sizeof(buf), path, first_index) < 0){
7c8687cb7f27 support single images, remove copy/paste junk
michael
parents: 497
diff changeset
91 *pfirst_index =
7c8687cb7f27 support single images, remove copy/paste junk
michael
parents: 497
diff changeset
92 *plast_index = 1;
7c8687cb7f27 support single images, remove copy/paste junk
michael
parents: 497
diff changeset
93 return 0;
7c8687cb7f27 support single images, remove copy/paste junk
michael
parents: 497
diff changeset
94 }
497
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
95 if (url_exist(buf))
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
96 break;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
97 }
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
98 if (first_index == 5)
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
99 goto fail;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
100
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
101 /* find the last image */
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
102 last_index = first_index;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
103 for(;;) {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
104 range = 0;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
105 for(;;) {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
106 if (!range)
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
107 range1 = 1;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
108 else
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
109 range1 = 2 * range;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
110 if (get_frame_filename(buf, sizeof(buf), path,
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
111 last_index + range1) < 0)
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
112 goto fail;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
113 if (!url_exist(buf))
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
114 break;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
115 range = range1;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
116 /* just in case... */
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
117 if (range >= (1 << 30))
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
118 goto fail;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
119 }
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
120 /* we are sure than image last_index + range exists */
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
121 if (!range)
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
122 break;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
123 last_index += range;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
124 }
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
125 *pfirst_index = first_index;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
126 *plast_index = last_index;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
127 return 0;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
128 fail:
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
129 return -1;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
130 }
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
131
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
132
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
133 static int image_probe(AVProbeData *p)
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
134 {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
135 if (filename_number_test(p->filename) >= 0 && av_str2id(img_tags, p->filename))
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
136 return AVPROBE_SCORE_MAX;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
137 else
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
138 return 0;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
139 }
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
140
583
7793767ffe35 move p*m from image/lavf -> image2/lavc
michael
parents: 581
diff changeset
141 enum CodecID av_guess_image2_codec(const char *filename){
7793767ffe35 move p*m from image/lavf -> image2/lavc
michael
parents: 581
diff changeset
142 return av_str2id(img_tags, filename);
7793767ffe35 move p*m from image/lavf -> image2/lavc
michael
parents: 581
diff changeset
143 }
7793767ffe35 move p*m from image/lavf -> image2/lavc
michael
parents: 581
diff changeset
144
497
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
145 static int img_read_header(AVFormatContext *s1, AVFormatParameters *ap)
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
146 {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
147 VideoData *s = s1->priv_data;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
148 int first_index, last_index;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
149 AVStream *st;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
150
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
151 s1->ctx_flags |= AVFMTCTX_NOHEADER;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
152
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
153 st = av_new_stream(s1, 0);
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
154 if (!st) {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
155 av_free(s);
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
156 return -ENOMEM;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
157 }
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
158
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
159 strcpy(s->path, s1->filename);
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
160 s->img_number = 0;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
161 s->img_count = 0;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
162
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
163 /* find format */
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
164 if (s1->iformat->flags & AVFMT_NOFILE)
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
165 s->is_pipe = 0;
574
955ca987adbd image2pipe fix
michael
parents: 530
diff changeset
166 else{
497
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
167 s->is_pipe = 1;
574
955ca987adbd image2pipe fix
michael
parents: 530
diff changeset
168 st->need_parsing= 1;
955ca987adbd image2pipe fix
michael
parents: 530
diff changeset
169 }
497
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
170
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
171 if (!ap || !ap->frame_rate) {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
172 st->codec.frame_rate = 25;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
173 st->codec.frame_rate_base = 1;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
174 } else {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
175 st->codec.frame_rate = ap->frame_rate;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
176 st->codec.frame_rate_base = ap->frame_rate_base;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
177 }
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
178
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
179 if (!s->is_pipe) {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
180 if (find_image_range(&first_index, &last_index, s->path) < 0)
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
181 goto fail;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
182 s->img_first = first_index;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
183 s->img_last = last_index;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
184 s->img_number = first_index;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
185 /* compute duration */
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
186 st->start_time = 0;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
187 st->duration = ((int64_t)AV_TIME_BASE *
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
188 (last_index - first_index + 1) *
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
189 st->codec.frame_rate_base) / st->codec.frame_rate;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
190 }
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
191
583
7793767ffe35 move p*m from image/lavf -> image2/lavc
michael
parents: 581
diff changeset
192 if(ap->video_codec_id){
7793767ffe35 move p*m from image/lavf -> image2/lavc
michael
parents: 581
diff changeset
193 st->codec.codec_type = CODEC_TYPE_VIDEO;
7793767ffe35 move p*m from image/lavf -> image2/lavc
michael
parents: 581
diff changeset
194 st->codec.codec_id = ap->video_codec_id;
7793767ffe35 move p*m from image/lavf -> image2/lavc
michael
parents: 581
diff changeset
195 }else if(ap->audio_codec_id){
7793767ffe35 move p*m from image/lavf -> image2/lavc
michael
parents: 581
diff changeset
196 st->codec.codec_type = CODEC_TYPE_AUDIO;
7793767ffe35 move p*m from image/lavf -> image2/lavc
michael
parents: 581
diff changeset
197 st->codec.codec_id = ap->audio_codec_id;
7793767ffe35 move p*m from image/lavf -> image2/lavc
michael
parents: 581
diff changeset
198 }else{
7793767ffe35 move p*m from image/lavf -> image2/lavc
michael
parents: 581
diff changeset
199 st->codec.codec_type = CODEC_TYPE_VIDEO;
7793767ffe35 move p*m from image/lavf -> image2/lavc
michael
parents: 581
diff changeset
200 st->codec.codec_id = av_str2id(img_tags, s->path);
7793767ffe35 move p*m from image/lavf -> image2/lavc
michael
parents: 581
diff changeset
201 }
497
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
202
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
203 return 0;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
204
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
205 fail:
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
206 av_free(s);
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
207 return AVERROR_IO;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
208 }
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
209
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
210 static int img_read_packet(AVFormatContext *s1, AVPacket *pkt)
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
211 {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
212 VideoData *s = s1->priv_data;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
213 char filename[1024];
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
214 int ret;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
215 ByteIOContext f1, *f;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
216
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
217 if (!s->is_pipe) {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
218 /* loop over input */
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
219 /* if (loop_input && s->img_number > s->img_last) {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
220 s->img_number = s->img_first;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
221 }*/
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
222 if (get_frame_filename(filename, sizeof(filename),
498
7c8687cb7f27 support single images, remove copy/paste junk
michael
parents: 497
diff changeset
223 s->path, s->img_number)<0 && s->img_number > 1)
497
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
224 return AVERROR_IO;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
225 f = &f1;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
226 if (url_fopen(f, filename, URL_RDONLY) < 0)
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
227 return AVERROR_IO;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
228 } else {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
229 f = &s1->pb;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
230 if (url_feof(f))
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
231 return AVERROR_IO;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
232 }
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
233
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
234 if (s->is_pipe) {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
235 av_new_packet(pkt, 4096);
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
236 }else{
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
237 av_new_packet(pkt, url_filesize(url_fileno(f)));
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
238 }
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
239 pkt->stream_index = 0;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
240 pkt->flags |= PKT_FLAG_KEY;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
241
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
242 ret = get_buffer(f, pkt->data, pkt->size);
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
243 if (!s->is_pipe) {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
244 url_fclose(f);
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
245 }
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
246
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
247 if (ret <= 0) {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
248 av_free_packet(pkt);
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
249 return AVERROR_IO; /* signal EOF */
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
250 } else {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
251 s->img_count++;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
252 s->img_number++;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
253 return 0;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
254 }
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
255 }
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
256
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
257 static int img_read_close(AVFormatContext *s1)
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
258 {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
259 return 0;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
260 }
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
261
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
262 /******************************************************/
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
263 /* image output */
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
264
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
265 static int img_write_header(AVFormatContext *s)
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
266 {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
267 VideoData *img = s->priv_data;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
268
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
269 img->img_number = 1;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
270 strcpy(img->path, s->filename);
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
271
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
272 /* find format */
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
273 if (s->oformat->flags & AVFMT_NOFILE)
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
274 img->is_pipe = 0;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
275 else
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
276 img->is_pipe = 1;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
277
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
278 return 0;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
279 }
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
280
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
281 static int img_write_packet(AVFormatContext *s, AVPacket *pkt)
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
282 {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
283 VideoData *img = s->priv_data;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
284 ByteIOContext pb1, *pb;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
285 char filename[1024];
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
286
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
287 if (!img->is_pipe) {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
288 if (get_frame_filename(filename, sizeof(filename),
498
7c8687cb7f27 support single images, remove copy/paste junk
michael
parents: 497
diff changeset
289 img->path, img->img_number) < 0 && img->img_number>1)
497
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
290 return AVERROR_IO;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
291 pb = &pb1;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
292 if (url_fopen(pb, filename, URL_WRONLY) < 0)
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
293 return AVERROR_IO;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
294 } else {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
295 pb = &s->pb;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
296 }
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
297
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
298 put_buffer(pb, pkt->data, pkt->size);
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
299 put_flush_packet(pb);
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
300 if (!img->is_pipe) {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
301 url_fclose(pb);
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
302 }
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
303
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
304 img->img_number++;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
305 return 0;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
306 }
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
307
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
308 static int img_write_trailer(AVFormatContext *s)
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
309 {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
310 return 0;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
311 }
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
312
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
313 /* input */
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
314
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
315 static AVInputFormat image2_iformat = {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
316 "image2",
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
317 "image2 sequence",
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
318 sizeof(VideoData),
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
319 image_probe,
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
320 img_read_header,
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
321 img_read_packet,
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
322 img_read_close,
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
323 NULL,
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
324 NULL,
498
7c8687cb7f27 support single images, remove copy/paste junk
michael
parents: 497
diff changeset
325 AVFMT_NOFILE,
497
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
326 };
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
327
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
328 static AVInputFormat image2pipe_iformat = {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
329 "image2pipe",
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
330 "piped image2 sequence",
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
331 sizeof(VideoData),
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
332 NULL, /* no probe */
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
333 img_read_header,
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
334 img_read_packet,
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
335 img_read_close,
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
336 NULL,
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
337 };
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
338
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
339
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
340 /* output */
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
341
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
342 static AVOutputFormat image2_oformat = {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
343 "image2",
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
344 "image2 sequence",
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
345 "",
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
346 "",
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
347 sizeof(VideoData),
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
348 CODEC_ID_NONE,
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
349 CODEC_ID_MJPEG,
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
350 img_write_header,
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
351 img_write_packet,
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
352 img_write_trailer,
498
7c8687cb7f27 support single images, remove copy/paste junk
michael
parents: 497
diff changeset
353 AVFMT_NOFILE,
497
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
354 };
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
355
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
356 static AVOutputFormat image2pipe_oformat = {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
357 "image2pipe",
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
358 "piped image2 sequence",
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
359 "",
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
360 "",
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
361 sizeof(VideoData),
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
362 CODEC_ID_NONE,
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
363 CODEC_ID_MJPEG,
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
364 img_write_header,
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
365 img_write_packet,
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
366 img_write_trailer,
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
367 };
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
368
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
369 int img2_init(void)
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
370 {
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
371 av_register_input_format(&image2_iformat);
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
372 av_register_output_format(&image2_oformat);
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
373
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
374 av_register_input_format(&image2pipe_iformat);
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
375 av_register_output_format(&image2pipe_oformat);
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
376
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
377 return 0;
d95e74ef39e0 image2 / image API cleanup phase-1
michael
parents:
diff changeset
378 }