annotate rv20enc.c @ 10549:981e7720fc03 libavcodec

Allocate pictures with enough padding for jpeg. Ensure that jpeg does not use mbs that could require larger padding. This might have been exploitable.
author michael
date Fri, 20 Nov 2009 22:14:37 +0000
parents 38cfe222e1a4
children 86bf7e0db6ea
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10017
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
1 /*
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
2 * RV20 encoder
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
3 * Copyright (c) 2000,2001 Fabrice Bellard
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
4 * Copyright (c) 2002-2004 Michael Niedermayer
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
5 *
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
6 * This file is part of FFmpeg.
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
7 *
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
10 * License as published by the Free Software Foundation; either
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
12 *
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
16 * Lesser General Public License for more details.
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
17 *
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
21 */
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
22
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
23 /**
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
24 * @file libavcodec/rv20enc.c
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
25 * RV20 encoder
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
26 */
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
27
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
28 #include "mpegvideo.h"
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
29 #include "put_bits.h"
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
30
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
31 void rv20_encode_picture_header(MpegEncContext *s, int picture_number){
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
32 put_bits(&s->pb, 2, s->pict_type); //I 0 vs. 1 ?
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
33 put_bits(&s->pb, 1, 0); /* unknown bit */
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
34 put_bits(&s->pb, 5, s->qscale);
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
35
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
36 put_sbits(&s->pb, 8, picture_number); //FIXME wrong, but correct is not known
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
37 s->mb_x= s->mb_y= 0;
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
38 ff_h263_encode_mba(s);
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
39
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
40 put_bits(&s->pb, 1, s->no_rounding);
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
41
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
42 assert(s->f_code == 1);
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
43 assert(s->unrestricted_mv == 1);
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
44 assert(s->alt_inter_vlc == 0);
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
45 assert(s->umvplus == 0);
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
46 assert(s->modified_quant==1);
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
47 assert(s->loop_filter==1);
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
48
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
49 s->h263_aic= s->pict_type == FF_I_TYPE;
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
50 if(s->h263_aic){
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
51 s->y_dc_scale_table=
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
52 s->c_dc_scale_table= ff_aic_dc_scale_table;
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
53 }else{
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
54 s->y_dc_scale_table=
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
55 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
56 }
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
57 }
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
58
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
59 AVCodec rv20_encoder = {
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
60 "rv20",
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
61 CODEC_TYPE_VIDEO,
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
62 CODEC_ID_RV20,
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
63 sizeof(MpegEncContext),
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
64 MPV_encode_init,
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
65 MPV_encode_picture,
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
66 MPV_encode_end,
10146
38cfe222e1a4 Mark all pix_fmts and supported_framerates compound literals as const.
reimar
parents: 10017
diff changeset
67 .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE},
10017
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
68 .long_name= NULL_IF_CONFIG_SMALL("RealVideo 2.0"),
988e20e4da2f Split RV20 encoder into its own file.
diego
parents:
diff changeset
69 };