2 * This file is part of Libav.
4 * Libav is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * Libav is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with Libav; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "libavutil/attributes.h"
23 #include "libavutil/mem.h"
27 void ff_rl_free(RLTable
*rl
)
31 for (i
= 0; i
< 2; i
++) {
32 av_freep(&rl
->max_run
[i
]);
33 av_freep(&rl
->max_level
[i
]);
34 av_freep(&rl
->index_run
[i
]);
38 av_cold
int ff_rl_init(RLTable
*rl
,
39 uint8_t static_store
[2][2 * MAX_RUN
+ MAX_LEVEL
+ 3])
41 int8_t max_level
[MAX_RUN
+ 1], max_run
[MAX_LEVEL
+ 1];
42 uint8_t index_run
[MAX_RUN
+ 1];
43 int last
, run
, level
, start
, end
, i
;
45 /* If table is static, we can quit if rl->max_level[0] is not NULL */
46 if (static_store
&& rl
->max_level
[0])
49 /* compute max_level[], max_run[] and index_run[] */
50 for (last
= 0; last
< 2; last
++) {
59 memset(max_level
, 0, MAX_RUN
+ 1);
60 memset(max_run
, 0, MAX_LEVEL
+ 1);
61 memset(index_run
, rl
->n
, MAX_RUN
+ 1);
62 for (i
= start
; i
< end
; i
++) {
63 run
= rl
->table_run
[i
];
64 level
= rl
->table_level
[i
];
65 if (index_run
[run
] == rl
->n
)
67 if (level
> max_level
[run
])
68 max_level
[run
] = level
;
69 if (run
> max_run
[level
])
73 rl
->max_level
[last
] = static_store
[last
];
75 rl
->max_level
[last
] = av_malloc(MAX_RUN
+ 1);
76 if (!rl
->max_level
[last
])
79 memcpy(rl
->max_level
[last
], max_level
, MAX_RUN
+ 1);
81 rl
->max_run
[last
] = static_store
[last
] + MAX_RUN
+ 1;
83 rl
->max_run
[last
] = av_malloc(MAX_LEVEL
+ 1);
84 if (!rl
->max_run
[last
])
87 memcpy(rl
->max_run
[last
], max_run
, MAX_LEVEL
+ 1);
89 rl
->index_run
[last
] = static_store
[last
] + MAX_RUN
+ MAX_LEVEL
+ 2;
91 rl
->index_run
[last
] = av_malloc(MAX_RUN
+ 1);
92 if (!rl
->index_run
[last
])
95 memcpy(rl
->index_run
[last
], index_run
, MAX_RUN
+ 1);
101 return AVERROR(ENOMEM
);
104 av_cold
void ff_rl_init_vlc(RLTable
*rl
)
108 for (q
= 0; q
< 32; q
++) {
110 int qadd
= (q
- 1) | 1;
116 for (i
= 0; i
< rl
->vlc
.table_size
; i
++) {
117 int code
= rl
->vlc
.table
[i
][0];
118 int len
= rl
->vlc
.table
[i
][1];
121 if (len
== 0) { // illegal code
124 } else if (len
< 0) { // more bits needed
128 if (code
== rl
->n
) { // esc
132 run
= rl
->table_run
[code
] + 1;
133 level
= rl
->table_level
[code
] * qmul
+ qadd
;
134 if (code
>= rl
->last
) run
+= 192;
137 rl
->rl_vlc
[q
][i
].len
= len
;
138 rl
->rl_vlc
[q
][i
].level
= level
;
139 rl
->rl_vlc
[q
][i
].run
= run
;