1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

prores: change license to LGPL, merge some parts.

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Elvis Presley 2011-10-12 19:10:22 +02:00 committed by Michael Niedermayer
parent b87d882578
commit bebaf4ea1f
5 changed files with 94 additions and 87 deletions

View File

@ -313,7 +313,7 @@ OBJS-$(CONFIG_PNG_DECODER) += png.o pngdec.o
OBJS-$(CONFIG_PNG_ENCODER) += png.o pngenc.o OBJS-$(CONFIG_PNG_ENCODER) += png.o pngenc.o
OBJS-$(CONFIG_PPM_DECODER) += pnmdec.o pnm.o OBJS-$(CONFIG_PPM_DECODER) += pnmdec.o pnm.o
OBJS-$(CONFIG_PPM_ENCODER) += pnmenc.o pnm.o OBJS-$(CONFIG_PPM_ENCODER) += pnmenc.o pnm.o
OBJS-$(CONFIG_PRORES_GPL_DECODER) += proresdec_gpl.o OBJS-$(CONFIG_PRORES_DECODER) += proresdec.o
OBJS-$(CONFIG_PRORES_LGPL_DECODER) += proresdec_lgpl.o proresdsp.o OBJS-$(CONFIG_PRORES_LGPL_DECODER) += proresdec_lgpl.o proresdsp.o
OBJS-$(CONFIG_PTX_DECODER) += ptx.o OBJS-$(CONFIG_PTX_DECODER) += ptx.o
OBJS-$(CONFIG_QCELP_DECODER) += qcelpdec.o celp_math.o \ OBJS-$(CONFIG_QCELP_DECODER) += qcelpdec.o celp_math.o \

View File

@ -172,7 +172,7 @@ void avcodec_register_all(void)
REGISTER_DECODER (PICTOR, pictor); REGISTER_DECODER (PICTOR, pictor);
REGISTER_ENCDEC (PNG, png); REGISTER_ENCDEC (PNG, png);
REGISTER_ENCDEC (PPM, ppm); REGISTER_ENCDEC (PPM, ppm);
REGISTER_DECODER (PRORES_GPL, prores_gpl); REGISTER_DECODER (PRORES, prores);
REGISTER_DECODER (PRORES_LGPL, prores_lgpl); REGISTER_DECODER (PRORES_LGPL, prores_lgpl);
REGISTER_DECODER (PTX, ptx); REGISTER_DECODER (PTX, ptx);
REGISTER_DECODER (QDRAW, qdraw); REGISTER_DECODER (QDRAW, qdraw);

View File

@ -5,16 +5,16 @@
* This file is part of FFmpeg. * This file is part of FFmpeg.
* *
* FFmpeg is free software; you can redistribute it and/or * FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public * modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; * License as published by the Free Software Foundation; either
* version 2 of the License. * version 2.1 of the License, or (at your option) any later version.
* *
* FFmpeg is distributed in the hope that it will be useful, * FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details. * Lesser General Public License for more details.
* *
* You should have received a copy of the GNU General Public * You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software * License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
@ -30,33 +30,8 @@
#include "avcodec.h" #include "avcodec.h"
#include "get_bits.h" #include "get_bits.h"
#include "dsputil.h"
#include "simple_idct.h" #include "simple_idct.h"
#include "proresdec.h"
typedef struct {
const uint8_t *data;
unsigned mb_x;
unsigned mb_y;
unsigned mb_count;
unsigned data_size;
} SliceContext;
typedef struct {
AVFrame frame;
DSPContext dsp;
int frame_type; ///< 0 = progressive, 1 = tff, 2 = bff
uint8_t qmat_luma[64];
uint8_t qmat_chroma[64];
SliceContext *slices;
int slice_count; ///< number of slices in the current picture
unsigned mb_width; ///< width of the current picture in mb
unsigned mb_height; ///< height of the current picture in mb
uint8_t progressive_scan[64];
uint8_t interlaced_scan[64];
const uint8_t *scan;
int first_field;
void (*idct_put)(DCTELEM *, uint8_t *restrict, int);
} ProresContext;
static void permute(uint8_t *dst, const uint8_t *src, const uint8_t permutation[64]) static void permute(uint8_t *dst, const uint8_t *src, const uint8_t permutation[64])
{ {
@ -65,27 +40,6 @@ static void permute(uint8_t *dst, const uint8_t *src, const uint8_t permutation[
dst[i] = permutation[src[i]]; dst[i] = permutation[src[i]];
} }
static av_always_inline void put_pixels(const DCTELEM *block, uint8_t *restrict pixels, int stride)
{
int16_t *p = (int16_t*)pixels;
int i, j;
stride >>= 1;
for(i = 0; i < 8; i++) {
for (j = 0; j < 8; j++) {
p[j] = av_clip(block[j], 4, 1019);
}
p += stride;
block += 8;
}
}
static void idct_put(DCTELEM *block, uint8_t *restrict pixels, int stride)
{
ff_simple_idct_10(block);
put_pixels(block, pixels, stride);
}
static const uint8_t progressive_scan[64] = { static const uint8_t progressive_scan[64] = {
0, 1, 8, 9, 2, 3, 10, 11, 0, 1, 8, 9, 2, 3, 10, 11,
16, 17, 24, 25, 18, 19, 26, 27, 16, 17, 24, 25, 18, 19, 26, 27,
@ -111,18 +65,22 @@ static const uint8_t interlaced_scan[64] = {
static av_cold int decode_init(AVCodecContext *avctx) static av_cold int decode_init(AVCodecContext *avctx)
{ {
ProresContext *ctx = avctx->priv_data; ProresContext *ctx = avctx->priv_data;
uint8_t idct_permutation[64];
avctx->bits_per_raw_sample = 10; avctx->bits_per_raw_sample = 10;
dsputil_init(&ctx->dsp, avctx); dsputil_init(&ctx->dsp, avctx);
ff_proresdsp_init(&ctx->prodsp);
avctx->coded_frame = &ctx->frame; avctx->coded_frame = &ctx->frame;
ctx->frame.type = FF_I_TYPE; ctx->frame.type = FF_I_TYPE;
ctx->frame.key_frame = 1; ctx->frame.key_frame = 1;
ctx->idct_put = idct_put; ff_init_scantable_permutation(idct_permutation,
memcpy(ctx->progressive_scan, progressive_scan, sizeof(progressive_scan)); ctx->prodsp.idct_permutation_type);
memcpy(ctx->interlaced_scan, interlaced_scan, sizeof(interlaced_scan));
permute(ctx->progressive_scan, progressive_scan, idct_permutation);
permute(ctx->interlaced_scan, interlaced_scan, idct_permutation);
return 0; return 0;
} }
@ -133,7 +91,6 @@ static int decode_frame_header(ProresContext *ctx, const uint8_t *buf,
int hdr_size, width, height, flags; int hdr_size, width, height, flags;
int version; int version;
const uint8_t *ptr; const uint8_t *ptr;
const uint8_t *scan;
hdr_size = AV_RB16(buf); hdr_size = AV_RB16(buf);
av_dlog(avctx, "header size %d\n", hdr_size); av_dlog(avctx, "header size %d\n", hdr_size);
@ -162,10 +119,8 @@ static int decode_frame_header(ProresContext *ctx, const uint8_t *buf,
av_dlog(avctx, "frame type %d\n", ctx->frame_type); av_dlog(avctx, "frame type %d\n", ctx->frame_type);
if (ctx->frame_type == 0) { if (ctx->frame_type == 0) {
scan = progressive_scan;
ctx->scan = ctx->progressive_scan; // permuted ctx->scan = ctx->progressive_scan; // permuted
} else { } else {
scan = interlaced_scan;
ctx->scan = ctx->interlaced_scan; // permuted ctx->scan = ctx->interlaced_scan; // permuted
ctx->frame.interlaced_frame = 1; ctx->frame.interlaced_frame = 1;
ctx->frame.top_field_first = ctx->frame_type == 1; ctx->frame.top_field_first = ctx->frame_type == 1;
@ -178,14 +133,14 @@ static int decode_frame_header(ProresContext *ctx, const uint8_t *buf,
av_dlog(avctx, "flags %x\n", flags); av_dlog(avctx, "flags %x\n", flags);
if (flags & 2) { if (flags & 2) {
permute(ctx->qmat_luma, scan, ptr); permute(ctx->qmat_luma, ctx->prodsp.idct_permutation, ptr);
ptr += 64; ptr += 64;
} else { } else {
memset(ctx->qmat_luma, 4, 64); memset(ctx->qmat_luma, 4, 64);
} }
if (flags & 1) { if (flags & 1) {
permute(ctx->qmat_chroma, scan, ptr); permute(ctx->qmat_chroma, ctx->prodsp.idct_permutation, ptr);
} else { } else {
memset(ctx->qmat_chroma, 4, 64); memset(ctx->qmat_chroma, 4, 64);
} }
@ -331,7 +286,7 @@ static int decode_picture_header(AVCodecContext *avctx, const uint8_t *buf, cons
static const uint8_t dc_codebook[7] = { 0x04, 0x28, 0x28, 0x4D, 0x4D, 0x70, 0x70}; static const uint8_t dc_codebook[7] = { 0x04, 0x28, 0x28, 0x4D, 0x4D, 0x70, 0x70};
static av_always_inline void decode_dc_coeffs(GetBitContext *gb, DCTELEM *out, static av_always_inline void decode_dc_coeffs(GetBitContext *gb, DCTELEM *out,
int blocks_per_slice, const int *qmat) int blocks_per_slice)
{ {
DCTELEM prev_dc; DCTELEM prev_dc;
int code, i, sign; int code, i, sign;
@ -340,7 +295,7 @@ static av_always_inline void decode_dc_coeffs(GetBitContext *gb, DCTELEM *out,
DECODE_CODEWORD(code, FIRST_DC_CB); DECODE_CODEWORD(code, FIRST_DC_CB);
prev_dc = TOSIGNED(code); prev_dc = TOSIGNED(code);
out[0] = 4096 + ((prev_dc * qmat[0]) >> 2); out[0] = prev_dc;
out += 64; // dc coeff for the next block out += 64; // dc coeff for the next block
@ -351,7 +306,7 @@ static av_always_inline void decode_dc_coeffs(GetBitContext *gb, DCTELEM *out,
if(code) sign ^= -(code & 1); if(code) sign ^= -(code & 1);
else sign = 0; else sign = 0;
prev_dc += (((code + 1) >> 1) ^ sign) - sign; prev_dc += (((code + 1) >> 1) ^ sign) - sign;
out[0] = 4096 + ((prev_dc * qmat[0]) >> 2); out[0] = prev_dc;
} }
CLOSE_READER(re, gb); CLOSE_READER(re, gb);
} }
@ -361,8 +316,7 @@ static const uint8_t run_to_cb[16] = { 0x06, 0x06, 0x05, 0x05, 0x04, 0x29, 0x29,
static const uint8_t lev_to_cb[10] = { 0x04, 0x0A, 0x05, 0x06, 0x04, 0x28, 0x28, 0x28, 0x28, 0x4C }; static const uint8_t lev_to_cb[10] = { 0x04, 0x0A, 0x05, 0x06, 0x04, 0x28, 0x28, 0x28, 0x28, 0x4C };
static av_always_inline void decode_ac_coeffs(AVCodecContext *avctx, GetBitContext *gb, static av_always_inline void decode_ac_coeffs(AVCodecContext *avctx, GetBitContext *gb,
DCTELEM *out, int blocks_per_slice, DCTELEM *out, int blocks_per_slice)
const int *qmat)
{ {
ProresContext *ctx = avctx->priv_data; ProresContext *ctx = avctx->priv_data;
int block_mask, sign; int block_mask, sign;
@ -397,7 +351,7 @@ static av_always_inline void decode_ac_coeffs(AVCodecContext *avctx, GetBitConte
sign = SHOW_SBITS(re, gb, 1); sign = SHOW_SBITS(re, gb, 1);
SKIP_BITS(re, gb, 1); SKIP_BITS(re, gb, 1);
out[((pos & block_mask) << 6) + ctx->scan[i]] = (((level ^ sign) - sign) * qmat[i]) >> 2; out[((pos & block_mask) << 6) + ctx->scan[i]] = ((level ^ sign) - sign);
} }
CLOSE_READER(re, gb); CLOSE_READER(re, gb);
@ -406,7 +360,7 @@ static av_always_inline void decode_ac_coeffs(AVCodecContext *avctx, GetBitConte
static void decode_slice_luma(AVCodecContext *avctx, SliceContext *slice, static void decode_slice_luma(AVCodecContext *avctx, SliceContext *slice,
uint8_t *dst, int dst_stride, uint8_t *dst, int dst_stride,
const uint8_t *buf, unsigned buf_size, const uint8_t *buf, unsigned buf_size,
const int *qmat) const int16_t *qmat)
{ {
ProresContext *ctx = avctx->priv_data; ProresContext *ctx = avctx->priv_data;
LOCAL_ALIGNED_16(DCTELEM, blocks, [8*4*64]); LOCAL_ALIGNED_16(DCTELEM, blocks, [8*4*64]);
@ -419,26 +373,24 @@ static void decode_slice_luma(AVCodecContext *avctx, SliceContext *slice,
init_get_bits(&gb, buf, buf_size << 3); init_get_bits(&gb, buf, buf_size << 3);
decode_dc_coeffs(&gb, blocks, blocks_per_slice, qmat); decode_dc_coeffs(&gb, blocks, blocks_per_slice);
decode_ac_coeffs(avctx, &gb, blocks, blocks_per_slice, qmat); decode_ac_coeffs(avctx, &gb, blocks, blocks_per_slice);
block = blocks; block = blocks;
for (i = 0; i < slice->mb_count; i++) { for (i = 0; i < slice->mb_count; i++) {
ctx->idct_put(block+(0<<6), dst, dst_stride); ctx->prodsp.idct_put(dst, dst_stride, block+(0<<6), qmat);
ctx->idct_put(block+(1<<6), dst+16, dst_stride); ctx->prodsp.idct_put(dst+16, dst_stride, block+(1<<6), qmat);
ctx->idct_put(block+(2<<6), dst+8*dst_stride, dst_stride); ctx->prodsp.idct_put(dst+8*dst_stride, dst_stride, block+(2<<6), qmat);
ctx->idct_put(block+(3<<6), dst+8*dst_stride+16, dst_stride); ctx->prodsp.idct_put(dst+8*dst_stride+16, dst_stride, block+(3<<6), qmat);
block += 4*64; block += 4*64;
dst += 32; dst += 32;
} }
} }
static void decode_slice_chroma(AVCodecContext *avctx, SliceContext *slice, static void decode_slice_chroma(AVCodecContext *avctx, SliceContext *slice,
uint8_t *dst, int dst_stride, uint8_t *dst, int dst_stride,
const uint8_t *buf, unsigned buf_size, const uint8_t *buf, unsigned buf_size,
const int *qmat, int log2_blocks_per_mb) const int16_t *qmat, int log2_blocks_per_mb)
{ {
ProresContext *ctx = avctx->priv_data; ProresContext *ctx = avctx->priv_data;
LOCAL_ALIGNED_16(DCTELEM, blocks, [8*4*64]); LOCAL_ALIGNED_16(DCTELEM, blocks, [8*4*64]);
@ -451,14 +403,14 @@ static void decode_slice_chroma(AVCodecContext *avctx, SliceContext *slice,
init_get_bits(&gb, buf, buf_size << 3); init_get_bits(&gb, buf, buf_size << 3);
decode_dc_coeffs(&gb, blocks, blocks_per_slice, qmat); decode_dc_coeffs(&gb, blocks, blocks_per_slice);
decode_ac_coeffs(avctx, &gb, blocks, blocks_per_slice, qmat); decode_ac_coeffs(avctx, &gb, blocks, blocks_per_slice);
block = blocks; block = blocks;
for (i = 0; i < slice->mb_count; i++) { for (i = 0; i < slice->mb_count; i++) {
for (j = 0; j < log2_blocks_per_mb; j++) { for (j = 0; j < log2_blocks_per_mb; j++) {
ctx->idct_put(block+(0<<6), dst, dst_stride); ctx->prodsp.idct_put(dst, dst_stride, block+(0<<6), qmat);
ctx->idct_put(block+(1<<6), dst+8*dst_stride, dst_stride); ctx->prodsp.idct_put(dst+8*dst_stride, dst_stride, block+(1<<6), qmat);
block += 2*64; block += 2*64;
dst += 16; dst += 16;
} }
@ -475,8 +427,8 @@ static int decode_slice_thread(AVCodecContext *avctx, void *arg, int jobnr, int
int luma_stride, chroma_stride; int luma_stride, chroma_stride;
int y_data_size, u_data_size, v_data_size; int y_data_size, u_data_size, v_data_size;
uint8_t *dest_y, *dest_u, *dest_v; uint8_t *dest_y, *dest_u, *dest_v;
int qmat_luma_scaled[64]; int16_t qmat_luma_scaled[64];
int qmat_chroma_scaled[64]; int16_t qmat_chroma_scaled[64];
int mb_x_shift; int mb_x_shift;
//av_log(avctx, AV_LOG_INFO, "slice %d mb width %d mb x %d y %d\n", //av_log(avctx, AV_LOG_INFO, "slice %d mb width %d mb x %d y %d\n",
@ -499,7 +451,7 @@ static int decode_slice_thread(AVCodecContext *avctx, void *arg, int jobnr, int
buf += hdr_size; buf += hdr_size;
for (i = 0; i < 64; i++) { for (i = 0; i < 64; i++) {
qmat_luma_scaled[i] = ctx->qmat_luma[i] * qscale; qmat_luma_scaled [i] = ctx->qmat_luma [i] * qscale;
qmat_chroma_scaled[i] = ctx->qmat_chroma[i] * qscale; qmat_chroma_scaled[i] = ctx->qmat_chroma[i] * qscale;
} }
@ -628,8 +580,8 @@ static av_cold int decode_close(AVCodecContext *avctx)
return 0; return 0;
} }
AVCodec ff_prores_gpl_decoder = { AVCodec ff_prores_decoder = {
.name = "prores_gpl", .name = "prores",
.type = AVMEDIA_TYPE_VIDEO, .type = AVMEDIA_TYPE_VIDEO,
.id = CODEC_ID_PRORES, .id = CODEC_ID_PRORES,
.priv_data_size = sizeof(ProresContext), .priv_data_size = sizeof(ProresContext),

53
libavcodec/proresdec.h Normal file
View File

@ -0,0 +1,53 @@
/*
* Copyright (c) 2010-2011 Maxim Poliakovski
* Copyright (c) 2010-2011 Elvis Presley
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation;
* version 2 of the License.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef AVCODEC_PRORESDEC_H
#define AVCODEC_PRORESDEC_H
#include "dsputil.h"
#include "proresdsp.h"
typedef struct {
const uint8_t *data;
unsigned mb_x;
unsigned mb_y;
unsigned mb_count;
unsigned data_size;
} SliceContext;
typedef struct {
DSPContext dsp;
ProresDSPContext prodsp;
AVFrame frame;
int frame_type; ///< 0 = progressive, 1 = tff, 2 = bff
uint8_t qmat_luma[64];
uint8_t qmat_chroma[64];
SliceContext *slices;
int slice_count; ///< number of slices in the current picture
unsigned mb_width; ///< width of the current picture in mb
unsigned mb_height; ///< height of the current picture in mb
uint8_t progressive_scan[64];
uint8_t interlaced_scan[64];
const uint8_t *scan;
int first_field;
} ProresContext;
#endif /* AVCODEC_PRORESDEC_H */

View File

@ -36,6 +36,8 @@ MMX-OBJS-$(CONFIG_GPL) += x86/idct_mmx.o
MMX-OBJS-$(CONFIG_LPC) += x86/lpc_mmx.o MMX-OBJS-$(CONFIG_LPC) += x86/lpc_mmx.o
YASM-OBJS-$(CONFIG_PRORES_LGPL_DECODER) += x86/proresdsp.o YASM-OBJS-$(CONFIG_PRORES_LGPL_DECODER) += x86/proresdsp.o
MMX-OBJS-$(CONFIG_PRORES_LGPL_DECODER) += x86/proresdsp-init.o MMX-OBJS-$(CONFIG_PRORES_LGPL_DECODER) += x86/proresdsp-init.o
YASM-OBJS-$(CONFIG_PRORES_DECODER) += x86/proresdsp.o
MMX-OBJS-$(CONFIG_PRORES_DECODER) += x86/proresdsp-init.o
MMX-OBJS-$(CONFIG_DWT) += x86/snowdsp_mmx.o MMX-OBJS-$(CONFIG_DWT) += x86/snowdsp_mmx.o
MMX-OBJS-$(CONFIG_VC1_DECODER) += x86/vc1dsp_mmx.o MMX-OBJS-$(CONFIG_VC1_DECODER) += x86/vc1dsp_mmx.o
YASM-OBJS-$(CONFIG_VP3_DECODER) += x86/vp3dsp.o YASM-OBJS-$(CONFIG_VP3_DECODER) += x86/vp3dsp.o