+/*
+ * Unlike the RGB24 read/restore, which reads in a component at a time,
+ * ARGB read/restore reads in ARGB quads.
+ */
+static int read_argb_line(CLLCContext *ctx, GetBitContext *gb, int *top_left,
+ VLC *vlc, uint8_t *outbuf)
+{
+ uint8_t *dst;
+ int pred[4];
+ int code;
+ int i;
+
+ OPEN_READER(bits, gb);
+
+ dst = outbuf;
+ pred[0] = top_left[0];
+ pred[1] = top_left[1];
+ pred[2] = top_left[2];
+ pred[3] = top_left[3];
+
+ for (i = 0; i < ctx->avctx->width; i++) {
+ /* Always get the alpha component */
+ UPDATE_CACHE(bits, gb);
+ GET_VLC(code, bits, gb, vlc[0].table, 7, 2);
+
+ pred[0] += code;
+ dst[0] = pred[0];
+
+ /* Skip the components if they are entirely transparent */
+ if (dst[0]) {
+ /* Red */
+ UPDATE_CACHE(bits, gb);
+ GET_VLC(code, bits, gb, vlc[1].table, 7, 2);
+
+ pred[1] += code;
+ dst[1] = pred[1];
+
+ /* Green */
+ UPDATE_CACHE(bits, gb);
+ GET_VLC(code, bits, gb, vlc[2].table, 7, 2);
+
+ pred[2] += code;
+ dst[2] = pred[2];
+
+ /* Blue */
+ UPDATE_CACHE(bits, gb);
+ GET_VLC(code, bits, gb, vlc[3].table, 7, 2);
+
+ pred[3] += code;
+ dst[3] = pred[3];
+ } else {
+ dst[1] = 0;
+ dst[2] = 0;
+ dst[3] = 0;
+ }
+
+ dst += 4;
+ }
+
+ CLOSE_READER(bits, gb);
+
+ dst -= 4 * ctx->avctx->width;
+ top_left[0] = dst[0];
+
+ /* Only stash components if they are not transparent */
+ if (top_left[0]) {
+ top_left[1] = dst[1];
+ top_left[2] = dst[2];
+ top_left[3] = dst[3];
+ }
+
+ return 0;
+}
+
+static int read_rgb24_component_line(CLLCContext *ctx, GetBitContext *gb,
+ int *top_left, VLC *vlc, uint8_t *outbuf)