Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4349 Serge 1
/*
2
 * MPEG4 encoder/decoder internal header.
3
 * Copyright (c) 2000,2001 Fabrice Bellard
4
 * Copyright (c) 2002-2010 Michael Niedermayer 
5
 *
6
 * This file is part of FFmpeg.
7
 *
8
 * FFmpeg is free software; you can redistribute it and/or
9
 * modify it under the terms of the GNU Lesser General Public
10
 * License as published by the Free Software Foundation; either
11
 * version 2.1 of the License, or (at your option) any later version.
12
 *
13
 * FFmpeg is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16
 * Lesser General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU Lesser General Public
19
 * License along with FFmpeg; if not, write to the Free Software
20
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21
 */
22
 
23
#ifndef AVCODEC_MPEG4VIDEO_H
24
#define AVCODEC_MPEG4VIDEO_H
25
 
26
#include 
27
#include "get_bits.h"
28
#include "mpegvideo.h"
29
#include "rl.h"
30
 
31
// shapes
32
#define RECT_SHAPE       0
33
#define BIN_SHAPE        1
34
#define BIN_ONLY_SHAPE   2
35
#define GRAY_SHAPE       3
36
 
37
#define SIMPLE_VO_TYPE             1
38
#define CORE_VO_TYPE               3
39
#define MAIN_VO_TYPE               4
40
#define NBIT_VO_TYPE               5
41
#define ARTS_VO_TYPE               10
42
#define ACE_VO_TYPE                12
43
#define ADV_SIMPLE_VO_TYPE         17
44
 
45
// aspect_ratio_info
46
#define EXTENDED_PAR 15
47
 
48
//vol_sprite_usage / sprite_enable
49
#define STATIC_SPRITE 1
50
#define GMC_SPRITE 2
51
 
52
#define MOTION_MARKER 0x1F001
53
#define DC_MARKER     0x6B001
54
 
55
#define VOS_STARTCODE        0x1B0
56
#define USER_DATA_STARTCODE  0x1B2
57
#define GOP_STARTCODE        0x1B3
58
#define VISUAL_OBJ_STARTCODE 0x1B5
59
#define VOP_STARTCODE        0x1B6
60
 
61
/* dc encoding for mpeg4 */
62
extern const uint8_t ff_mpeg4_DCtab_lum[13][2];
63
extern const uint8_t ff_mpeg4_DCtab_chrom[13][2];
64
 
65
extern const uint16_t ff_mpeg4_intra_vlc[103][2];
66
extern const int8_t ff_mpeg4_intra_level[102];
67
extern const int8_t ff_mpeg4_intra_run[102];
68
 
69
extern RLTable ff_mpeg4_rl_intra;
70
 
71
/* Note this is identical to the intra rvlc except that it is reordered. */
72
extern RLTable ff_rvlc_rl_inter;
73
extern RLTable ff_rvlc_rl_intra;
74
 
75
extern const uint16_t ff_sprite_trajectory_tab[15][2];
76
extern const uint8_t ff_mb_type_b_tab[4][2];
77
 
78
/* these matrixes will be permuted for the idct */
79
extern const int16_t ff_mpeg4_default_intra_matrix[64];
80
extern const int16_t ff_mpeg4_default_non_intra_matrix[64];
81
 
82
extern const uint8_t ff_mpeg4_y_dc_scale_table[32];
83
extern const uint8_t ff_mpeg4_c_dc_scale_table[32];
84
extern const uint16_t ff_mpeg4_resync_prefix[8];
85
 
86
extern const uint8_t ff_mpeg4_dc_threshold[8];
87
 
88
void ff_mpeg4_encode_mb(MpegEncContext *s,
89
                        int16_t block[6][64],
90
                        int motion_x, int motion_y);
91
void ff_mpeg4_pred_ac(MpegEncContext * s, int16_t *block, int n,
92
                      int dir);
93
void ff_set_mpeg4_time(MpegEncContext * s);
94
void ff_mpeg4_encode_picture_header(MpegEncContext *s, int picture_number);
95
 
96
int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb);
97
void ff_mpeg4_encode_video_packet_header(MpegEncContext *s);
98
void ff_mpeg4_clean_buffers(MpegEncContext *s);
99
void ff_mpeg4_stuffing(PutBitContext * pbc);
100
void ff_mpeg4_init_partitions(MpegEncContext *s);
101
void ff_mpeg4_merge_partitions(MpegEncContext *s);
102
void ff_clean_mpeg4_qscales(MpegEncContext *s);
103
int ff_mpeg4_decode_partitions(MpegEncContext *s);
104
int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s);
105
int ff_mpeg4_decode_video_packet_header(MpegEncContext *s);
106
void ff_mpeg4_init_direct_mv(MpegEncContext *s);
107
void ff_mpeg4videodec_static_init(void);
108
 
109
/**
110
 *
111
 * @return the mb_type
112
 */
113
int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my);
114
 
115
extern uint8_t ff_mpeg4_static_rl_table_store[3][2][2*MAX_RUN + MAX_LEVEL + 3];
116
 
117
 
118
#if 0 //3IV1 is quite rare and it slows things down a tiny bit
119
#define IS_3IV1 s->codec_tag == AV_RL32("3IV1")
120
#else
121
#define IS_3IV1 0
122
#endif
123
 
124
 
125
/**
126
 * Predict the dc.
127
 * encoding quantized level -> quantized diff
128
 * decoding quantized diff -> quantized level
129
 * @param n block index (0-3 are luma, 4-5 are chroma)
130
 * @param dir_ptr pointer to an integer where the prediction direction will be stored
131
 */
132
static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, int level, int *dir_ptr, int encoding)
133
{
134
    int a, b, c, wrap, pred, scale, ret;
135
    int16_t *dc_val;
136
 
137
    /* find prediction */
138
    if (n < 4) {
139
        scale = s->y_dc_scale;
140
    } else {
141
        scale = s->c_dc_scale;
142
    }
143
    if(IS_3IV1)
144
        scale= 8;
145
 
146
    wrap= s->block_wrap[n];
147
    dc_val = s->dc_val[0] + s->block_index[n];
148
 
149
    /* B C
150
     * A X
151
     */
152
    a = dc_val[ - 1];
153
    b = dc_val[ - 1 - wrap];
154
    c = dc_val[ - wrap];
155
 
156
    /* outside slice handling (we can't do that by memset as we need the dc for error resilience) */
157
    if(s->first_slice_line && n!=3){
158
        if(n!=2) b=c= 1024;
159
        if(n!=1 && s->mb_x == s->resync_mb_x) b=a= 1024;
160
    }
161
    if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1){
162
        if(n==0 || n==4 || n==5)
163
            b=1024;
164
    }
165
 
166
    if (abs(a - b) < abs(b - c)) {
167
        pred = c;
168
        *dir_ptr = 1; /* top */
169
    } else {
170
        pred = a;
171
        *dir_ptr = 0; /* left */
172
    }
173
    /* we assume pred is positive */
174
    pred = FASTDIV((pred + (scale >> 1)), scale);
175
 
176
    if(encoding){
177
        ret = level - pred;
178
    }else{
179
        level += pred;
180
        ret= level;
181
        if(s->err_recognition&(AV_EF_BITSTREAM|AV_EF_AGGRESSIVE)){
182
            if(level<0){
183
                av_log(s->avctx, AV_LOG_ERROR, "dc<0 at %dx%d\n", s->mb_x, s->mb_y);
184
                return -1;
185
            }
186
            if(level*scale > 2048 + scale){
187
                av_log(s->avctx, AV_LOG_ERROR, "dc overflow at %dx%d\n", s->mb_x, s->mb_y);
188
                return -1;
189
            }
190
        }
191
    }
192
    level *=scale;
193
    if(level&(~2047)){
194
        if(level<0)
195
            level=0;
196
        else if(!(s->workaround_bugs&FF_BUG_DC_CLIP))
197
            level=2047;
198
    }
199
    dc_val[0]= level;
200
 
201
    return ret;
202
}
203
#endif /* AVCODEC_MPEG4VIDEO_H */