annotate rawdec.c @ 8520:a0164882aa38 libavcodec

Generic metadata API. avi is updated as example. No version bump, the API still might change slightly ... No update to ffmpeg.c as requested by aurel.
author michael
date Sun, 04 Jan 2009 18:48:37 +0000
parents 76f6a08c9fe6
children 04423b2f6e0b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
1 /*
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
2 * Raw Video Decoder
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
3 * Copyright (c) 2001 Fabrice Bellard.
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
4 *
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
5 * This file is part of FFmpeg.
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
6 *
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
11 *
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
15 * Lesser General Public License for more details.
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
16 *
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
20 */
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
21
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
22 /**
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
23 * @file rawdec.c
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
24 * Raw Video Decoder
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
25 */
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
26
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
27 #include "avcodec.h"
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
28 #include "raw.h"
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
29
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
30 typedef struct RawVideoContext {
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
31 unsigned char * buffer; /* block of memory for holding one frame */
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
32 int length; /* number of bytes in buffer */
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
33 AVFrame pic; ///< AVCodecContext.coded_frame
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
34 } RawVideoContext;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
35
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
36 static const PixelFormatTag pixelFormatBpsAVI[] = {
5419
67acef686665 support raw 4bpp avi
michael
parents: 5264
diff changeset
37 { PIX_FMT_PAL8, 4 },
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
38 { PIX_FMT_PAL8, 8 },
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
39 { PIX_FMT_RGB555, 15 },
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
40 { PIX_FMT_RGB555, 16 },
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
41 { PIX_FMT_BGR24, 24 },
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
42 { PIX_FMT_RGB32, 32 },
8023
76f6a08c9fe6 Fix some icc warnings by using enum PixelFormat instead of int where appropriate.
cehoyos
parents: 7823
diff changeset
43 { PIX_FMT_NONE, 0 },
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
44 };
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
45
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
46 static const PixelFormatTag pixelFormatBpsMOV[] = {
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
47 /* FIXME fix swscaler to support those */
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
48 /* http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap3/chapter_4_section_2.html */
6423
4cf5fde3c99e code is ok for 4bpp in mov too, fix 16grey.mov
bcoudurier
parents: 6247
diff changeset
49 { PIX_FMT_PAL8, 4 },
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
50 { PIX_FMT_PAL8, 8 },
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
51 { PIX_FMT_BGR555, 16 },
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
52 { PIX_FMT_RGB24, 24 },
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
53 { PIX_FMT_BGR32_1, 32 },
8023
76f6a08c9fe6 Fix some icc warnings by using enum PixelFormat instead of int where appropriate.
cehoyos
parents: 7823
diff changeset
54 { PIX_FMT_NONE, 0 },
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
55 };
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
56
8023
76f6a08c9fe6 Fix some icc warnings by using enum PixelFormat instead of int where appropriate.
cehoyos
parents: 7823
diff changeset
57 static enum PixelFormat findPixelFormat(const PixelFormatTag *tags, unsigned int fourcc)
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
58 {
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
59 while (tags->pix_fmt >= 0) {
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
60 if (tags->fourcc == fourcc)
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
61 return tags->pix_fmt;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
62 tags++;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
63 }
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
64 return PIX_FMT_YUV420P;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
65 }
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
66
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6424
diff changeset
67 static av_cold int raw_init_decoder(AVCodecContext *avctx)
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
68 {
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
69 RawVideoContext *context = avctx->priv_data;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
70
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
71 if (avctx->codec_tag == MKTAG('r','a','w',' '))
7823
4525dcd81357 Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 7040
diff changeset
72 avctx->pix_fmt = findPixelFormat(pixelFormatBpsMOV, avctx->bits_per_coded_sample);
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
73 else if (avctx->codec_tag)
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
74 avctx->pix_fmt = findPixelFormat(ff_raw_pixelFormatTags, avctx->codec_tag);
7823
4525dcd81357 Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 7040
diff changeset
75 else if (avctx->bits_per_coded_sample)
4525dcd81357 Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 7040
diff changeset
76 avctx->pix_fmt = findPixelFormat(pixelFormatBpsAVI, avctx->bits_per_coded_sample);
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
77
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
78 context->length = avpicture_get_size(avctx->pix_fmt, avctx->width, avctx->height);
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
79 context->buffer = av_malloc(context->length);
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
80 context->pic.pict_type = FF_I_TYPE;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
81 context->pic.key_frame = 1;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
82
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
83 avctx->coded_frame= &context->pic;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
84
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
85 if (!context->buffer)
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
86 return -1;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
87
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
88 return 0;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
89 }
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
90
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
91 static void flip(AVCodecContext *avctx, AVPicture * picture){
7823
4525dcd81357 Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 7040
diff changeset
92 if(!avctx->codec_tag && avctx->bits_per_coded_sample && picture->linesize[2]==0){
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
93 picture->data[0] += picture->linesize[0] * (avctx->height-1);
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
94 picture->linesize[0] *= -1;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
95 }
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
96 }
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
97
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
98 static int raw_decode(AVCodecContext *avctx,
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
99 void *data, int *data_size,
6247
michael
parents: 5419
diff changeset
100 const uint8_t *buf, int buf_size)
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
101 {
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
102 RawVideoContext *context = avctx->priv_data;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
103
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
104 AVFrame * frame = (AVFrame *) data;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
105 AVPicture * picture = (AVPicture *) data;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
106
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
107 frame->interlaced_frame = avctx->coded_frame->interlaced_frame;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
108 frame->top_field_first = avctx->coded_frame->top_field_first;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
109
6423
4cf5fde3c99e code is ok for 4bpp in mov too, fix 16grey.mov
bcoudurier
parents: 6247
diff changeset
110 //4bpp raw in avi and mov (yes this is ugly ...)
7823
4525dcd81357 Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 7040
diff changeset
111 if(avctx->bits_per_coded_sample == 4 && avctx->pix_fmt==PIX_FMT_PAL8 &&
6424
66969d0e4a6d 1000l parenthesis
bcoudurier
parents: 6423
diff changeset
112 (!avctx->codec_tag || avctx->codec_tag == MKTAG('r','a','w',' '))){
5419
67acef686665 support raw 4bpp avi
michael
parents: 5264
diff changeset
113 int i;
67acef686665 support raw 4bpp avi
michael
parents: 5264
diff changeset
114 for(i=256*2; i+1 < context->length>>1; i++){
67acef686665 support raw 4bpp avi
michael
parents: 5264
diff changeset
115 context->buffer[2*i+0]= buf[i-256*2]>>4;
67acef686665 support raw 4bpp avi
michael
parents: 5264
diff changeset
116 context->buffer[2*i+1]= buf[i-256*2]&15;
67acef686665 support raw 4bpp avi
michael
parents: 5264
diff changeset
117 }
67acef686665 support raw 4bpp avi
michael
parents: 5264
diff changeset
118 buf= context->buffer + 256*4;
67acef686665 support raw 4bpp avi
michael
parents: 5264
diff changeset
119 buf_size= context->length - 256*4;
67acef686665 support raw 4bpp avi
michael
parents: 5264
diff changeset
120 }
67acef686665 support raw 4bpp avi
michael
parents: 5264
diff changeset
121
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
122 if(buf_size < context->length - (avctx->pix_fmt==PIX_FMT_PAL8 ? 256*4 : 0))
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
123 return -1;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
124
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
125 avpicture_fill(picture, buf, avctx->pix_fmt, avctx->width, avctx->height);
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
126 if(avctx->pix_fmt==PIX_FMT_PAL8 && buf_size < context->length){
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
127 frame->data[1]= context->buffer;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
128 }
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
129 if (avctx->palctrl && avctx->palctrl->palette_changed) {
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
130 memcpy(frame->data[1], avctx->palctrl->palette, AVPALETTE_SIZE);
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
131 avctx->palctrl->palette_changed = 0;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
132 }
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
133
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
134 flip(avctx, picture);
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
135
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
136 if (avctx->codec_tag == MKTAG('Y', 'V', '1', '2'))
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
137 {
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
138 // swap fields
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
139 unsigned char *tmp = picture->data[1];
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
140 picture->data[1] = picture->data[2];
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
141 picture->data[2] = tmp;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
142 }
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
143
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
144 *data_size = sizeof(AVPicture);
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
145 return buf_size;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
146 }
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
147
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6424
diff changeset
148 static av_cold int raw_close_decoder(AVCodecContext *avctx)
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
149 {
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
150 RawVideoContext *context = avctx->priv_data;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
151
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
152 av_freep(&context->buffer);
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
153 return 0;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
154 }
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
155
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
156 AVCodec rawvideo_decoder = {
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
157 "rawvideo",
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
158 CODEC_TYPE_VIDEO,
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
159 CODEC_ID_RAWVIDEO,
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
160 sizeof(RawVideoContext),
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
161 raw_init_decoder,
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
162 NULL,
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
163 raw_close_decoder,
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
164 raw_decode,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6712
diff changeset
165 .long_name = NULL_IF_CONFIG_SMALL("raw video"),
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
166 };