X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fvmnc.c;h=a97655a27c39ac88e8b3f2c8490b6eae1898b394;hb=99e5a9d1ea2a61ac9429427431e5b9c2fefb76a5;hp=49210158ff2837ea5a01e2bece69ad65dc2afa26;hpb=849f10351d673ced1db6f13e399876f22121f60c;p=ffmpeg diff --git a/libavcodec/vmnc.c b/libavcodec/vmnc.c index 49210158ff2..a97655a27c3 100644 --- a/libavcodec/vmnc.c +++ b/libavcodec/vmnc.c @@ -17,11 +17,10 @@ * You should have received a copy of the GNU Lesser 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 - * */ /** - * @file vmnc.c + * @file libavcodec/vmnc.c * VMware Screen Codec (VMnc) decoder * As Alex Beregszaszi discovered, this is effectively RFB data dump */ @@ -29,7 +28,7 @@ #include #include -#include "common.h" +#include "libavutil/intreadwrite.h" #include "avcodec.h" enum EncTypes { @@ -72,19 +71,19 @@ typedef struct VmncContext { } VmncContext; /* read pixel value from stream */ -static av_always_inline int vmnc_get_pixel(uint8_t* buf, int bpp, int be) { +static av_always_inline int vmnc_get_pixel(const uint8_t* buf, int bpp, int be) { switch(bpp * 2 + be) { case 2: case 3: return *buf; - case 4: return LE_16(buf); - case 5: return BE_16(buf); - case 8: return LE_32(buf); - case 9: return BE_32(buf); + case 4: return AV_RL16(buf); + case 5: return AV_RB16(buf); + case 8: return AV_RL32(buf); + case 9: return AV_RB32(buf); default: return 0; } } -static void load_cursor(VmncContext *c, uint8_t *src) +static void load_cursor(VmncContext *c, const uint8_t *src) { int i, j, p; const int bpp = c->bpp2; @@ -171,7 +170,7 @@ static void put_cursor(uint8_t *dst, int stride, VmncContext *c, int dx, int dy) } } -/* fill rectangle with given colour */ +/* fill rectangle with given color */ static av_always_inline void paint_rect(uint8_t *dst, int dx, int dy, int w, int h, int color, int bpp, int stride) { int i, j; @@ -202,7 +201,7 @@ static av_always_inline void paint_rect(uint8_t *dst, int dx, int dy, int w, int } } -static av_always_inline void paint_raw(uint8_t *dst, int w, int h, uint8_t* src, int bpp, int be, int stride) +static av_always_inline void paint_raw(uint8_t *dst, int w, int h, const uint8_t* src, int bpp, int be, int stride) { int i, j, p; for(j = 0; j < h; j++) { @@ -225,14 +224,14 @@ static av_always_inline void paint_raw(uint8_t *dst, int w, int h, uint8_t* src, } } -static int decode_hextile(VmncContext *c, uint8_t* dst, uint8_t* src, int ssize, int w, int h, int stride) +static int decode_hextile(VmncContext *c, uint8_t* dst, const uint8_t* src, int ssize, int w, int h, int stride) { int i, j, k; int bg = 0, fg = 0, rects, color, flags, xy, wh; const int bpp = c->bpp2; uint8_t *dst2; int bw = 16, bh = 16; - uint8_t *ssrc=src; + const uint8_t *ssrc=src; for(j = 0; j < h; j += 16) { dst2 = dst; @@ -285,11 +284,13 @@ static int decode_hextile(VmncContext *c, uint8_t* dst, uint8_t* src, int ssize, return src - ssrc; } -static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size) +static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt) { - VmncContext * const c = (VmncContext *)avctx->priv_data; + const uint8_t *buf = avpkt->data; + int buf_size = avpkt->size; + VmncContext * const c = avctx->priv_data; uint8_t *outptr; - uint8_t *src = buf; + const uint8_t *src = buf; int dx, dy, w, h, depth, enc, chunks, res, size_left; c->pic.reference = 1; @@ -328,13 +329,13 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8 } } src += 2; - chunks = BE_16(src); src += 2; + chunks = AV_RB16(src); src += 2; while(chunks--) { - dx = BE_16(src); src += 2; - dy = BE_16(src); src += 2; - w = BE_16(src); src += 2; - h = BE_16(src); src += 2; - enc = BE_32(src); src += 4; + dx = AV_RB16(src); src += 2; + dy = AV_RB16(src); src += 2; + w = AV_RB16(src); src += 2; + h = AV_RB16(src); src += 2; + enc = AV_RB32(src); src += 4; outptr = c->pic.data[0] + dx * c->bpp2 + dy * c->pic.linesize[0]; size_left = buf_size - (src - buf); switch(enc) { @@ -458,21 +459,19 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8 * Init VMnc decoder * */ -static int decode_init(AVCodecContext *avctx) +static av_cold int decode_init(AVCodecContext *avctx) { - VmncContext * const c = (VmncContext *)avctx->priv_data; + VmncContext * const c = avctx->priv_data; c->avctx = avctx; - avctx->has_b_frames = 0; - c->pic.data[0] = NULL; c->width = avctx->width; c->height = avctx->height; if (avcodec_check_dimensions(avctx, avctx->width, avctx->height) < 0) { return 1; } - c->bpp = avctx->bits_per_sample; + c->bpp = avctx->bits_per_coded_sample; c->bpp2 = c->bpp/8; switch(c->bpp){ @@ -499,9 +498,9 @@ static int decode_init(AVCodecContext *avctx) * Uninit VMnc decoder * */ -static int decode_end(AVCodecContext *avctx) +static av_cold int decode_end(AVCodecContext *avctx) { - VmncContext * const c = (VmncContext *)avctx->priv_data; + VmncContext * const c = avctx->priv_data; if (c->pic.data[0]) avctx->release_buffer(avctx, &c->pic); @@ -513,13 +512,15 @@ static int decode_end(AVCodecContext *avctx) } AVCodec vmnc_decoder = { - "VMware video", + "vmnc", CODEC_TYPE_VIDEO, CODEC_ID_VMNC, sizeof(VmncContext), decode_init, NULL, decode_end, - decode_frame + decode_frame, + CODEC_CAP_DR1, + .long_name = NULL_IF_CONFIG_SMALL("VMware Screen Codec / VMware Video"), };