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:
commit
e37dbfddda
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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'),
|
||||||
|
@ -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 */
|
||||||
{
|
{
|
||||||
|
@ -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),
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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, \
|
||||||
|
Loading…
Reference in New Issue
Block a user