Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4349 Serge 1
/*
2
 * Copyright (c) 2003-2010 Michael Niedermayer 
3
 *
4
 * This file is part of FFmpeg.
5
 *
6
 * FFmpeg is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU Lesser General Public
8
 * License as published by the Free Software Foundation; either
9
 * version 2.1 of the License, or (at your option) any later version.
10
 *
11
 * FFmpeg is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
 * Lesser General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU Lesser General Public
17
 * License along with FFmpeg; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
 */
20
 
21
/**
22
 * @file
23
 * H.264 DSP functions.
24
 * @author Michael Niedermayer 
25
 */
26
 
27
#ifndef AVCODEC_H264DSP_H
28
#define AVCODEC_H264DSP_H
29
 
30
#include 
31
 
32
typedef void (*h264_weight_func)(uint8_t *block, int stride, int height,
33
                                 int log2_denom, int weight, int offset);
34
typedef void (*h264_biweight_func)(uint8_t *dst, uint8_t *src,
35
                                   int stride, int height, int log2_denom,
36
                                   int weightd, int weights, int offset);
37
 
38
/**
39
 * Context for storing H.264 DSP functions
40
 */
41
typedef struct H264DSPContext {
42
    /* weighted MC */
43
    h264_weight_func weight_h264_pixels_tab[4];
44
    h264_biweight_func biweight_h264_pixels_tab[4];
45
 
46
    /* loop filter */
47
    void (*h264_v_loop_filter_luma)(uint8_t *pix /*align 16*/, int stride,
48
                                    int alpha, int beta, int8_t *tc0);
49
    void (*h264_h_loop_filter_luma)(uint8_t *pix /*align 4 */, int stride,
50
                                    int alpha, int beta, int8_t *tc0);
51
    void (*h264_h_loop_filter_luma_mbaff)(uint8_t *pix /*align 16*/, int stride,
52
                                          int alpha, int beta, int8_t *tc0);
53
    /* v/h_loop_filter_luma_intra: align 16 */
54
    void (*h264_v_loop_filter_luma_intra)(uint8_t *pix, int stride,
55
                                          int alpha, int beta);
56
    void (*h264_h_loop_filter_luma_intra)(uint8_t *pix, int stride,
57
                                          int alpha, int beta);
58
    void (*h264_h_loop_filter_luma_mbaff_intra)(uint8_t *pix /*align 16*/,
59
                                                int stride, int alpha, int beta);
60
    void (*h264_v_loop_filter_chroma)(uint8_t *pix /*align 8*/, int stride,
61
                                      int alpha, int beta, int8_t *tc0);
62
    void (*h264_h_loop_filter_chroma)(uint8_t *pix /*align 4*/, int stride,
63
                                      int alpha, int beta, int8_t *tc0);
64
    void (*h264_h_loop_filter_chroma_mbaff)(uint8_t *pix /*align 8*/,
65
                                            int stride, int alpha, int beta,
66
                                            int8_t *tc0);
67
    void (*h264_v_loop_filter_chroma_intra)(uint8_t *pix /*align 8*/,
68
                                            int stride, int alpha, int beta);
69
    void (*h264_h_loop_filter_chroma_intra)(uint8_t *pix /*align 8*/,
70
                                            int stride, int alpha, int beta);
71
    void (*h264_h_loop_filter_chroma_mbaff_intra)(uint8_t *pix /*align 8*/,
72
                                                  int stride, int alpha, int beta);
73
    // h264_loop_filter_strength: simd only. the C version is inlined in h264.c
74
    void (*h264_loop_filter_strength)(int16_t bS[2][4][4], uint8_t nnz[40],
75
                                      int8_t ref[2][40], int16_t mv[2][40][2],
76
                                      int bidir, int edges, int step,
77
                                      int mask_mv0, int mask_mv1, int field);
78
 
79
    /* IDCT */
80
    void (*h264_idct_add)(uint8_t *dst /*align 4*/,
81
                          int16_t *block /*align 16*/, int stride);
82
    void (*h264_idct8_add)(uint8_t *dst /*align 8*/,
83
                           int16_t *block /*align 16*/, int stride);
84
    void (*h264_idct_dc_add)(uint8_t *dst /*align 4*/,
85
                             int16_t *block /*align 16*/, int stride);
86
    void (*h264_idct8_dc_add)(uint8_t *dst /*align 8*/,
87
                              int16_t *block /*align 16*/, int stride);
88
 
89
    void (*h264_idct_add16)(uint8_t *dst /*align 16*/, const int *blockoffset,
90
                            int16_t *block /*align 16*/, int stride,
91
                            const uint8_t nnzc[15 * 8]);
92
    void (*h264_idct8_add4)(uint8_t *dst /*align 16*/, const int *blockoffset,
93
                            int16_t *block /*align 16*/, int stride,
94
                            const uint8_t nnzc[15 * 8]);
95
    void (*h264_idct_add8)(uint8_t **dst /*align 16*/, const int *blockoffset,
96
                           int16_t *block /*align 16*/, int stride,
97
                           const uint8_t nnzc[15 * 8]);
98
    void (*h264_idct_add16intra)(uint8_t *dst /*align 16*/, const int *blockoffset,
99
                                 int16_t *block /*align 16*/,
100
                                 int stride, const uint8_t nnzc[15 * 8]);
101
    void (*h264_luma_dc_dequant_idct)(int16_t *output,
102
                                      int16_t *input /*align 16*/, int qmul);
103
    void (*h264_chroma_dc_dequant_idct)(int16_t *block, int qmul);
104
 
105
    /* bypass-transform */
106
    void (*h264_add_pixels8_clear)(uint8_t *dst, int16_t *block, int stride);
107
    void (*h264_add_pixels4_clear)(uint8_t *dst, int16_t *block, int stride);
108
 
109
    /**
110
     * Search buf from the start for up to size bytes. Return the index
111
     * of a zero byte, or >= size if not found. Ideally, use lookahead
112
     * to filter out any zero bytes that are known to not be followed by
113
     * one or more further zero bytes and a one byte. Better still, filter
114
     * out any bytes that form the trailing_zero_8bits syntax element too.
115
     */
116
    int (*h264_find_start_code_candidate)(const uint8_t *buf, int size);
117
} H264DSPContext;
118
 
119
void ff_h264dsp_init(H264DSPContext *c, const int bit_depth,
120
                     const int chroma_format_idc);
121
void ff_h264dsp_init_arm(H264DSPContext *c, const int bit_depth,
122
                         const int chroma_format_idc);
123
void ff_h264dsp_init_ppc(H264DSPContext *c, const int bit_depth,
124
                         const int chroma_format_idc);
125
void ff_h264dsp_init_x86(H264DSPContext *c, const int bit_depth,
126
                         const int chroma_format_idc);
127
 
128
#endif /* AVCODEC_H264DSP_H */