summaryrefslogtreecommitdiff
path: root/libavformat/matroskadec.c
diff options
context:
space:
mode:
authorAurelien Jacobs <aurel@gnuage.org>2008-05-09 01:53:59 +0000
committerAurelien Jacobs <aurel@gnuage.org>2008-05-09 01:53:59 +0000
commitde3230fb967a6e4e46ae403d3916d990460c4d37 (patch)
tree3d67c47d97f6773ec5dd7ec7740f8e6924d27746 /libavformat/matroskadec.c
parent931141055ba77ec168e220aae1c23fb14ded71c9 (diff)
matroskadec: add support for lzo compressed tracks
Originally committed as revision 13087 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/matroskadec.c')
-rw-r--r--libavformat/matroskadec.c33
1 files changed, 27 insertions, 6 deletions
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 4de3f8bf4c..13c2e15528 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -34,6 +34,7 @@
#include "intfloat_readwrite.h"
#include "matroska.h"
#include "libavcodec/mpeg4audio.h"
+#include "libavutil/lzo.h"
typedef struct Track {
MatroskaTrackType type;
@@ -1498,7 +1499,8 @@ matroska_add_stream (MatroskaDemuxContext *matroska)
uint64_t num;
if ((res = ebml_read_uint(matroska, &id, &num)) < 0)
break;
- if (num != MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP)
+ if (num != MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP &&
+ num != MATROSKA_TRACK_ENCODING_COMP_LZO)
av_log(matroska->ctx, AV_LOG_ERROR,
"Unsupported compression algo");
track->encoding_algo = num;
@@ -2695,23 +2697,42 @@ matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data, int size,
matroska_queue_packet(matroska, pkt);
}
} else {
- int offset = 0;
+ int result, offset = 0, ilen, olen, pkt_size = lace_size[n];
+ uint8_t *pkt_data = data;
- if (matroska->tracks[track]->encoding_scope&1 &&
- matroska->tracks[track]->encoding_algo == MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP) {
+ if (matroska->tracks[track]->encoding_scope & 1) {
+ switch (matroska->tracks[track]->encoding_algo) {
+ case MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP:
offset = matroska->tracks[track]->encoding_settings_len;
+ break;
+ case MATROSKA_TRACK_ENCODING_COMP_LZO:
+ pkt_data = NULL;
+ do {
+ ilen = lace_size[n];
+ olen = pkt_size *= 3;
+ pkt_data = av_realloc(pkt_data,
+ pkt_size+LZO_OUTPUT_PADDING);
+ result = lzo1x_decode(pkt_data, &olen, data, &ilen);
+ } while (result==LZO_OUTPUT_FULL && pkt_size<10000000);
+ if (result) {
+ av_free(pkt_data);
+ continue;
+ }
+ pkt_size -= olen;
+ break;
+ }
}
pkt = av_mallocz(sizeof(AVPacket));
/* XXX: prevent data copy... */
- if (av_new_packet(pkt, lace_size[n]+offset) < 0) {
+ if (av_new_packet(pkt, pkt_size+offset) < 0) {
res = AVERROR(ENOMEM);
n = laces-1;
break;
}
if (offset)
memcpy (pkt->data, matroska->tracks[track]->encoding_settings, offset);
- memcpy (pkt->data+offset, data, lace_size[n]);
+ memcpy (pkt->data+offset, pkt_data, pkt_size);
if (n == 0)
pkt->flags = is_keyframe;