1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-01-08 13:22:53 +02:00

Merge commit '07761294fc3f08e139e8a406ef7d5b63aaf1ecee'

* commit '07761294fc3f08e139e8a406ef7d5b63aaf1ecee':
  Silicon Graphics RLE 8-bit video decoder

Conflicts:
	Changelog
	doc/general.texi
	libavcodec/avcodec.h
	libavcodec/sgirledec.c
	libavcodec/version.h

See: afa1617b93
Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Michael Niedermayer 2014-04-19 19:12:57 +02:00
commit e37dbfddda
7 changed files with 49 additions and 38 deletions

View File

@ -236,7 +236,7 @@ version 1.1:
- JSON captions for TED talks decoding support - JSON captions for TED talks decoding support
- SOX Resampler support in libswresample - SOX Resampler support in libswresample
- aselect filter - aselect filter
- SGI RLE 8-bit decoder - SGI RLE 8-bit / Silicon Graphics RLE 8-bit video decoder
- Silicon Graphics Motion Video Compressor 1 & 2 decoder - Silicon Graphics Motion Video Compressor 1 & 2 decoder
- Silicon Graphics Movie demuxer - Silicon Graphics Movie demuxer
- apad filter - apad filter

View File

@ -752,11 +752,11 @@ following image formats are supported:
@tab Texture dictionaries used by the Renderware Engine. @tab Texture dictionaries used by the Renderware Engine.
@item RL2 video @tab @tab X @item RL2 video @tab @tab X
@tab used in some games by Entertainment Software Partners @tab used in some games by Entertainment Software Partners
@item SGI RLE 8-bit @tab @tab X
@item Sierra VMD video @tab @tab X @item Sierra VMD video @tab @tab X
@tab Used in Sierra VMD files. @tab Used in Sierra VMD files.
@item Silicon Graphics Motion Video Compressor 1 (MVC1) @tab @tab X @item Silicon Graphics Motion Video Compressor 1 (MVC1) @tab @tab X
@item Silicon Graphics Motion Video Compressor 2 (MVC2) @tab @tab X @item Silicon Graphics Motion Video Compressor 2 (MVC2) @tab @tab X
@item Silicon Graphics RLE 8-bit video @tab @tab X
@item Smacker video @tab @tab X @item Smacker video @tab @tab X
@tab Video encoding used in Smacker. @tab Video encoding used in Smacker.
@item SMPTE VC-1 @tab @tab X @item SMPTE VC-1 @tab @tab X

View File

@ -292,6 +292,7 @@ enum AVCodecID {
AV_CODEC_ID_EXR_DEPRECATED, AV_CODEC_ID_EXR_DEPRECATED,
AV_CODEC_ID_VP7_DEPRECATED, AV_CODEC_ID_VP7_DEPRECATED,
AV_CODEC_ID_SANM_DEPRECATED, AV_CODEC_ID_SANM_DEPRECATED,
AV_CODEC_ID_SGIRLE_DEPRECATED,
AV_CODEC_ID_BRENDER_PIX= MKBETAG('B','P','I','X'), AV_CODEC_ID_BRENDER_PIX= MKBETAG('B','P','I','X'),
AV_CODEC_ID_Y41P = MKBETAG('Y','4','1','P'), AV_CODEC_ID_Y41P = MKBETAG('Y','4','1','P'),

View File

@ -661,13 +661,6 @@ static const AVCodecDescriptor codec_descriptors[] = {
.long_name = NULL_IF_CONFIG_SMALL("Nintendo Gamecube THP video"), .long_name = NULL_IF_CONFIG_SMALL("Nintendo Gamecube THP video"),
.props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY, .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
}, },
{
.id = AV_CODEC_ID_SGIRLE,
.type = AVMEDIA_TYPE_VIDEO,
.name = "sgirle",
.long_name = NULL_IF_CONFIG_SMALL("SGI RLE 8-bit"),
.props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
},
{ {
.id = AV_CODEC_ID_C93, .id = AV_CODEC_ID_C93,
.type = AVMEDIA_TYPE_VIDEO, .type = AVMEDIA_TYPE_VIDEO,
@ -1233,6 +1226,13 @@ static const AVCodecDescriptor codec_descriptors[] = {
.long_name = NULL_IF_CONFIG_SMALL("LucasArts SANM/SMUSH video"), .long_name = NULL_IF_CONFIG_SMALL("LucasArts SANM/SMUSH video"),
.props = AV_CODEC_PROP_LOSSY, .props = AV_CODEC_PROP_LOSSY,
}, },
{
.id = AV_CODEC_ID_SGIRLE,
.type = AVMEDIA_TYPE_VIDEO,
.name = "sgirle",
.long_name = NULL_IF_CONFIG_SMALL("SGI RLE 8-bit"),
.props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
},
/* image codecs */ /* image codecs */
{ {

View File

@ -1,5 +1,5 @@
/* /*
* SGI RLE 8-bit decoder * Silicon Graphics RLE 8-bit video decoder
* Copyright (c) 2012 Peter Ross * Copyright (c) 2012 Peter Ross
* *
* This file is part of FFmpeg. * This file is part of FFmpeg.
@ -21,9 +21,13 @@
/** /**
* @file * @file
* SGI RLE 8-bit decoder * Silicon Graphics RLE 8-bit video decoder
* @note Data is packed in rbg323 with rle, contained in mv or mov.
* The algorithm and pixfmt are subtly different from SGI images.
*/ */
#include "libavutil/common.h"
#include "avcodec.h" #include "avcodec.h"
#include "internal.h" #include "internal.h"
@ -42,39 +46,44 @@ static av_cold int sgirle_decode_init(AVCodecContext *avctx)
} }
/** /**
* Convert SGI RGB332 pixel into AV_PIX_FMT_BGR8 * Convert SGI RBG323 pixel into AV_PIX_FMT_BGR8
* SGI RGB332 is packed RGB 3:3:2, 8bpp, (msb)3R 2B 3G(lsb) * SGI RGB data is packed as 8bpp, (msb)3R 2B 3G(lsb)
*/ */
#define RGB332_TO_BGR8(x) (((x << 3) & 0xC0) | ((x << 3) & 0x38) | ((x >> 5) & 7)) #define RBG323_TO_BGR8(x) (((x << 3) & 0xC0) | \
((x << 3) & 0x38) | \
static av_always_inline void memcpy_rgb332_to_bgr8(uint8_t *dst, const uint8_t *src, int size) ((x >> 5) & 7))
static av_always_inline
void rbg323_to_bgr8(uint8_t *dst, const uint8_t *src, int size)
{ {
int i; int i;
for (i = 0; i < size; i++) for (i = 0; i < size; i++)
dst[i] = RGB332_TO_BGR8(src[i]); dst[i] = RBG323_TO_BGR8(src[i]);
} }
/** /**
* @param[out] dst Destination buffer * @param[out] dst Destination buffer
* @param[in] src Source buffer * @param[in] src Source buffer
* @param src_size Source buffer size (bytes) * @param src_size Source buffer size (bytes)
* @param width Width of destination buffer (pixels) * @param width Width of destination buffer (pixels)
* @param height Height of destination buffer (pixels) * @param height Height of destination buffer (pixels)
* @param linesize Line size of destination buffer (bytes) * @param linesize Line size of destination buffer (bytes)
*
* @return <0 on error * @return <0 on error
*/ */
static int decode_sgirle8(AVCodecContext *avctx, uint8_t *dst, const uint8_t *src, int src_size, int width, int height, int linesize) static int decode_sgirle8(AVCodecContext *avctx, uint8_t *dst,
const uint8_t *src, int src_size,
int width, int height, ptrdiff_t linesize)
{ {
const uint8_t *src_end = src + src_size; const uint8_t *src_end = src + src_size;
int x = 0, y = 0; int x = 0, y = 0;
#define INC_XY(n) \ #define INC_XY(n) \
x += n; \ x += n; \
if (x >= width) { \ if (x >= width) { \
y++; \ y++; \
if (y >= height) \ if (y >= height) \
return 0; \ return 0; \
x = 0; \ x = 0; \
} }
while (src_end - src >= 2) { while (src_end - src >= 2) {
@ -84,9 +93,9 @@ static int decode_sgirle8(AVCodecContext *avctx, uint8_t *dst, const uint8_t *sr
int length = FFMIN(v, width - x); int length = FFMIN(v, width - x);
if (length <= 0) if (length <= 0)
break; break;
memset(dst + y*linesize + x, RGB332_TO_BGR8(*src), length); memset(dst + y * linesize + x, RBG323_TO_BGR8(*src), length);
INC_XY(length); INC_XY(length);
v -= length; v -= length;
} while (v > 0); } while (v > 0);
src++; src++;
} else if (v >= 0xC1) { } else if (v >= 0xC1) {
@ -95,7 +104,7 @@ static int decode_sgirle8(AVCodecContext *avctx, uint8_t *dst, const uint8_t *sr
int length = FFMIN3(v, width - x, src_end - src); int length = FFMIN3(v, width - x, src_end - src);
if (src_end - src < length || length <= 0) if (src_end - src < length || length <= 0)
break; break;
memcpy_rgb332_to_bgr8(dst + y*linesize + x, src, length); rbg323_to_bgr8(dst + y * linesize + x, src, length);
INC_XY(length); INC_XY(length);
src += length; src += length;
v -= length; v -= length;
@ -108,9 +117,8 @@ static int decode_sgirle8(AVCodecContext *avctx, uint8_t *dst, const uint8_t *sr
return 0; return 0;
} }
static int sgirle_decode_frame(AVCodecContext *avctx, static int sgirle_decode_frame(AVCodecContext *avctx, void *data,
void *data, int *got_frame, int *got_frame, AVPacket *avpkt)
AVPacket *avpkt)
{ {
SGIRLEContext *s = avctx->priv_data; SGIRLEContext *s = avctx->priv_data;
int ret; int ret;
@ -118,11 +126,12 @@ static int sgirle_decode_frame(AVCodecContext *avctx,
if ((ret = ff_reget_buffer(avctx, s->frame)) < 0) if ((ret = ff_reget_buffer(avctx, s->frame)) < 0)
return ret; return ret;
ret = decode_sgirle8(avctx, s->frame->data[0], avpkt->data, avpkt->size, avctx->width, avctx->height, s->frame->linesize[0]); ret = decode_sgirle8(avctx, s->frame->data[0], avpkt->data, avpkt->size,
avctx->width, avctx->height, s->frame->linesize[0]);
if (ret < 0) if (ret < 0)
return ret; return ret;
*got_frame = 1; *got_frame = 1;
if ((ret = av_frame_ref(data, s->frame)) < 0) if ((ret = av_frame_ref(data, s->frame)) < 0)
return ret; return ret;
@ -140,7 +149,7 @@ static av_cold int sgirle_decode_end(AVCodecContext *avctx)
AVCodec ff_sgirle_decoder = { AVCodec ff_sgirle_decoder = {
.name = "sgirle", .name = "sgirle",
.long_name = NULL_IF_CONFIG_SMALL("SGI RLE 8-bit"), .long_name = NULL_IF_CONFIG_SMALL("Silicon Graphics RLE 8-bit video"),
.type = AVMEDIA_TYPE_VIDEO, .type = AVMEDIA_TYPE_VIDEO,
.id = AV_CODEC_ID_SGIRLE, .id = AV_CODEC_ID_SGIRLE,
.priv_data_size = sizeof(SGIRLEContext), .priv_data_size = sizeof(SGIRLEContext),

View File

@ -2690,6 +2690,7 @@ static enum AVCodecID remap_deprecated_codec_id(enum AVCodecID id)
case AV_CODEC_ID_WEBP_DEPRECATED : return AV_CODEC_ID_WEBP; case AV_CODEC_ID_WEBP_DEPRECATED : return AV_CODEC_ID_WEBP;
case AV_CODEC_ID_HEVC_DEPRECATED : return AV_CODEC_ID_HEVC; case AV_CODEC_ID_HEVC_DEPRECATED : return AV_CODEC_ID_HEVC;
case AV_CODEC_ID_SANM_DEPRECATED : return AV_CODEC_ID_SANM; case AV_CODEC_ID_SANM_DEPRECATED : return AV_CODEC_ID_SANM;
case AV_CODEC_ID_SGIRLE_DEPRECATED : return AV_CODEC_ID_SGIRLE;
case AV_CODEC_ID_VP7_DEPRECATED : return AV_CODEC_ID_VP7; case AV_CODEC_ID_VP7_DEPRECATED : return AV_CODEC_ID_VP7;
default : return id; default : return id;
} }

View File

@ -30,7 +30,7 @@
#define LIBAVCODEC_VERSION_MAJOR 55 #define LIBAVCODEC_VERSION_MAJOR 55
#define LIBAVCODEC_VERSION_MINOR 58 #define LIBAVCODEC_VERSION_MINOR 58
#define LIBAVCODEC_VERSION_MICRO 103 #define LIBAVCODEC_VERSION_MICRO 104
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
LIBAVCODEC_VERSION_MINOR, \ LIBAVCODEC_VERSION_MINOR, \