aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2013-05-28 01:10:26 +0200
committerMichael Niedermayer <michaelni@gmx.at>2013-05-28 01:11:30 +0200
commitd66de3801ef5569ad1a3c3b733f8b48060582a2f (patch)
tree2d9c850456f56e6d75aa107e632976d656c28d97 /libavcodec
parent8cf57efdd7846cce9467e68f6c16abf6d9b4fea2 (diff)
downloadffmpeg-d66de3801ef5569ad1a3c3b733f8b48060582a2f.tar.gz
j2kdec: merge get_tlm() from jpeg2000
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/j2kdec.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/libavcodec/j2kdec.c b/libavcodec/j2kdec.c
index 40afced32f..a9ad8c1b97 100644
--- a/libavcodec/j2kdec.c
+++ b/libavcodec/j2kdec.c
@@ -432,6 +432,48 @@ static int get_sot(Jpeg2000DecoderContext *s)
return 0;
}
+/* Tile-part lengths: see ISO 15444-1:2002, section A.7.1
+ * Used to know the number of tile parts and lengths.
+ * There may be multiple TLMs in the header.
+ * TODO: The function is not used for tile-parts management, nor anywhere else.
+ * It can be useful to allocate memory for tile parts, before managing the SOT
+ * markers. Parsing the TLM header is needed to increment the input header
+ * buffer.
+ * This marker is mandatory for DCI. */
+static uint8_t get_tlm(Jpeg2000DecoderContext *s, int n)
+{
+ uint8_t Stlm, ST, SP, tile_tlm, i;
+ bytestream2_get_byte(&s->g); /* Ztlm: skipped */
+ Stlm = bytestream2_get_byte(&s->g);
+
+ // too complex ? ST = ((Stlm >> 4) & 0x01) + ((Stlm >> 4) & 0x02);
+ ST = (Stlm >> 4) & 0x03;
+ // TODO: Manage case of ST = 0b11 --> raise error
+ SP = (Stlm >> 6) & 0x01;
+ tile_tlm = (n - 4) / ((SP + 1) * 2 + ST);
+ for (i = 0; i < tile_tlm; i++) {
+ switch (ST) {
+ case 0:
+ break;
+ case 1:
+ bytestream2_get_byte(&s->g);
+ break;
+ case 2:
+ bytestream2_get_be16(&s->g);
+ break;
+ case 3:
+ bytestream2_get_be32(&s->g);
+ break;
+ }
+ if (SP == 0) {
+ bytestream2_get_be16(&s->g);
+ } else {
+ bytestream2_get_be32(&s->g);
+ }
+ }
+ return 0;
+}
+
static int init_tile(Jpeg2000DecoderContext *s, int tileno)
{
int compno;
@@ -994,6 +1036,10 @@ static int decode_codestream(Jpeg2000DecoderContext *s)
// the comment is ignored
bytestream2_skip(&s->g, len - 2);
break;
+ case JPEG2000_TLM:
+ // Tile-part lengths
+ ret = get_tlm(s, len);
+ break;
default:
av_log(s->avctx, AV_LOG_ERROR, "unsupported marker 0x%.4X at pos 0x%x\n", marker, bytestream2_tell(&s->g) - 4);
bytestream2_skip(&s->g, len - 2);