diff options
author | Baptiste Coudurier <baptiste.coudurier@smartjog.com> | 2006-03-06 21:22:02 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2006-03-06 21:22:02 +0000 |
commit | fc5188f3d1f71e2cc7c75f07d8763e5c390d26ad (patch) | |
tree | 27648abee0909579fdae5b625d9b83fddf40463f /libavformat/mov.c | |
parent | b865838ea2c4921265987bba671fb049094775cd (diff) | |
download | ffmpeg-fc5188f3d1f71e2cc7c75f07d8763e5c390d26ad.tar.gz |
add support for Motion JPEG 2000 file format patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com)
Originally committed as revision 5118 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/mov.c')
-rw-r--r-- | libavformat/mov.c | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/libavformat/mov.c b/libavformat/mov.c index 39ebb8ef56..558025942b 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -636,8 +636,10 @@ static int mov_read_ftyp(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom) case MKTAG('m', 'm', 'p', '4'): /* Mobile MP4 */ case MKTAG('M', '4', 'A', ' '): /* Apple iTunes AAC-LC Audio */ case MKTAG('M', '4', 'P', ' '): /* Apple iTunes AAC-LC Protected Audio */ + case MKTAG('m', 'j', 'p', '2'): /* Motion Jpeg 2000 */ c->mp4 = 1; case MKTAG('q', 't', ' ', ' '): + default: av_log(c->fc, AV_LOG_DEBUG, "ISO: File Type Major Brand: %.4s\n",(char *)&type); } get_be32(pb); /* minor version */ @@ -806,6 +808,27 @@ static int mov_read_wave(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom) return 0; } +static int mov_read_jp2h(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom) +{ + AVStream *st = c->fc->streams[c->fc->nb_streams-1]; + + if((uint64_t)atom.size > (1<<30)) + return -1; + + av_free(st->codec->extradata); + + st->codec->extradata_size = atom.size + 8; + st->codec->extradata = (uint8_t*) av_mallocz(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); + + /* pass all jp2h atom to codec */ + if (st->codec->extradata) { + strcpy(st->codec->extradata + 4, "jp2h"); + get_buffer(pb, st->codec->extradata + 8, atom.size); + } else + url_fskip(pb, atom.size); + return 0; +} + static int mov_read_avcC(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom) { AVStream *st = c->fc->streams[c->fc->nb_streams-1]; @@ -1429,6 +1452,7 @@ static const MOVParseTableEntry mov_default_parse_table[] = { { MKTAG( 'h', 'i', 'n', 't' ), mov_read_leaf }, { MKTAG( 'h', 'm', 'h', 'd' ), mov_read_leaf }, { MKTAG( 'i', 'o', 'd', 's' ), mov_read_leaf }, +{ MKTAG( 'j', 'p', '2', 'h' ), mov_read_jp2h }, { MKTAG( 'm', 'd', 'a', 't' ), mov_read_mdat }, { MKTAG( 'm', 'd', 'h', 'd' ), mov_read_mdhd }, { MKTAG( 'm', 'd', 'i', 'a' ), mov_read_default }, @@ -1534,6 +1558,7 @@ static int mov_probe(AVProbeData *p) tag = mov_to_tag(p->buf + offset + 4); switch(tag) { /* check for obvious tags */ + case MKTAG( 'j', 'P', ' ', ' ' ): /* jpeg 2000 signature */ case MKTAG( 'm', 'o', 'o', 'v' ): case MKTAG( 'm', 'd', 'a', 't' ): case MKTAG( 'p', 'n', 'o', 't' ): /* detect movs with preview pics like ew.mov and april.mov */ @@ -2059,8 +2084,8 @@ static int mov_read_close(AVFormatContext *s) } static AVInputFormat mov_iformat = { - "mov,mp4,m4a,3gp,3g2", - "QuickTime/MPEG4 format", + "mov,mp4,m4a,3gp,3g2,mj2", + "QuickTime/MPEG4/Motion JPEG 2000 format", sizeof(MOVContext), mov_probe, mov_read_header, |