Mercurial > libavformat.hg
annotate jpeg.c @ 594:89a09ede50ad libavformat
First implementation of nsv demuxer.
Get libavformat linked with lavc and lmp3lame is required. BeOS requires no undefined syms on link! (besides it's bad to leave undef syms)
author | mmu_man |
---|---|
date | Sat, 20 Nov 2004 23:10:07 +0000 |
parents | 5cb0e4cdb864 |
children | 66cc656ea404 |
rev | line source |
---|---|
0 | 1 /* |
47
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
2 * JPEG image format |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
3 * Copyright (c) 2003 Fabrice Bellard. |
0 | 4 * |
5 * This library is free software; you can redistribute it and/or | |
6 * modify it under the terms of the GNU Lesser General Public | |
7 * License as published by the Free Software Foundation; either | |
8 * version 2 of the License, or (at your option) any later version. | |
9 * | |
10 * This library is distributed in the hope that it will be useful, | |
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 * Lesser General Public License for more details. | |
14 * | |
15 * You should have received a copy of the GNU Lesser General Public | |
16 * License along with this library; if not, write to the Free Software | |
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
18 */ | |
19 #include "avformat.h" | |
20 | |
47
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
21 static int jpeg_probe(AVProbeData *pd) |
0 | 22 { |
47
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
23 if (pd->buf_size >= 64 && |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
24 pd->buf[0] == 0xff && pd->buf[1] == 0xd8 && pd->buf[2] == 0xff) |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
25 return AVPROBE_SCORE_MAX; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
26 else |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
27 return 0; |
0 | 28 } |
29 | |
47
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
30 typedef struct JpegOpaque { |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
31 int (*alloc_cb)(void *opaque, AVImageInfo *info); |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
32 void *opaque; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
33 int ret_code; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
34 } JpegOpaque; |
0 | 35 |
47
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
36 /* called by the codec to allocate the image */ |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
37 static int jpeg_get_buffer(AVCodecContext *c, AVFrame *picture) |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
38 { |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
39 JpegOpaque *jctx = c->opaque; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
40 AVImageInfo info1, *info = &info1; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
41 int ret, i; |
0 | 42 |
47
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
43 info->width = c->width; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
44 info->height = c->height; |
114 | 45 switch(c->pix_fmt) { |
46 case PIX_FMT_YUV420P: | |
47 info->pix_fmt = PIX_FMT_YUVJ420P; | |
48 break; | |
49 case PIX_FMT_YUV422P: | |
50 info->pix_fmt = PIX_FMT_YUVJ422P; | |
51 break; | |
52 case PIX_FMT_YUV444P: | |
53 info->pix_fmt = PIX_FMT_YUVJ444P; | |
54 break; | |
55 default: | |
56 return -1; | |
57 } | |
47
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
58 ret = jctx->alloc_cb(jctx->opaque, info); |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
59 if (ret) { |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
60 jctx->ret_code = ret; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
61 return -1; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
62 } else { |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
63 for(i=0;i<3;i++) { |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
64 picture->data[i] = info->pict.data[i]; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
65 picture->linesize[i] = info->pict.linesize[i]; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
66 } |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
67 return 0; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
68 } |
0 | 69 } |
70 | |
321 | 71 static void jpeg_img_copy(uint8_t *dst, int dst_wrap, |
65 | 72 uint8_t *src, int src_wrap, |
47
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
73 int width, int height) |
0 | 74 { |
47
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
75 for(;height > 0; height--) { |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
76 memcpy(dst, src, width); |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
77 dst += dst_wrap; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
78 src += src_wrap; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
79 } |
0 | 80 } |
81 | |
47
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
82 /* XXX: libavcodec is broken for truncated jpegs! */ |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
83 #define IO_BUF_SIZE (1024*1024) |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
84 |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
85 static int jpeg_read(ByteIOContext *f, |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
86 int (*alloc_cb)(void *opaque, AVImageInfo *info), void *opaque) |
0 | 87 { |
47
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
88 AVCodecContext *c; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
89 AVFrame *picture, picture1; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
90 int len, size, got_picture, i; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
91 uint8_t *inbuf_ptr, inbuf[IO_BUF_SIZE]; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
92 JpegOpaque jctx; |
0 | 93 |
47
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
94 jctx.alloc_cb = alloc_cb; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
95 jctx.opaque = opaque; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
96 jctx.ret_code = -1; /* default return code is error */ |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
97 |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
98 c = avcodec_alloc_context(); |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
99 if (!c) |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
100 return -1; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
101 picture= avcodec_alloc_frame(); |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
102 if (!picture) { |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
103 av_free(c); |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
104 return -1; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
105 } |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
106 c->opaque = &jctx; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
107 c->get_buffer = jpeg_get_buffer; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
108 c->flags |= CODEC_FLAG_TRUNCATED; /* we dont send complete frames */ |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
109 if (avcodec_open(c, &mjpeg_decoder) < 0) |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
110 goto fail1; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
111 for(;;) { |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
112 size = get_buffer(f, inbuf, sizeof(inbuf)); |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
113 if (size == 0) |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
114 break; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
115 inbuf_ptr = inbuf; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
116 while (size > 0) { |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
117 len = avcodec_decode_video(c, &picture1, &got_picture, |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
118 inbuf_ptr, size); |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
119 if (len < 0) |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
120 goto fail; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
121 if (got_picture) |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
122 goto the_end; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
123 size -= len; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
124 inbuf_ptr += len; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
125 } |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
126 } |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
127 the_end: |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
128 /* XXX: currently, the mjpeg decoder does not use AVFrame, so we |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
129 must do it by hand */ |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
130 if (jpeg_get_buffer(c, picture) < 0) |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
131 goto fail; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
132 for(i=0;i<3;i++) { |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
133 int w, h; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
134 w = c->width; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
135 h = c->height; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
136 if (i >= 1) { |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
137 switch(c->pix_fmt) { |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
138 default: |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
139 case PIX_FMT_YUV420P: |
48 | 140 w = (w + 1) >> 1; |
141 h = (h + 1) >> 1; | |
47
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
142 break; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
143 case PIX_FMT_YUV422P: |
48 | 144 w = (w + 1) >> 1; |
47
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
145 break; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
146 case PIX_FMT_YUV444P: |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
147 break; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
148 } |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
149 } |
321 | 150 jpeg_img_copy(picture->data[i], picture->linesize[i], |
47
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
151 picture1.data[i], picture1.linesize[i], |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
152 w, h); |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
153 } |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
154 jctx.ret_code = 0; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
155 fail: |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
156 avcodec_close(c); |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
157 fail1: |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
158 av_free(picture); |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
159 av_free(c); |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
160 return jctx.ret_code; |
0 | 161 } |
162 | |
215
99f4032097e0
Compile fix when no CONFIG_ENCODERS by (Glenn Maynard <g_sf at zewt dot org>)
michaelni
parents:
114
diff
changeset
|
163 #ifdef CONFIG_ENCODERS |
47
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
164 static int jpeg_write(ByteIOContext *pb, AVImageInfo *info) |
0 | 165 { |
47
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
166 AVCodecContext *c; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
167 uint8_t *outbuf = NULL; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
168 int outbuf_size, ret, size, i; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
169 AVFrame *picture; |
5 | 170 |
47
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
171 ret = -1; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
172 c = avcodec_alloc_context(); |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
173 if (!c) |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
174 return -1; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
175 picture = avcodec_alloc_frame(); |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
176 if (!picture) |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
177 goto fail2; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
178 c->width = info->width; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
179 c->height = info->height; |
114 | 180 /* XXX: currently move that to the codec ? */ |
181 switch(info->pix_fmt) { | |
182 case PIX_FMT_YUVJ420P: | |
183 c->pix_fmt = PIX_FMT_YUV420P; | |
184 break; | |
185 case PIX_FMT_YUVJ422P: | |
186 c->pix_fmt = PIX_FMT_YUV422P; | |
187 break; | |
188 case PIX_FMT_YUVJ444P: | |
189 c->pix_fmt = PIX_FMT_YUV444P; | |
190 break; | |
191 default: | |
192 goto fail1; | |
193 } | |
47
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
194 for(i=0;i<3;i++) { |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
195 picture->data[i] = info->pict.data[i]; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
196 picture->linesize[i] = info->pict.linesize[i]; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
197 } |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
198 /* set the quality */ |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
199 picture->quality = 3; /* XXX: a parameter should be used */ |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
200 c->flags |= CODEC_FLAG_QSCALE; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
201 |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
202 if (avcodec_open(c, &mjpeg_encoder) < 0) |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
203 goto fail1; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
204 |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
205 /* XXX: needs to sort out that size problem */ |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
206 outbuf_size = 1000000; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
207 outbuf = av_malloc(outbuf_size); |
0 | 208 |
47
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
209 size = avcodec_encode_video(c, outbuf, outbuf_size, picture); |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
210 if (size < 0) |
0 | 211 goto fail; |
47
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
212 put_buffer(pb, outbuf, size); |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
213 put_flush_packet(pb); |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
214 ret = 0; |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
215 |
0 | 216 fail: |
47
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
217 avcodec_close(c); |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
218 av_free(outbuf); |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
219 fail1: |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
220 av_free(picture); |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
221 fail2: |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
222 av_free(c); |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
223 return ret; |
0 | 224 } |
215
99f4032097e0
Compile fix when no CONFIG_ENCODERS by (Glenn Maynard <g_sf at zewt dot org>)
michaelni
parents:
114
diff
changeset
|
225 #endif //CONFIG_ENCODERS |
0 | 226 |
47
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
227 AVImageFormat jpeg_image_format = { |
0 | 228 "jpeg", |
47
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
229 "jpg,jpeg", |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
230 jpeg_probe, |
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
231 jpeg_read, |
114 | 232 (1 << PIX_FMT_YUVJ420P) | (1 << PIX_FMT_YUVJ422P) | (1 << PIX_FMT_YUVJ444P), |
215
99f4032097e0
Compile fix when no CONFIG_ENCODERS by (Glenn Maynard <g_sf at zewt dot org>)
michaelni
parents:
114
diff
changeset
|
233 #ifdef CONFIG_ENCODERS |
47
45308962220f
added jpeg image encoder and decoder (new YUV handling routines and mjpeg codec fixes are necessary to go further)
bellard
parents:
5
diff
changeset
|
234 jpeg_write, |
215
99f4032097e0
Compile fix when no CONFIG_ENCODERS by (Glenn Maynard <g_sf at zewt dot org>)
michaelni
parents:
114
diff
changeset
|
235 #else |
99f4032097e0
Compile fix when no CONFIG_ENCODERS by (Glenn Maynard <g_sf at zewt dot org>)
michaelni
parents:
114
diff
changeset
|
236 NULL, |
99f4032097e0
Compile fix when no CONFIG_ENCODERS by (Glenn Maynard <g_sf at zewt dot org>)
michaelni
parents:
114
diff
changeset
|
237 #endif //CONFIG_ENCODERS |
0 | 238 }; |