[FFmpeg-cvslog] r13087 - trunk/libavformat/matroskadec.c
aurel
subversion
Fri May 9 03:54:00 CEST 2008
Author: aurel
Date: Fri May 9 03:53:59 2008
New Revision: 13087
Log:
matroskadec: add support for lzo compressed tracks
Modified:
trunk/libavformat/matroskadec.c
Modified: trunk/libavformat/matroskadec.c
==============================================================================
--- trunk/libavformat/matroskadec.c (original)
+++ trunk/libavformat/matroskadec.c Fri May 9 03:53:59 2008
@@ -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 (MatroskaDemuxContex
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(MatroskaDemuxContex
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;
More information about the ffmpeg-cvslog
mailing list