2 * FFV1 codec for libavcodec
4 * Copyright (c) 2003-2013 Michael Niedermayer <michaelni@gmx.at>
6 * This file is part of FFmpeg.
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.
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.
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
25 * FF Video Codec 1 (a lossless codec)
28 #include "libavutil/attributes.h"
29 #include "libavutil/avassert.h"
32 #include "rangecoder.h"
34 #include "threadframe.h"
36 av_cold
int ff_ffv1_common_init(AVCodecContext
*avctx
)
38 FFV1Context
*s
= avctx
->priv_data
;
40 if (!avctx
->width
|| !avctx
->height
)
41 return AVERROR_INVALIDDATA
;
44 s
->flags
= avctx
->flags
;
46 s
->picture
.f
= av_frame_alloc();
47 s
->last_picture
.f
= av_frame_alloc();
48 if (!s
->picture
.f
|| !s
->last_picture
.f
)
49 return AVERROR(ENOMEM
);
51 s
->width
= avctx
->width
;
52 s
->height
= avctx
->height
;
61 av_cold
int ff_ffv1_init_slice_state(const FFV1Context
*f
, FFV1Context
*fs
)
65 fs
->plane_count
= f
->plane_count
;
66 fs
->transparency
= f
->transparency
;
67 for (j
= 0; j
< f
->plane_count
; j
++) {
68 PlaneContext
*const p
= &fs
->plane
[j
];
70 if (fs
->ac
!= AC_GOLOMB_RICE
) {
72 p
->state
= av_calloc(p
->context_count
, CONTEXT_SIZE
*
75 return AVERROR(ENOMEM
);
78 p
->vlc_state
= av_calloc(p
->context_count
, sizeof(*p
->vlc_state
));
80 return AVERROR(ENOMEM
);
81 for (i
= 0; i
< p
->context_count
; i
++) {
82 p
->vlc_state
[i
].error_sum
= 4;
83 p
->vlc_state
[i
].count
= 1;
89 if (fs
->ac
== AC_RANGE_CUSTOM_TAB
) {
90 //FIXME only redo if state_transition changed
91 for (j
= 1; j
< 256; j
++) {
92 fs
->c
. one_state
[ j
] = f
->state_transition
[j
];
93 fs
->c
.zero_state
[256 - j
] = 256 - fs
->c
.one_state
[j
];
100 av_cold
int ff_ffv1_init_slices_state(FFV1Context
*f
)
103 for (i
= 0; i
< f
->max_slice_count
; i
++) {
104 FFV1Context
*fs
= f
->slice_context
[i
];
105 if ((ret
= ff_ffv1_init_slice_state(f
, fs
)) < 0)
106 return AVERROR(ENOMEM
);
111 int ff_need_new_slices(int width
, int num_h_slices
, int chroma_shift
) {
112 int mpw
= 1<<chroma_shift
;
113 int i
= width
* (int64_t)(num_h_slices
- 1) / num_h_slices
;
115 return width
% mpw
&& (width
- i
) % mpw
== 0;
118 av_cold
int ff_ffv1_init_slice_contexts(FFV1Context
*f
)
120 int i
, max_slice_count
= f
->num_h_slices
* f
->num_v_slices
;
122 av_assert0(max_slice_count
> 0);
124 for (i
= 0; i
< max_slice_count
;) {
125 int sx
= i
% f
->num_h_slices
;
126 int sy
= i
/ f
->num_h_slices
;
127 int sxs
= f
->avctx
->width
* sx
/ f
->num_h_slices
;
128 int sxe
= f
->avctx
->width
* (sx
+ 1) / f
->num_h_slices
;
129 int sys
= f
->avctx
->height
* sy
/ f
->num_v_slices
;
130 int sye
= f
->avctx
->height
* (sy
+ 1) / f
->num_v_slices
;
131 FFV1Context
*fs
= av_mallocz(sizeof(*fs
));
136 f
->slice_context
[i
++] = fs
;
137 memcpy(fs
, f
, sizeof(*fs
));
138 memset(fs
->rc_stat2
, 0, sizeof(fs
->rc_stat2
));
140 fs
->slice_width
= sxe
- sxs
;
141 fs
->slice_height
= sye
- sys
;
145 fs
->sample_buffer
= av_malloc_array((fs
->width
+ 6), 3 * MAX_PLANES
*
146 sizeof(*fs
->sample_buffer
));
147 fs
->sample_buffer32
= av_malloc_array((fs
->width
+ 6), 3 * MAX_PLANES
*
148 sizeof(*fs
->sample_buffer32
));
149 if (!fs
->sample_buffer
|| !fs
->sample_buffer32
)
152 f
->max_slice_count
= max_slice_count
;
156 f
->max_slice_count
= i
;
157 return AVERROR(ENOMEM
);
160 int ff_ffv1_allocate_initial_states(FFV1Context
*f
)
164 for (i
= 0; i
< f
->quant_table_count
; i
++) {
165 f
->initial_states
[i
] = av_malloc_array(f
->context_count
[i
],
166 sizeof(*f
->initial_states
[i
]));
167 if (!f
->initial_states
[i
])
168 return AVERROR(ENOMEM
);
169 memset(f
->initial_states
[i
], 128,
170 f
->context_count
[i
] * sizeof(*f
->initial_states
[i
]));
175 void ff_ffv1_clear_slice_state(const FFV1Context
*f
, FFV1Context
*fs
)
179 for (i
= 0; i
< f
->plane_count
; i
++) {
180 PlaneContext
*p
= &fs
->plane
[i
];
182 p
->interlace_bit_state
[0] = 128;
183 p
->interlace_bit_state
[1] = 128;
185 if (fs
->ac
!= AC_GOLOMB_RICE
) {
186 if (f
->initial_states
[p
->quant_table_index
]) {
187 memcpy(p
->state
, f
->initial_states
[p
->quant_table_index
],
188 CONTEXT_SIZE
* p
->context_count
);
190 memset(p
->state
, 128, CONTEXT_SIZE
* p
->context_count
);
192 for (j
= 0; j
< p
->context_count
; j
++) {
193 p
->vlc_state
[j
].drift
= 0;
194 p
->vlc_state
[j
].error_sum
= 4; //FFMAX((RANGE + 32)/64, 2);
195 p
->vlc_state
[j
].bias
= 0;
196 p
->vlc_state
[j
].count
= 1;
203 av_cold
int ff_ffv1_close(AVCodecContext
*avctx
)
205 FFV1Context
*s
= avctx
->priv_data
;
209 ff_thread_release_ext_buffer(avctx
, &s
->picture
);
210 av_frame_free(&s
->picture
.f
);
212 if (s
->last_picture
.f
)
213 ff_thread_release_ext_buffer(avctx
, &s
->last_picture
);
214 av_frame_free(&s
->last_picture
.f
);
216 for (j
= 0; j
< s
->max_slice_count
; j
++) {
217 FFV1Context
*fs
= s
->slice_context
[j
];
218 for (i
= 0; i
< s
->plane_count
; i
++) {
219 PlaneContext
*p
= &fs
->plane
[i
];
222 av_freep(&p
->vlc_state
);
224 av_freep(&fs
->sample_buffer
);
225 av_freep(&fs
->sample_buffer32
);
228 av_freep(&avctx
->stats_out
);
229 for (j
= 0; j
< s
->quant_table_count
; j
++) {
230 av_freep(&s
->initial_states
[j
]);
231 for (i
= 0; i
< s
->max_slice_count
; i
++) {
232 FFV1Context
*sf
= s
->slice_context
[i
];
233 av_freep(&sf
->rc_stat2
[j
]);
235 av_freep(&s
->rc_stat2
[j
]);
238 for (i
= 0; i
< s
->max_slice_count
; i
++)
239 av_freep(&s
->slice_context
[i
]);