* [FFmpeg-devel] [PATCH v4 1/3] avcodec/sanm: ignore unknown codecs in FOBJs @ 2025-03-04 17:07 Manuel Lauss 2025-03-04 17:07 ` [FFmpeg-devel] [PATCH v4 2/3] avcodec/sanm: fobj left/top are signed Manuel Lauss ` (2 more replies) 0 siblings, 3 replies; 7+ messages in thread From: Manuel Lauss @ 2025-03-04 17:07 UTC (permalink / raw) To: ffmpeg-devel; +Cc: Manuel Lauss Don't error out, just ignore unknown codec numbers and pretend decode succeeded. This is useful for older LucasArts titles which stack a lot of different FOBJs with different codecs into a single frame. Signed-off-by: Manuel Lauss <manuel.lauss@gmail.com> --- v4: no changes v3: no changes v2: Mark frame as corrupt, suggested by Marton Balint libavcodec/sanm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libavcodec/sanm.c b/libavcodec/sanm.c index c30095ed32..a4f0a28c7c 100644 --- a/libavcodec/sanm.c +++ b/libavcodec/sanm.c @@ -1274,7 +1274,8 @@ static int process_frame_obj(SANMVideoContext *ctx) return old_codec48(ctx, w, h); default: avpriv_request_sample(ctx->avctx, "Subcodec %d", codec); - return AVERROR_PATCHWELCOME; + ctx->frame->flags |= AV_FRAME_FLAG_CORRUPT; + return 0; } } -- 2.48.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". ^ permalink raw reply [flat|nested] 7+ messages in thread
* [FFmpeg-devel] [PATCH v4 2/3] avcodec/sanm: fobj left/top are signed 2025-03-04 17:07 [FFmpeg-devel] [PATCH v4 1/3] avcodec/sanm: ignore unknown codecs in FOBJs Manuel Lauss @ 2025-03-04 17:07 ` Manuel Lauss 2025-03-08 19:11 ` Michael Niedermayer 2025-03-04 17:07 ` [FFmpeg-devel] [PATCH v4 3/3] avcodec/sanm: add smush codec23 decoder Manuel Lauss 2025-03-08 19:16 ` [FFmpeg-devel] [PATCH v4 1/3] avcodec/sanm: ignore unknown codecs in FOBJs Michael Niedermayer 2 siblings, 1 reply; 7+ messages in thread From: Manuel Lauss @ 2025-03-04 17:07 UTC (permalink / raw) To: ffmpeg-devel; +Cc: Manuel Lauss The left and top parameters of an FOBJ are signed values. Signed-off-by: Manuel Lauss <manuel.lauss@gmail.com> --- v4: revert v3, it arose due to a misunderstanding v3: change the bytestream accessor to signed too v2: no changes libavcodec/sanm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libavcodec/sanm.c b/libavcodec/sanm.c index a4f0a28c7c..71dbac4320 100644 --- a/libavcodec/sanm.c +++ b/libavcodec/sanm.c @@ -1238,8 +1238,8 @@ static int old_codec48(SANMVideoContext *ctx, int width, int height) static int process_frame_obj(SANMVideoContext *ctx) { uint16_t codec = bytestream2_get_le16u(&ctx->gb); - uint16_t left = bytestream2_get_le16u(&ctx->gb); - uint16_t top = bytestream2_get_le16u(&ctx->gb); + int16_t left = bytestream2_get_le16u(&ctx->gb); + int16_t top = bytestream2_get_le16u(&ctx->gb); uint16_t w = bytestream2_get_le16u(&ctx->gb); uint16_t h = bytestream2_get_le16u(&ctx->gb); -- 2.48.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [FFmpeg-devel] [PATCH v4 2/3] avcodec/sanm: fobj left/top are signed 2025-03-04 17:07 ` [FFmpeg-devel] [PATCH v4 2/3] avcodec/sanm: fobj left/top are signed Manuel Lauss @ 2025-03-08 19:11 ` Michael Niedermayer 2025-03-09 15:52 ` Manuel Lauss 0 siblings, 1 reply; 7+ messages in thread From: Michael Niedermayer @ 2025-03-08 19:11 UTC (permalink / raw) To: FFmpeg development discussions and patches [-- Attachment #1.1: Type: text/plain, Size: 1424 bytes --] Hi Manuel On Tue, Mar 04, 2025 at 06:07:18PM +0100, Manuel Lauss wrote: > The left and top parameters of an FOBJ are signed values. > > Signed-off-by: Manuel Lauss <manuel.lauss@gmail.com> > --- > v4: revert v3, it arose due to a misunderstanding > v3: change the bytestream accessor to signed too > v2: no changes > libavcodec/sanm.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/libavcodec/sanm.c b/libavcodec/sanm.c > index a4f0a28c7c..71dbac4320 100644 > --- a/libavcodec/sanm.c > +++ b/libavcodec/sanm.c > @@ -1238,8 +1238,8 @@ static int old_codec48(SANMVideoContext *ctx, int width, int height) > static int process_frame_obj(SANMVideoContext *ctx) > { > uint16_t codec = bytestream2_get_le16u(&ctx->gb); > - uint16_t left = bytestream2_get_le16u(&ctx->gb); > - uint16_t top = bytestream2_get_le16u(&ctx->gb); > + int16_t left = bytestream2_get_le16u(&ctx->gb); > + int16_t top = bytestream2_get_le16u(&ctx->gb); > uint16_t w = bytestream2_get_le16u(&ctx->gb); > uint16_t h = bytestream2_get_le16u(&ctx->gb); Does the following code also handle all error conditions that negative left/top could now trigger ? thx [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB It is dangerous to be right in matters on which the established authorities are wrong. -- Voltaire [-- Attachment #1.2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] [-- Attachment #2: Type: text/plain, Size: 251 bytes --] _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [FFmpeg-devel] [PATCH v4 2/3] avcodec/sanm: fobj left/top are signed 2025-03-08 19:11 ` Michael Niedermayer @ 2025-03-09 15:52 ` Manuel Lauss 2025-03-10 20:32 ` Michael Niedermayer 0 siblings, 1 reply; 7+ messages in thread From: Manuel Lauss @ 2025-03-09 15:52 UTC (permalink / raw) To: FFmpeg development discussions and patches Hi Michael, On Sat, Mar 8, 2025 at 8:11 PM Michael Niedermayer <michael@niedermayer.cc> wrote: > > Hi Manuel > > On Tue, Mar 04, 2025 at 06:07:18PM +0100, Manuel Lauss wrote: > > The left and top parameters of an FOBJ are signed values. > > > > Signed-off-by: Manuel Lauss <manuel.lauss@gmail.com> > > --- > > v4: revert v3, it arose due to a misunderstanding > > v3: change the bytestream accessor to signed too > > v2: no changes > > libavcodec/sanm.c | 4 ++-- > > 1 file changed, 2 insertions(+), 2 deletions(-) > > > > diff --git a/libavcodec/sanm.c b/libavcodec/sanm.c > > index a4f0a28c7c..71dbac4320 100644 > > --- a/libavcodec/sanm.c > > +++ b/libavcodec/sanm.c > > @@ -1238,8 +1238,8 @@ static int old_codec48(SANMVideoContext *ctx, int width, int height) > > static int process_frame_obj(SANMVideoContext *ctx) > > { > > uint16_t codec = bytestream2_get_le16u(&ctx->gb); > > - uint16_t left = bytestream2_get_le16u(&ctx->gb); > > - uint16_t top = bytestream2_get_le16u(&ctx->gb); > > + int16_t left = bytestream2_get_le16u(&ctx->gb); > > + int16_t top = bytestream2_get_le16u(&ctx->gb); > > uint16_t w = bytestream2_get_le16u(&ctx->gb); > > uint16_t h = bytestream2_get_le16u(&ctx->gb); > > Does the following code also handle all error conditions that > negative left/top could now trigger ? For the LucasArts titles that sanm.c currently supports well, no negative values are ever encountered. I let ffplay run through maybe 1/3 of the Rebel Assault 1 videos, which are the only ones that make use of negative values, but didn't encounter any crashes; mostly because the codecs it uses aren't supported by ffmpeg/sanm (yet). Manuel _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [FFmpeg-devel] [PATCH v4 2/3] avcodec/sanm: fobj left/top are signed 2025-03-09 15:52 ` Manuel Lauss @ 2025-03-10 20:32 ` Michael Niedermayer 0 siblings, 0 replies; 7+ messages in thread From: Michael Niedermayer @ 2025-03-10 20:32 UTC (permalink / raw) To: FFmpeg development discussions and patches [-- Attachment #1.1: Type: text/plain, Size: 2440 bytes --] Hi On Sun, Mar 09, 2025 at 04:52:25PM +0100, Manuel Lauss wrote: > Hi Michael, > > On Sat, Mar 8, 2025 at 8:11 PM Michael Niedermayer > <michael@niedermayer.cc> wrote: > > > > Hi Manuel > > > > On Tue, Mar 04, 2025 at 06:07:18PM +0100, Manuel Lauss wrote: > > > The left and top parameters of an FOBJ are signed values. > > > > > > Signed-off-by: Manuel Lauss <manuel.lauss@gmail.com> > > > --- > > > v4: revert v3, it arose due to a misunderstanding > > > v3: change the bytestream accessor to signed too > > > v2: no changes > > > libavcodec/sanm.c | 4 ++-- > > > 1 file changed, 2 insertions(+), 2 deletions(-) > > > > > > diff --git a/libavcodec/sanm.c b/libavcodec/sanm.c > > > index a4f0a28c7c..71dbac4320 100644 > > > --- a/libavcodec/sanm.c > > > +++ b/libavcodec/sanm.c > > > @@ -1238,8 +1238,8 @@ static int old_codec48(SANMVideoContext *ctx, int width, int height) > > > static int process_frame_obj(SANMVideoContext *ctx) > > > { > > > uint16_t codec = bytestream2_get_le16u(&ctx->gb); > > > - uint16_t left = bytestream2_get_le16u(&ctx->gb); > > > - uint16_t top = bytestream2_get_le16u(&ctx->gb); > > > + int16_t left = bytestream2_get_le16u(&ctx->gb); > > > + int16_t top = bytestream2_get_le16u(&ctx->gb); > > > uint16_t w = bytestream2_get_le16u(&ctx->gb); > > > uint16_t h = bytestream2_get_le16u(&ctx->gb); > > > > Does the following code also handle all error conditions that > > negative left/top could now trigger ? > > For the LucasArts titles that sanm.c currently supports well, > no negative values are ever encountered. > I let ffplay run through maybe 1/3 of the Rebel Assault 1 videos, > which are the only ones that make use of negative values, but > didn't encounter any crashes; mostly because the codecs it > uses aren't supported by ffmpeg/sanm (yet). My concern is not that it crashes my concern is that manually craftet files could result in arbitrary code execution if theres any out of array accesses. Did you check that negative values are safe in that respect ? thx [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB If the United States is serious about tackling the national security threats related to an insecure 5G network, it needs to rethink the extent to which it values corporate profits and government espionage over security.-Bruce Schneier [-- Attachment #1.2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] [-- Attachment #2: Type: text/plain, Size: 251 bytes --] _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". ^ permalink raw reply [flat|nested] 7+ messages in thread
* [FFmpeg-devel] [PATCH v4 3/3] avcodec/sanm: add smush codec23 decoder 2025-03-04 17:07 [FFmpeg-devel] [PATCH v4 1/3] avcodec/sanm: ignore unknown codecs in FOBJs Manuel Lauss 2025-03-04 17:07 ` [FFmpeg-devel] [PATCH v4 2/3] avcodec/sanm: fobj left/top are signed Manuel Lauss @ 2025-03-04 17:07 ` Manuel Lauss 2025-03-08 19:16 ` [FFmpeg-devel] [PATCH v4 1/3] avcodec/sanm: ignore unknown codecs in FOBJs Michael Niedermayer 2 siblings, 0 replies; 7+ messages in thread From: Manuel Lauss @ 2025-03-04 17:07 UTC (permalink / raw) To: ffmpeg-devel; +Cc: Manuel Lauss This codec alternatingly skips and changes existing pixels. A second 16bit parameter in the FOBJ header indicates how to do the pixel changes: either by specifying a LUT in the codec datastream or by adding a constant value to the pixel. For ANIMv1 (Rebel Assault 1) the first 8bit parameter is used as a constant offset to add to the existing pixel value. Signed-off-by: Manuel Lauss <manuel.lauss@gmail.com> --- v4: also support c23 on ANIMv0/1 (Rebel Assault 1, e.g LVL11/L11PLAY.ANM water) v3: updates due to changes in patch 2 v2: no changes. Videos showing the before/after state (Rebel Assault II LEV09/09PLAY.SAN file) http://mlau.at/ffmpeg_c23_before.mp4 http://mlau.at/ffmpeg_c23_after.mp4 notice the blue transparent forcefields. libavcodec/sanm.c | 66 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/libavcodec/sanm.c b/libavcodec/sanm.c index 71dbac4320..534ec7aee6 100644 --- a/libavcodec/sanm.c +++ b/libavcodec/sanm.c @@ -292,6 +292,7 @@ typedef struct SANMVideoContext { int8_t p4x4glyphs[NGLYPHS][16]; int8_t p8x8glyphs[NGLYPHS][64]; uint8_t c47itbl[0x10000]; + uint8_t c23lut[256]; } SANMVideoContext; typedef struct SANMFrameHeader { @@ -555,6 +556,62 @@ static int rle_decode(SANMVideoContext *ctx, uint8_t *dst, const int out_size) return 0; } +static int old_codec23(SANMVideoContext *ctx, int top, int left, int width, + int height, uint8_t param, uint16_t param2) +{ + const uint32_t maxpxo = ctx->width * ctx->pitch; + uint8_t *dst, lut[256], c; + int i, j, k, pc, sk; + int32_t pxoff; + + if (ctx->subversion < 2) { + /* Rebel Assault 1: constant offset + 0xd0 */ + for (i = 0; i < 256; i++) + lut[i] = (i + param + 0xd0) & 0xff; + } else if (param2 == 256) { + if (bytestream2_get_bytes_left(&ctx->gb) < 256) + return AVERROR_INVALIDDATA; + bytestream2_get_bufferu(&ctx->gb, ctx->c23lut, 256); + } else if (param2 < 256) { + for (i = 0; i < 256; i++) + lut[i] = (i + param2) & 0xff; + } else { + memcpy(lut, ctx->c23lut, 256); + } + if (bytestream2_get_bytes_left(&ctx->gb) < 1) + return 0; /* some c23 frames just set up the LUT */ + + dst = (uint8_t *)ctx->frm0; + for (i = 0; i < height; i++) { + if (bytestream2_get_bytes_left(&ctx->gb) < 2) + return 0; + pxoff = left + ((top + i) * ctx->pitch); + k = bytestream2_get_le16u(&ctx->gb); + sk = 1; + pc = 0; + while (k > 0 && pc <= width) { + if (bytestream2_get_bytes_left(&ctx->gb) < 1) + return AVERROR_INVALIDDATA; + j = bytestream2_get_byteu(&ctx->gb); + if (sk) { + pxoff += j; + pc += j; + } else { + while (j--) { + if (pxoff >=0 && pxoff < maxpxo) { + c = *(dst + pxoff); + *(dst + pxoff) = lut[c]; + } + pxoff++; + pc++; + } + } + sk ^= 1; + } + } + return 0; +} + static int old_codec1(SANMVideoContext *ctx, int top, int left, int width, int height) { @@ -1237,11 +1294,15 @@ static int old_codec48(SANMVideoContext *ctx, int width, int height) static int process_frame_obj(SANMVideoContext *ctx) { - uint16_t codec = bytestream2_get_le16u(&ctx->gb); + uint16_t parm2; + uint8_t codec = bytestream2_get_byteu(&ctx->gb); + uint8_t param = bytestream2_get_byteu(&ctx->gb); int16_t left = bytestream2_get_le16u(&ctx->gb); int16_t top = bytestream2_get_le16u(&ctx->gb); uint16_t w = bytestream2_get_le16u(&ctx->gb); uint16_t h = bytestream2_get_le16u(&ctx->gb); + bytestream2_skip(&ctx->gb, 2); + parm2 = bytestream2_get_le16u(&ctx->gb); if (!w || !h) { av_log(ctx->avctx, AV_LOG_ERROR, "Dimensions are invalid.\n"); @@ -1260,12 +1321,13 @@ static int process_frame_obj(SANMVideoContext *ctx) return AVERROR(ENOMEM); } } - bytestream2_skip(&ctx->gb, 4); switch (codec) { case 1: case 3: return old_codec1(ctx, top, left, w, h); + case 23: + return old_codec23(ctx, top, left, w, h, param, parm2); case 37: return old_codec37(ctx, top, left, w, h); case 47: -- 2.48.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [FFmpeg-devel] [PATCH v4 1/3] avcodec/sanm: ignore unknown codecs in FOBJs 2025-03-04 17:07 [FFmpeg-devel] [PATCH v4 1/3] avcodec/sanm: ignore unknown codecs in FOBJs Manuel Lauss 2025-03-04 17:07 ` [FFmpeg-devel] [PATCH v4 2/3] avcodec/sanm: fobj left/top are signed Manuel Lauss 2025-03-04 17:07 ` [FFmpeg-devel] [PATCH v4 3/3] avcodec/sanm: add smush codec23 decoder Manuel Lauss @ 2025-03-08 19:16 ` Michael Niedermayer 2 siblings, 0 replies; 7+ messages in thread From: Michael Niedermayer @ 2025-03-08 19:16 UTC (permalink / raw) To: FFmpeg development discussions and patches [-- Attachment #1.1: Type: text/plain, Size: 718 bytes --] Hi Manuel On Tue, Mar 04, 2025 at 06:07:17PM +0100, Manuel Lauss wrote: > Don't error out, just ignore unknown codec numbers and pretend > decode succeeded. This is useful for older LucasArts titles > which stack a lot of different FOBJs with different codecs into > a single frame. > > Signed-off-by: Manuel Lauss <manuel.lauss@gmail.com> > --- > v4: no changes > v3: no changes > v2: Mark frame as corrupt, suggested by Marton Balint > libavcodec/sanm.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) will apply thx [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB Why not whip the teacher when the pupil misbehaves? -- Diogenes of Sinope [-- Attachment #1.2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] [-- Attachment #2: Type: text/plain, Size: 251 bytes --] _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-03-10 20:32 UTC | newest] Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2025-03-04 17:07 [FFmpeg-devel] [PATCH v4 1/3] avcodec/sanm: ignore unknown codecs in FOBJs Manuel Lauss 2025-03-04 17:07 ` [FFmpeg-devel] [PATCH v4 2/3] avcodec/sanm: fobj left/top are signed Manuel Lauss 2025-03-08 19:11 ` Michael Niedermayer 2025-03-09 15:52 ` Manuel Lauss 2025-03-10 20:32 ` Michael Niedermayer 2025-03-04 17:07 ` [FFmpeg-devel] [PATCH v4 3/3] avcodec/sanm: add smush codec23 decoder Manuel Lauss 2025-03-08 19:16 ` [FFmpeg-devel] [PATCH v4 1/3] avcodec/sanm: ignore unknown codecs in FOBJs Michael Niedermayer
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel This inbox may be cloned and mirrored by anyone: git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \ ffmpegdev@gitmailbox.com public-inbox-index ffmpegdev Example config snippet for mirrors. AGPL code for this site: git clone https://public-inbox.org/public-inbox.git