This is the only code I found within FFmpeg that still inherently requires AV_PIX_FMT_FLAG_PSEUDOPAL. It's easily changed not to require it. Preparation for the next patch.
Unified · Split
| @@ -41,6 +41,7 @@ static int xwd_encode_frame(AVCodecContext *avctx, AVPacket *pkt, · 40 unmodified lines | ||
| 41 | 41 | int i, out_size, ret; |
| 42 | 42 | uint8_t *ptr, *buf; |
| 43 | 43 | AVFrame * const p = (AVFrame *)pict; |
| 44 | + uint32_t pal[256]; | |
| 44 | 45 | |
| 45 | 46 | pixdepth = av_get_bits_per_pixel(desc); |
| 46 | 47 | if (desc->flags & AV_PIX_FMT_FLAG_BE) |
| @@ -180,11 +181,17 @@ static int xwd_encode_frame(AVCodecContext *avctx, AVPacket *pkt, · 133 unmodified lines | ||
| 180 | 181 | bytestream_put_be32(&buf, 0); // window border width |
| 181 | 182 | bytestream_put_buffer(&buf, WINDOW_NAME, WINDOW_NAME_SIZE); |
| 182 | 183 | |
| 184 | + if (pix_fmt == AV_PIX_FMT_PAL8) { | |
| 185 | + memcpy(pal, p->data[1], sizeof(pal)); | |
| 186 | + } else { | |
| 187 | + avpriv_set_systematic_pal2(pal, pix_fmt); | |
| 188 | + } | |
| 189 | + | |
| 183 | 190 | for (i = 0; i < ncolors; i++) { |
| 184 | 191 | uint32_t val; |
| 185 | 192 | uint8_t red, green, blue; |
| 186 | 193 | |
| 187 | − val = AV_RN32A(p->data[1] + i * 4); | |
| 194 | + val = pal[i]; | |
| 188 | 195 | red = (val >> 16) & 0xFF; |
| 189 | 196 | green = (val >> 8) & 0xFF; |
| 190 | 197 | blue = val & 0xFF; |