annotate rawdec.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents e6d711ba5760
children
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
8629
04423b2f6e0b cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents: 8023
diff changeset
3 * Copyright (c) 2001 Fabrice Bellard
5264
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 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 11560
diff changeset
23 * @file
5264
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"
12514
e6d711ba5760 rawdec: ensure that there is always a valid palette for formats that
reimar
parents: 12507
diff changeset
28 #include "imgconvert.h"
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
29 #include "raw.h"
9335
c7396480f8e3 Map MOV fourcc YUV2 correctly to PIX_FMT_YUYV422.
cehoyos
parents: 8995
diff changeset
30 #include "libavutil/intreadwrite.h"
12514
e6d711ba5760 rawdec: ensure that there is always a valid palette for formats that
reimar
parents: 12507
diff changeset
31 #include "libavcore/imgutils.h"
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
32
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
33 typedef struct RawVideoContext {
12507
46191b10d663 rawdec: only allocate a full-frame size buffer if it actually will
reimar
parents: 11861
diff changeset
34 uint32_t palette[AVPALETTE_COUNT];
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
35 unsigned char * buffer; /* block of memory for holding one frame */
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
36 int length; /* number of bytes in buffer */
8993
80720c5427a0 Fix raw rgb/bgr vertical flip in avi based on info from http://www.fourcc.org/fccbihgt.php.
michael
parents: 8718
diff changeset
37 int flip;
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
38 AVFrame pic; ///< AVCodecContext.coded_frame
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
39 } RawVideoContext;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
40
11753
4c894b716948 Rename pixelFormatBpsAVI to pix_fmt_bps_avi and pixelFormatBpsMOV to
stefano
parents: 11752
diff changeset
41 static const PixelFormatTag pix_fmt_bps_avi[] = {
5419
67acef686665 support raw 4bpp avi
michael
parents: 5264
diff changeset
42 { PIX_FMT_PAL8, 4 },
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
43 { PIX_FMT_PAL8, 8 },
11839
33498215b74f fix rgb444 support in avi.
michael
parents: 11753
diff changeset
44 { PIX_FMT_RGB444, 12 },
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
45 { PIX_FMT_RGB555, 15 },
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
46 { PIX_FMT_RGB555, 16 },
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
47 { PIX_FMT_BGR24, 24 },
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
48 { PIX_FMT_RGB32, 32 },
8023
76f6a08c9fe6 Fix some icc warnings by using enum PixelFormat instead of int where appropriate.
cehoyos
parents: 7823
diff changeset
49 { PIX_FMT_NONE, 0 },
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
50 };
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
51
11753
4c894b716948 Rename pixelFormatBpsAVI to pix_fmt_bps_avi and pixelFormatBpsMOV to
stefano
parents: 11752
diff changeset
52 static const PixelFormatTag pix_fmt_bps_mov[] = {
10756
d2c1c2f835b7 Support raw black&white in mov, fixes issue 1654.
cehoyos
parents: 10736
diff changeset
53 { PIX_FMT_MONOWHITE, 1 },
10772
c76ee970d3bd Support decoding raw 2bpp in mov, fixes issue 1528.
cehoyos
parents: 10771
diff changeset
54 { PIX_FMT_PAL8, 2 },
6423
4cf5fde3c99e code is ok for 4bpp in mov too, fix 16grey.mov
bcoudurier
parents: 6247
diff changeset
55 { PIX_FMT_PAL8, 4 },
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
56 { PIX_FMT_PAL8, 8 },
9620
3ac52a187883 update comment for rgb 16 bit in .mov
bcoudurier
parents: 9355
diff changeset
57 // FIXME swscale does not support 16 bit in .mov, sample 16bit.mov
3ac52a187883 update comment for rgb 16 bit in .mov
bcoudurier
parents: 9355
diff changeset
58 // http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html
10757
9de8bd6b4ca4 Fix colourspace for 16 bit raw video in mov, fixes issue 1527 on big-endian.
cehoyos
parents: 10756
diff changeset
59 { PIX_FMT_RGB555BE, 16 },
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
60 { PIX_FMT_RGB24, 24 },
10736
8a9b0b693a30 Use correct pixfmt for 32 bit raw in mov also on big-endian, fixes issue 1630.
cehoyos
parents: 10390
diff changeset
61 { PIX_FMT_ARGB, 32 },
8023
76f6a08c9fe6 Fix some icc warnings by using enum PixelFormat instead of int where appropriate.
cehoyos
parents: 7823
diff changeset
62 { PIX_FMT_NONE, 0 },
5264
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
11752
3ba304b8cbd2 Rename findPixelFormat() to find_pix_fmt().
stefano
parents: 11751
diff changeset
65 static enum PixelFormat find_pix_fmt(const PixelFormatTag *tags, unsigned int fourcc)
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
66 {
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
67 while (tags->pix_fmt >= 0) {
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
68 if (tags->fourcc == fourcc)
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
69 return tags->pix_fmt;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
70 tags++;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
71 }
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
72 return PIX_FMT_YUV420P;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
73 }
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
74
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6424
diff changeset
75 static av_cold int raw_init_decoder(AVCodecContext *avctx)
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
76 {
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
77 RawVideoContext *context = avctx->priv_data;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
78
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
79 if (avctx->codec_tag == MKTAG('r','a','w',' '))
11753
4c894b716948 Rename pixelFormatBpsAVI to pix_fmt_bps_avi and pixelFormatBpsMOV to
stefano
parents: 11752
diff changeset
80 avctx->pix_fmt = find_pix_fmt(pix_fmt_bps_mov, avctx->bits_per_coded_sample);
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
81 else if (avctx->codec_tag)
11752
3ba304b8cbd2 Rename findPixelFormat() to find_pix_fmt().
stefano
parents: 11751
diff changeset
82 avctx->pix_fmt = find_pix_fmt(ff_raw_pix_fmt_tags, avctx->codec_tag);
11861
f6a2af58f3e0 avcodec.h: Clarify AVCodecContext::pix_fmt documentation since its value may be set by the demuxer
thardin
parents: 11839
diff changeset
83 else if (avctx->pix_fmt == PIX_FMT_NONE && avctx->bits_per_coded_sample)
11753
4c894b716948 Rename pixelFormatBpsAVI to pix_fmt_bps_avi and pixelFormatBpsMOV to
stefano
parents: 11752
diff changeset
84 avctx->pix_fmt = find_pix_fmt(pix_fmt_bps_avi, avctx->bits_per_coded_sample);
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
85
12514
e6d711ba5760 rawdec: ensure that there is always a valid palette for formats that
reimar
parents: 12507
diff changeset
86 ff_set_systematic_pal(context->palette, avctx->pix_fmt);
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
87 context->length = avpicture_get_size(avctx->pix_fmt, avctx->width, avctx->height);
12507
46191b10d663 rawdec: only allocate a full-frame size buffer if it actually will
reimar
parents: 11861
diff changeset
88 if((avctx->bits_per_coded_sample == 4 || avctx->bits_per_coded_sample == 2) &&
46191b10d663 rawdec: only allocate a full-frame size buffer if it actually will
reimar
parents: 11861
diff changeset
89 avctx->pix_fmt==PIX_FMT_PAL8 &&
46191b10d663 rawdec: only allocate a full-frame size buffer if it actually will
reimar
parents: 11861
diff changeset
90 (!avctx->codec_tag || avctx->codec_tag == MKTAG('r','a','w',' '))){
46191b10d663 rawdec: only allocate a full-frame size buffer if it actually will
reimar
parents: 11861
diff changeset
91 context->buffer = av_malloc(context->length);
46191b10d663 rawdec: only allocate a full-frame size buffer if it actually will
reimar
parents: 11861
diff changeset
92 if (!context->buffer)
46191b10d663 rawdec: only allocate a full-frame size buffer if it actually will
reimar
parents: 11861
diff changeset
93 return -1;
46191b10d663 rawdec: only allocate a full-frame size buffer if it actually will
reimar
parents: 11861
diff changeset
94 }
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
95 context->pic.pict_type = FF_I_TYPE;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
96 context->pic.key_frame = 1;
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 avctx->coded_frame= &context->pic;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
99
9845
45d331133468 Add new FOURCC (0x0003) for raw DIB video, set flip flag accordingly.
darkshikari
parents: 9712
diff changeset
100 if((avctx->extradata_size >= 9 && !memcmp(avctx->extradata + avctx->extradata_size - 9, "BottomUp", 9)) ||
45d331133468 Add new FOURCC (0x0003) for raw DIB video, set flip flag accordingly.
darkshikari
parents: 9712
diff changeset
101 avctx->codec_tag == MKTAG( 3 , 0 , 0 , 0 ))
8993
80720c5427a0 Fix raw rgb/bgr vertical flip in avi based on info from http://www.fourcc.org/fccbihgt.php.
michael
parents: 8718
diff changeset
102 context->flip=1;
80720c5427a0 Fix raw rgb/bgr vertical flip in avi based on info from http://www.fourcc.org/fccbihgt.php.
michael
parents: 8718
diff changeset
103
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
104 return 0;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
105 }
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 static void flip(AVCodecContext *avctx, AVPicture * picture){
8995
michael
parents: 8993
diff changeset
108 picture->data[0] += picture->linesize[0] * (avctx->height-1);
michael
parents: 8993
diff changeset
109 picture->linesize[0] *= -1;
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
110 }
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
111
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
112 static int raw_decode(AVCodecContext *avctx,
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
113 void *data, int *data_size,
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9335
diff changeset
114 AVPacket *avpkt)
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
115 {
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9335
diff changeset
116 const uint8_t *buf = avpkt->data;
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9335
diff changeset
117 int buf_size = avpkt->size;
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
118 RawVideoContext *context = avctx->priv_data;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
119
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
120 AVFrame * frame = (AVFrame *) data;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
121 AVPicture * picture = (AVPicture *) data;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
122
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
123 frame->interlaced_frame = avctx->coded_frame->interlaced_frame;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
124 frame->top_field_first = avctx->coded_frame->top_field_first;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
125
10773
8413193405c5 Cosmetics: Fix indentation and comment after r21027.
cehoyos
parents: 10772
diff changeset
126 //2bpp and 4bpp raw in avi and mov (yes this is ugly ...)
12507
46191b10d663 rawdec: only allocate a full-frame size buffer if it actually will
reimar
parents: 11861
diff changeset
127 if (context->buffer) {
5419
67acef686665 support raw 4bpp avi
michael
parents: 5264
diff changeset
128 int i;
12507
46191b10d663 rawdec: only allocate a full-frame size buffer if it actually will
reimar
parents: 11861
diff changeset
129 uint8_t *dst = context->buffer;
10771
cea7769a2b62 Improve readability of 4bpp raw decoder and prepare for supporting 2bpp.
cehoyos
parents: 10757
diff changeset
130 buf_size = context->length - 256*4;
10772
c76ee970d3bd Support decoding raw 2bpp in mov, fixes issue 1528.
cehoyos
parents: 10771
diff changeset
131 if (avctx->bits_per_coded_sample == 4){
10773
8413193405c5 Cosmetics: Fix indentation and comment after r21027.
cehoyos
parents: 10772
diff changeset
132 for(i=0; 2*i+1 < buf_size; i++){
8413193405c5 Cosmetics: Fix indentation and comment after r21027.
cehoyos
parents: 10772
diff changeset
133 dst[2*i+0]= buf[i]>>4;
8413193405c5 Cosmetics: Fix indentation and comment after r21027.
cehoyos
parents: 10772
diff changeset
134 dst[2*i+1]= buf[i]&15;
8413193405c5 Cosmetics: Fix indentation and comment after r21027.
cehoyos
parents: 10772
diff changeset
135 }
10772
c76ee970d3bd Support decoding raw 2bpp in mov, fixes issue 1528.
cehoyos
parents: 10771
diff changeset
136 } else
c76ee970d3bd Support decoding raw 2bpp in mov, fixes issue 1528.
cehoyos
parents: 10771
diff changeset
137 for(i=0; 4*i+3 < buf_size; i++){
c76ee970d3bd Support decoding raw 2bpp in mov, fixes issue 1528.
cehoyos
parents: 10771
diff changeset
138 dst[4*i+0]= buf[i]>>6;
c76ee970d3bd Support decoding raw 2bpp in mov, fixes issue 1528.
cehoyos
parents: 10771
diff changeset
139 dst[4*i+1]= buf[i]>>4&3;
c76ee970d3bd Support decoding raw 2bpp in mov, fixes issue 1528.
cehoyos
parents: 10771
diff changeset
140 dst[4*i+2]= buf[i]>>2&3;
c76ee970d3bd Support decoding raw 2bpp in mov, fixes issue 1528.
cehoyos
parents: 10771
diff changeset
141 dst[4*i+3]= buf[i] &3;
c76ee970d3bd Support decoding raw 2bpp in mov, fixes issue 1528.
cehoyos
parents: 10771
diff changeset
142 }
10771
cea7769a2b62 Improve readability of 4bpp raw decoder and prepare for supporting 2bpp.
cehoyos
parents: 10757
diff changeset
143 buf= dst;
5419
67acef686665 support raw 4bpp avi
michael
parents: 5264
diff changeset
144 }
67acef686665 support raw 4bpp avi
michael
parents: 5264
diff changeset
145
11072
0f3a09795840 Fix r21223: AVup samples (issue 1685) need a buf offset like AV1x (issue 1684).
cehoyos
parents: 10895
diff changeset
146 if(avctx->codec_tag == MKTAG('A', 'V', '1', 'x') ||
0f3a09795840 Fix r21223: AVup samples (issue 1685) need a buf offset like AV1x (issue 1684).
cehoyos
parents: 10895
diff changeset
147 avctx->codec_tag == MKTAG('A', 'V', 'u', 'p'))
10895
1cebb3ea364b Correctly decode some Avid AV1x samples, fixes issue 1684.
cehoyos
parents: 10880
diff changeset
148 buf += buf_size - context->length;
1cebb3ea364b Correctly decode some Avid AV1x samples, fixes issue 1684.
cehoyos
parents: 10880
diff changeset
149
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
150 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
151 return -1;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
152
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
153 avpicture_fill(picture, buf, avctx->pix_fmt, avctx->width, avctx->height);
12514
e6d711ba5760 rawdec: ensure that there is always a valid palette for formats that
reimar
parents: 12507
diff changeset
154 if((avctx->pix_fmt==PIX_FMT_PAL8 && buf_size < context->length) ||
e6d711ba5760 rawdec: ensure that there is always a valid palette for formats that
reimar
parents: 12507
diff changeset
155 (avctx->pix_fmt!=PIX_FMT_PAL8 &&
e6d711ba5760 rawdec: ensure that there is always a valid palette for formats that
reimar
parents: 12507
diff changeset
156 (av_pix_fmt_descriptors[avctx->pix_fmt].flags & PIX_FMT_PAL))){
12507
46191b10d663 rawdec: only allocate a full-frame size buffer if it actually will
reimar
parents: 11861
diff changeset
157 frame->data[1]= context->palette;
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
158 }
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
159 if (avctx->palctrl && avctx->palctrl->palette_changed) {
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
160 memcpy(frame->data[1], avctx->palctrl->palette, AVPALETTE_SIZE);
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
161 avctx->palctrl->palette_changed = 0;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
162 }
11669
bd1701d38721 avi bgr24 padding fix.
michael
parents: 11644
diff changeset
163 if(avctx->pix_fmt==PIX_FMT_BGR24 && ((frame->linesize[0]+3)&~3)*avctx->height <= buf_size)
bd1701d38721 avi bgr24 padding fix.
michael
parents: 11644
diff changeset
164 frame->linesize[0] = (frame->linesize[0]+3)&~3;
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
165
8993
80720c5427a0 Fix raw rgb/bgr vertical flip in avi based on info from http://www.fourcc.org/fccbihgt.php.
michael
parents: 8718
diff changeset
166 if(context->flip)
8995
michael
parents: 8993
diff changeset
167 flip(avctx, picture);
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
168
9712
1cc354a5242c Support YVU9 AVI 4cc.
michael
parents: 9620
diff changeset
169 if ( avctx->codec_tag == MKTAG('Y', 'V', '1', '2')
1cc354a5242c Support YVU9 AVI 4cc.
michael
parents: 9620
diff changeset
170 || avctx->codec_tag == MKTAG('Y', 'V', 'U', '9'))
10390
5198794511a4 Simplify: use FFSWAP
reimar
parents: 9845
diff changeset
171 FFSWAP(uint8_t *, picture->data[1], picture->data[2]);
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
172
9335
c7396480f8e3 Map MOV fourcc YUV2 correctly to PIX_FMT_YUYV422.
cehoyos
parents: 8995
diff changeset
173 if(avctx->codec_tag == AV_RL32("yuv2") &&
c7396480f8e3 Map MOV fourcc YUV2 correctly to PIX_FMT_YUYV422.
cehoyos
parents: 8995
diff changeset
174 avctx->pix_fmt == PIX_FMT_YUYV422) {
c7396480f8e3 Map MOV fourcc YUV2 correctly to PIX_FMT_YUYV422.
cehoyos
parents: 8995
diff changeset
175 int x, y;
c7396480f8e3 Map MOV fourcc YUV2 correctly to PIX_FMT_YUYV422.
cehoyos
parents: 8995
diff changeset
176 uint8_t *line = picture->data[0];
c7396480f8e3 Map MOV fourcc YUV2 correctly to PIX_FMT_YUYV422.
cehoyos
parents: 8995
diff changeset
177 for(y = 0; y < avctx->height; y++) {
c7396480f8e3 Map MOV fourcc YUV2 correctly to PIX_FMT_YUYV422.
cehoyos
parents: 8995
diff changeset
178 for(x = 0; x < avctx->width; x++)
c7396480f8e3 Map MOV fourcc YUV2 correctly to PIX_FMT_YUYV422.
cehoyos
parents: 8995
diff changeset
179 line[2*x + 1] ^= 0x80;
c7396480f8e3 Map MOV fourcc YUV2 correctly to PIX_FMT_YUYV422.
cehoyos
parents: 8995
diff changeset
180 line += picture->linesize[0];
c7396480f8e3 Map MOV fourcc YUV2 correctly to PIX_FMT_YUYV422.
cehoyos
parents: 8995
diff changeset
181 }
c7396480f8e3 Map MOV fourcc YUV2 correctly to PIX_FMT_YUYV422.
cehoyos
parents: 8995
diff changeset
182 }
c7396480f8e3 Map MOV fourcc YUV2 correctly to PIX_FMT_YUYV422.
cehoyos
parents: 8995
diff changeset
183
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
184 *data_size = sizeof(AVPicture);
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
185 return buf_size;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
186 }
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
187
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6424
diff changeset
188 static av_cold int raw_close_decoder(AVCodecContext *avctx)
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
189 {
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
190 RawVideoContext *context = avctx->priv_data;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
191
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
192 av_freep(&context->buffer);
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
193 return 0;
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
194 }
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
195
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
196 AVCodec rawvideo_decoder = {
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
197 "rawvideo",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 11072
diff changeset
198 AVMEDIA_TYPE_VIDEO,
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
199 CODEC_ID_RAWVIDEO,
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
200 sizeof(RawVideoContext),
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
201 raw_init_decoder,
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
202 NULL,
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
203 raw_close_decoder,
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
204 raw_decode,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6712
diff changeset
205 .long_name = NULL_IF_CONFIG_SMALL("raw video"),
5264
810df021dbef split rawvideo encoder and decoder in their own files
aurel
parents:
diff changeset
206 };