1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * FFV1 codec for libavcodec 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * Copyright (c) 2003-2013 Michael Niedermayer <michaelni@gmx.at> 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * This file is part of FFmpeg. 7cabdff1aSopenharmony_ci * 8cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 9cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 10cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 11cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 12cabdff1aSopenharmony_ci * 13cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 14cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 15cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16cabdff1aSopenharmony_ci * Lesser General Public License for more details. 17cabdff1aSopenharmony_ci * 18cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 19cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 20cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21cabdff1aSopenharmony_ci */ 22cabdff1aSopenharmony_ci 23cabdff1aSopenharmony_ci/** 24cabdff1aSopenharmony_ci * @file 25cabdff1aSopenharmony_ci * FF Video Codec 1 (a lossless codec) 26cabdff1aSopenharmony_ci */ 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci#include "libavutil/attributes.h" 29cabdff1aSopenharmony_ci#include "libavutil/avassert.h" 30cabdff1aSopenharmony_ci 31cabdff1aSopenharmony_ci#include "avcodec.h" 32cabdff1aSopenharmony_ci#include "rangecoder.h" 33cabdff1aSopenharmony_ci#include "ffv1.h" 34cabdff1aSopenharmony_ci#include "threadframe.h" 35cabdff1aSopenharmony_ci 36cabdff1aSopenharmony_ciav_cold int ff_ffv1_common_init(AVCodecContext *avctx) 37cabdff1aSopenharmony_ci{ 38cabdff1aSopenharmony_ci FFV1Context *s = avctx->priv_data; 39cabdff1aSopenharmony_ci 40cabdff1aSopenharmony_ci if (!avctx->width || !avctx->height) 41cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 42cabdff1aSopenharmony_ci 43cabdff1aSopenharmony_ci s->avctx = avctx; 44cabdff1aSopenharmony_ci s->flags = avctx->flags; 45cabdff1aSopenharmony_ci 46cabdff1aSopenharmony_ci s->picture.f = av_frame_alloc(); 47cabdff1aSopenharmony_ci s->last_picture.f = av_frame_alloc(); 48cabdff1aSopenharmony_ci if (!s->picture.f || !s->last_picture.f) 49cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 50cabdff1aSopenharmony_ci 51cabdff1aSopenharmony_ci s->width = avctx->width; 52cabdff1aSopenharmony_ci s->height = avctx->height; 53cabdff1aSopenharmony_ci 54cabdff1aSopenharmony_ci // defaults 55cabdff1aSopenharmony_ci s->num_h_slices = 1; 56cabdff1aSopenharmony_ci s->num_v_slices = 1; 57cabdff1aSopenharmony_ci 58cabdff1aSopenharmony_ci return 0; 59cabdff1aSopenharmony_ci} 60cabdff1aSopenharmony_ci 61cabdff1aSopenharmony_ciav_cold int ff_ffv1_init_slice_state(const FFV1Context *f, FFV1Context *fs) 62cabdff1aSopenharmony_ci{ 63cabdff1aSopenharmony_ci int j, i; 64cabdff1aSopenharmony_ci 65cabdff1aSopenharmony_ci fs->plane_count = f->plane_count; 66cabdff1aSopenharmony_ci fs->transparency = f->transparency; 67cabdff1aSopenharmony_ci for (j = 0; j < f->plane_count; j++) { 68cabdff1aSopenharmony_ci PlaneContext *const p = &fs->plane[j]; 69cabdff1aSopenharmony_ci 70cabdff1aSopenharmony_ci if (fs->ac != AC_GOLOMB_RICE) { 71cabdff1aSopenharmony_ci if (!p->state) 72cabdff1aSopenharmony_ci p->state = av_malloc_array(p->context_count, CONTEXT_SIZE * 73cabdff1aSopenharmony_ci sizeof(uint8_t)); 74cabdff1aSopenharmony_ci if (!p->state) 75cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 76cabdff1aSopenharmony_ci } else { 77cabdff1aSopenharmony_ci if (!p->vlc_state) { 78cabdff1aSopenharmony_ci p->vlc_state = av_calloc(p->context_count, sizeof(*p->vlc_state)); 79cabdff1aSopenharmony_ci if (!p->vlc_state) 80cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 81cabdff1aSopenharmony_ci for (i = 0; i < p->context_count; i++) { 82cabdff1aSopenharmony_ci p->vlc_state[i].error_sum = 4; 83cabdff1aSopenharmony_ci p->vlc_state[i].count = 1; 84cabdff1aSopenharmony_ci } 85cabdff1aSopenharmony_ci } 86cabdff1aSopenharmony_ci } 87cabdff1aSopenharmony_ci } 88cabdff1aSopenharmony_ci 89cabdff1aSopenharmony_ci if (fs->ac == AC_RANGE_CUSTOM_TAB) { 90cabdff1aSopenharmony_ci //FIXME only redo if state_transition changed 91cabdff1aSopenharmony_ci for (j = 1; j < 256; j++) { 92cabdff1aSopenharmony_ci fs->c. one_state[ j] = f->state_transition[j]; 93cabdff1aSopenharmony_ci fs->c.zero_state[256 - j] = 256 - fs->c.one_state[j]; 94cabdff1aSopenharmony_ci } 95cabdff1aSopenharmony_ci } 96cabdff1aSopenharmony_ci 97cabdff1aSopenharmony_ci return 0; 98cabdff1aSopenharmony_ci} 99cabdff1aSopenharmony_ci 100cabdff1aSopenharmony_ciav_cold int ff_ffv1_init_slices_state(FFV1Context *f) 101cabdff1aSopenharmony_ci{ 102cabdff1aSopenharmony_ci int i, ret; 103cabdff1aSopenharmony_ci for (i = 0; i < f->max_slice_count; i++) { 104cabdff1aSopenharmony_ci FFV1Context *fs = f->slice_context[i]; 105cabdff1aSopenharmony_ci if ((ret = ff_ffv1_init_slice_state(f, fs)) < 0) 106cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 107cabdff1aSopenharmony_ci } 108cabdff1aSopenharmony_ci return 0; 109cabdff1aSopenharmony_ci} 110cabdff1aSopenharmony_ci 111cabdff1aSopenharmony_ciav_cold int ff_ffv1_init_slice_contexts(FFV1Context *f) 112cabdff1aSopenharmony_ci{ 113cabdff1aSopenharmony_ci int i, max_slice_count = f->num_h_slices * f->num_v_slices; 114cabdff1aSopenharmony_ci 115cabdff1aSopenharmony_ci av_assert0(max_slice_count > 0); 116cabdff1aSopenharmony_ci 117cabdff1aSopenharmony_ci for (i = 0; i < max_slice_count;) { 118cabdff1aSopenharmony_ci int sx = i % f->num_h_slices; 119cabdff1aSopenharmony_ci int sy = i / f->num_h_slices; 120cabdff1aSopenharmony_ci int sxs = f->avctx->width * sx / f->num_h_slices; 121cabdff1aSopenharmony_ci int sxe = f->avctx->width * (sx + 1) / f->num_h_slices; 122cabdff1aSopenharmony_ci int sys = f->avctx->height * sy / f->num_v_slices; 123cabdff1aSopenharmony_ci int sye = f->avctx->height * (sy + 1) / f->num_v_slices; 124cabdff1aSopenharmony_ci FFV1Context *fs = av_mallocz(sizeof(*fs)); 125cabdff1aSopenharmony_ci 126cabdff1aSopenharmony_ci if (!fs) 127cabdff1aSopenharmony_ci goto memfail; 128cabdff1aSopenharmony_ci 129cabdff1aSopenharmony_ci f->slice_context[i++] = fs; 130cabdff1aSopenharmony_ci memcpy(fs, f, sizeof(*fs)); 131cabdff1aSopenharmony_ci memset(fs->rc_stat2, 0, sizeof(fs->rc_stat2)); 132cabdff1aSopenharmony_ci 133cabdff1aSopenharmony_ci fs->slice_width = sxe - sxs; 134cabdff1aSopenharmony_ci fs->slice_height = sye - sys; 135cabdff1aSopenharmony_ci fs->slice_x = sxs; 136cabdff1aSopenharmony_ci fs->slice_y = sys; 137cabdff1aSopenharmony_ci 138cabdff1aSopenharmony_ci fs->sample_buffer = av_malloc_array((fs->width + 6), 3 * MAX_PLANES * 139cabdff1aSopenharmony_ci sizeof(*fs->sample_buffer)); 140cabdff1aSopenharmony_ci fs->sample_buffer32 = av_malloc_array((fs->width + 6), 3 * MAX_PLANES * 141cabdff1aSopenharmony_ci sizeof(*fs->sample_buffer32)); 142cabdff1aSopenharmony_ci if (!fs->sample_buffer || !fs->sample_buffer32) 143cabdff1aSopenharmony_ci goto memfail; 144cabdff1aSopenharmony_ci } 145cabdff1aSopenharmony_ci f->max_slice_count = max_slice_count; 146cabdff1aSopenharmony_ci return 0; 147cabdff1aSopenharmony_ci 148cabdff1aSopenharmony_cimemfail: 149cabdff1aSopenharmony_ci f->max_slice_count = i; 150cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 151cabdff1aSopenharmony_ci} 152cabdff1aSopenharmony_ci 153cabdff1aSopenharmony_ciint ff_ffv1_allocate_initial_states(FFV1Context *f) 154cabdff1aSopenharmony_ci{ 155cabdff1aSopenharmony_ci int i; 156cabdff1aSopenharmony_ci 157cabdff1aSopenharmony_ci for (i = 0; i < f->quant_table_count; i++) { 158cabdff1aSopenharmony_ci f->initial_states[i] = av_malloc_array(f->context_count[i], 159cabdff1aSopenharmony_ci sizeof(*f->initial_states[i])); 160cabdff1aSopenharmony_ci if (!f->initial_states[i]) 161cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 162cabdff1aSopenharmony_ci memset(f->initial_states[i], 128, 163cabdff1aSopenharmony_ci f->context_count[i] * sizeof(*f->initial_states[i])); 164cabdff1aSopenharmony_ci } 165cabdff1aSopenharmony_ci return 0; 166cabdff1aSopenharmony_ci} 167cabdff1aSopenharmony_ci 168cabdff1aSopenharmony_civoid ff_ffv1_clear_slice_state(const FFV1Context *f, FFV1Context *fs) 169cabdff1aSopenharmony_ci{ 170cabdff1aSopenharmony_ci int i, j; 171cabdff1aSopenharmony_ci 172cabdff1aSopenharmony_ci for (i = 0; i < f->plane_count; i++) { 173cabdff1aSopenharmony_ci PlaneContext *p = &fs->plane[i]; 174cabdff1aSopenharmony_ci 175cabdff1aSopenharmony_ci p->interlace_bit_state[0] = 128; 176cabdff1aSopenharmony_ci p->interlace_bit_state[1] = 128; 177cabdff1aSopenharmony_ci 178cabdff1aSopenharmony_ci if (fs->ac != AC_GOLOMB_RICE) { 179cabdff1aSopenharmony_ci if (f->initial_states[p->quant_table_index]) { 180cabdff1aSopenharmony_ci memcpy(p->state, f->initial_states[p->quant_table_index], 181cabdff1aSopenharmony_ci CONTEXT_SIZE * p->context_count); 182cabdff1aSopenharmony_ci } else 183cabdff1aSopenharmony_ci memset(p->state, 128, CONTEXT_SIZE * p->context_count); 184cabdff1aSopenharmony_ci } else { 185cabdff1aSopenharmony_ci for (j = 0; j < p->context_count; j++) { 186cabdff1aSopenharmony_ci p->vlc_state[j].drift = 0; 187cabdff1aSopenharmony_ci p->vlc_state[j].error_sum = 4; //FFMAX((RANGE + 32)/64, 2); 188cabdff1aSopenharmony_ci p->vlc_state[j].bias = 0; 189cabdff1aSopenharmony_ci p->vlc_state[j].count = 1; 190cabdff1aSopenharmony_ci } 191cabdff1aSopenharmony_ci } 192cabdff1aSopenharmony_ci } 193cabdff1aSopenharmony_ci} 194cabdff1aSopenharmony_ci 195cabdff1aSopenharmony_ci 196cabdff1aSopenharmony_ciav_cold int ff_ffv1_close(AVCodecContext *avctx) 197cabdff1aSopenharmony_ci{ 198cabdff1aSopenharmony_ci FFV1Context *s = avctx->priv_data; 199cabdff1aSopenharmony_ci int i, j; 200cabdff1aSopenharmony_ci 201cabdff1aSopenharmony_ci if (s->picture.f) 202cabdff1aSopenharmony_ci ff_thread_release_ext_buffer(avctx, &s->picture); 203cabdff1aSopenharmony_ci av_frame_free(&s->picture.f); 204cabdff1aSopenharmony_ci 205cabdff1aSopenharmony_ci if (s->last_picture.f) 206cabdff1aSopenharmony_ci ff_thread_release_ext_buffer(avctx, &s->last_picture); 207cabdff1aSopenharmony_ci av_frame_free(&s->last_picture.f); 208cabdff1aSopenharmony_ci 209cabdff1aSopenharmony_ci for (j = 0; j < s->max_slice_count; j++) { 210cabdff1aSopenharmony_ci FFV1Context *fs = s->slice_context[j]; 211cabdff1aSopenharmony_ci for (i = 0; i < s->plane_count; i++) { 212cabdff1aSopenharmony_ci PlaneContext *p = &fs->plane[i]; 213cabdff1aSopenharmony_ci 214cabdff1aSopenharmony_ci av_freep(&p->state); 215cabdff1aSopenharmony_ci av_freep(&p->vlc_state); 216cabdff1aSopenharmony_ci } 217cabdff1aSopenharmony_ci av_freep(&fs->sample_buffer); 218cabdff1aSopenharmony_ci av_freep(&fs->sample_buffer32); 219cabdff1aSopenharmony_ci } 220cabdff1aSopenharmony_ci 221cabdff1aSopenharmony_ci av_freep(&avctx->stats_out); 222cabdff1aSopenharmony_ci for (j = 0; j < s->quant_table_count; j++) { 223cabdff1aSopenharmony_ci av_freep(&s->initial_states[j]); 224cabdff1aSopenharmony_ci for (i = 0; i < s->max_slice_count; i++) { 225cabdff1aSopenharmony_ci FFV1Context *sf = s->slice_context[i]; 226cabdff1aSopenharmony_ci av_freep(&sf->rc_stat2[j]); 227cabdff1aSopenharmony_ci } 228cabdff1aSopenharmony_ci av_freep(&s->rc_stat2[j]); 229cabdff1aSopenharmony_ci } 230cabdff1aSopenharmony_ci 231cabdff1aSopenharmony_ci for (i = 0; i < s->max_slice_count; i++) 232cabdff1aSopenharmony_ci av_freep(&s->slice_context[i]); 233cabdff1aSopenharmony_ci 234cabdff1aSopenharmony_ci return 0; 235cabdff1aSopenharmony_ci} 236