Mercurial > mplayer.hg
changeset 12429:98d67f488df2
Qt RLE is now in ffmpeg
author | rtognimp |
---|---|
date | Wed, 05 May 2004 19:11:16 +0000 |
parents | bfa269cec22b |
children | d82d84b94125 |
files | libmpcodecs/Makefile libmpcodecs/native/qtrle.c |
diffstat | 2 files changed, 1 insertions(+), 401 deletions(-) [+] |
line wrap: on
line diff
--- a/libmpcodecs/Makefile Wed May 05 17:26:24 2004 +0000 +++ b/libmpcodecs/Makefile Wed May 05 19:11:16 2004 +0000 @@ -21,7 +21,7 @@ ENCODER_SRCS=ve.c ve_divx4.c ve_lavc.c ve_vfw.c ve_raw.c ve_libdv.c ve_xvid.c ve_xvid4.c ve_qtvideo.c ve_nuv.c -NATIVE_SRCS=native/RTjpegN.c native/cinepak.c native/minilzo.c native/nuppelvideo.c native/qtrle.c native/roqav.c native/xa_gsm.c native/decode144.c native/decode288.c +NATIVE_SRCS=native/RTjpegN.c native/cinepak.c native/minilzo.c native/nuppelvideo.c native/roqav.c native/xa_gsm.c native/decode144.c native/decode288.c ifeq ($(FAME),yes) VFILTER_SRCS += vf_fame.c
--- a/libmpcodecs/native/qtrle.c Wed May 05 17:26:24 2004 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,400 +0,0 @@ -/* - Quicktime Animation (RLE) Decoder for MPlayer - - (C) 2001 Mike Melanson - 8 and 16bpp support by Alex Beregszaszi - 32 bpp support by Roberto Togni -*/ - -#include "config.h" -#include "bswap.h" - -#define BE_16(x) (be2me_16(*(unsigned short *)(x))) -#define BE_32(x) (be2me_32(*(unsigned int *)(x))) - -void qt_decode_rle8( - unsigned char *encoded, - int encoded_size, - unsigned char *decoded, - int width, - int height, - int bytes_per_pixel) -{ - int stream_ptr; - int header; - int start_line; - int lines_to_change; - signed char rle_code; - int row_ptr, pixel_ptr; - int row_inc = bytes_per_pixel * width; - unsigned char pixel; - - // check if this frame is even supposed to change - if (encoded_size < 8) - return; - - // start after the chunk size - stream_ptr = 4; - - // fetch the header - header = BE_16(&encoded[stream_ptr]); - stream_ptr += 2; - - // if a header is present, fetch additional decoding parameters - if (header & 0x0008) - { - start_line = BE_16(&encoded[stream_ptr]); - stream_ptr += 4; - lines_to_change = BE_16(&encoded[stream_ptr]); - stream_ptr += 4; - } - else - { - start_line = 0; - lines_to_change = height; - } - - row_ptr = row_inc * start_line; - while (lines_to_change--) - { - pixel_ptr = row_ptr + ((encoded[stream_ptr++] - 1) * bytes_per_pixel); - - while (stream_ptr < encoded_size && - (rle_code = (signed char)encoded[stream_ptr++]) != -1) - { - if (rle_code == 0) - // there's another skip code in the stream - pixel_ptr += ((encoded[stream_ptr++] - 1) * bytes_per_pixel); - else if (rle_code < 0) - { - // decode the run length code - rle_code = -rle_code; - pixel = encoded[stream_ptr++]; - while (rle_code--) - { - decoded[pixel_ptr++] = pixel; - } - } - else - { - // copy pixels directly to output - while (rle_code--) - { - decoded[pixel_ptr++] = encoded[stream_ptr + 0]; - stream_ptr += 1; - } - } - } - - row_ptr += row_inc; - } -} - -void qt_decode_rle16( - unsigned char *encoded, - int encoded_size, - unsigned char *decoded, - int width, - int height, - int bytes_per_pixel) -{ - int stream_ptr; - int header; - int start_line; - int lines_to_change; - signed char rle_code; - int row_ptr, pixel_ptr; - int row_inc = bytes_per_pixel * width; - unsigned char p1, p2; - - // check if this frame is even supposed to change - if (encoded_size < 8) - return; - - // start after the chunk size - stream_ptr = 4; - - // fetch the header - header = BE_16(&encoded[stream_ptr]); - stream_ptr += 2; - - // if a header is present, fetch additional decoding parameters - if (header & 0x0008) - { - start_line = BE_16(&encoded[stream_ptr]); - stream_ptr += 4; - lines_to_change = BE_16(&encoded[stream_ptr]); - stream_ptr += 4; - } - else - { - start_line = 0; - lines_to_change = height; - } - - row_ptr = row_inc * start_line; - while (lines_to_change--) - { - pixel_ptr = row_ptr + ((encoded[stream_ptr++] - 1) * bytes_per_pixel); - - while (stream_ptr < encoded_size && - (rle_code = (signed char)encoded[stream_ptr++]) != -1) - { - if (rle_code == 0) - // there's another skip code in the stream - pixel_ptr += ((encoded[stream_ptr++] - 1) * bytes_per_pixel); - else if (rle_code < 0) - { - // decode the run length code - rle_code = -rle_code; - p1 = encoded[stream_ptr++]; - p2 = encoded[stream_ptr++]; - while (rle_code--) - { - decoded[pixel_ptr++] = p2; - decoded[pixel_ptr++] = p1; - } - } - else - { - // copy pixels directly to output - while (rle_code--) - { - decoded[pixel_ptr++] = encoded[stream_ptr + 1]; - decoded[pixel_ptr++] = encoded[stream_ptr + 0]; - stream_ptr += 2; - } - } - } - - row_ptr += row_inc; - } -} - -void qt_decode_rle24( - unsigned char *encoded, - int encoded_size, - unsigned char *decoded, - int width, - int height, - int bytes_per_pixel) -{ - int stream_ptr; - int header; - int start_line; - int lines_to_change; - signed char rle_code; - int row_ptr, pixel_ptr; - int row_inc = bytes_per_pixel * width; - unsigned char r, g, b; - - // check if this frame is even supposed to change - if (encoded_size < 8) - return; - - // start after the chunk size - stream_ptr = 4; - - // fetch the header - header = BE_16(&encoded[stream_ptr]); - stream_ptr += 2; - - // if a header is present, fetch additional decoding parameters - if (header & 0x0008) - { - start_line = BE_16(&encoded[stream_ptr]); - stream_ptr += 4; - lines_to_change = BE_16(&encoded[stream_ptr]); - stream_ptr += 4; - } - else - { - start_line = 0; - lines_to_change = height; - } - - row_ptr = row_inc * start_line; - while (lines_to_change--) - { - pixel_ptr = row_ptr + ((encoded[stream_ptr++] - 1) * bytes_per_pixel); - - while (stream_ptr < encoded_size && - (rle_code = (signed char)encoded[stream_ptr++]) != -1) - { - if (rle_code == 0) - // there's another skip code in the stream - pixel_ptr += ((encoded[stream_ptr++] - 1) * bytes_per_pixel); - else if (rle_code < 0) - { - // decode the run length code - rle_code = -rle_code; - r = encoded[stream_ptr++]; - g = encoded[stream_ptr++]; - b = encoded[stream_ptr++]; - while (rle_code--) - { - decoded[pixel_ptr++] = b; - decoded[pixel_ptr++] = g; - decoded[pixel_ptr++] = r; - if (bytes_per_pixel == 4) - pixel_ptr++; - } - } - else - { - // copy pixels directly to output - while (rle_code--) - { - decoded[pixel_ptr++] = encoded[stream_ptr + 2]; - decoded[pixel_ptr++] = encoded[stream_ptr + 1]; - decoded[pixel_ptr++] = encoded[stream_ptr + 0]; - stream_ptr += 3; - if (bytes_per_pixel == 4) - pixel_ptr++; - } - } - } - - row_ptr += row_inc; - } -} - -void qt_decode_rle32( - unsigned char *encoded, - int encoded_size, - unsigned char *decoded, - int width, - int height, - int bytes_per_pixel) -{ - int stream_ptr; - int header; - int start_line; - int lines_to_change; - signed char rle_code; - int row_ptr, pixel_ptr; - int row_inc = bytes_per_pixel * width; - unsigned char r, g, b; - - // check if this frame is even supposed to change - if (encoded_size < 8) - return; - - // start after the chunk size - stream_ptr = 4; - - // fetch the header - header = BE_16(&encoded[stream_ptr]); - stream_ptr += 2; - - // if a header is present, fetch additional decoding parameters - if (header & 0x0008) - { - start_line = BE_16(&encoded[stream_ptr]); - stream_ptr += 4; - lines_to_change = BE_16(&encoded[stream_ptr]); - stream_ptr += 4; - } - else - { - start_line = 0; - lines_to_change = height; - } - - row_ptr = row_inc * start_line; - while (lines_to_change--) - { - pixel_ptr = row_ptr + ((encoded[stream_ptr++] - 1) * bytes_per_pixel); - - while (stream_ptr < encoded_size && - (rle_code = (signed char)encoded[stream_ptr++]) != -1) - { - if (rle_code == 0) - // there's another skip code in the stream - pixel_ptr += ((encoded[stream_ptr++] - 1) * bytes_per_pixel); - else if (rle_code < 0) - { - // decode the run length code - rle_code = -rle_code; - stream_ptr++; // Ignore alpha channel - r = encoded[stream_ptr++]; - g = encoded[stream_ptr++]; - b = encoded[stream_ptr++]; - while (rle_code--) - { - decoded[pixel_ptr++] = b; - decoded[pixel_ptr++] = g; - decoded[pixel_ptr++] = r; - if (bytes_per_pixel == 4) - pixel_ptr++; - } - } - else - { - // copy pixels directly to output - while (rle_code--) - { - stream_ptr++; // Ignore alpha channel - decoded[pixel_ptr++] = encoded[stream_ptr + 2]; - decoded[pixel_ptr++] = encoded[stream_ptr + 1]; - decoded[pixel_ptr++] = encoded[stream_ptr + 0]; - stream_ptr += 3; - if (bytes_per_pixel == 4) - pixel_ptr++; - } - } - } - - row_ptr += row_inc; - } -} - -void qt_decode_rle( - unsigned char *encoded, - int encoded_size, - unsigned char *decoded, - int width, - int height, - int encoded_bpp, - int bytes_per_pixel) -{ - switch (encoded_bpp) - { - case 8: - qt_decode_rle8( - encoded, - encoded_size, - decoded, - width, - height, - bytes_per_pixel); - break; - case 16: - qt_decode_rle16( - encoded, - encoded_size, - decoded, - width, - height, - bytes_per_pixel); - break; - case 24: - qt_decode_rle24( - encoded, - encoded_size, - decoded, - width, - height, - bytes_per_pixel); - break; - case 32: - qt_decode_rle32( - encoded, - encoded_size, - decoded, - width, - height, - bytes_per_pixel); - break; - } -}