avio_skip(s->pb, tlen);
/* check for text tag or supported special meta tag */
} else if (tag[0] == 'T' || (extra_meta && (extra_func = get_extra_meta_func(tag, isv34)))) {
- if (unsync || tunsync) {
+ if (unsync || tunsync || tcomp) {
- int i, j;
+ int64_t end = avio_tell(s->pb) + tlen;
+ uint8_t *b;
- av_fast_malloc(&buffer, &buffer_size, tlen);
+
+ av_fast_malloc(&buffer, &buffer_size, dlen);
if (!buffer) {
- av_log(s, AV_LOG_ERROR, "Failed to alloc %d bytes\n", tlen);
+ av_log(s, AV_LOG_ERROR, "Failed to alloc %ld bytes\n", dlen);
goto seek;
}
-
- for (i = 0, j = 0; i < dlen; i++, j++) {
- if (!tcomp)
- buffer[j] = avio_r8(s->pb);
- if (j > 0 && !buffer[j] && buffer[j - 1] == 0xff) {
- /* Unsynchronised byte, skip it */
- j--;
+ b = buffer;
+#if CONFIG_ZLIB
+ if (tcomp) {
+ int n, err;
+
+ av_log(s, AV_LOG_DEBUG, "Compresssed frame %s tlen=%d dlen=%ld\n", tag, tlen, dlen);
+
+ av_fast_malloc(&compressed_buffer, &compressed_buffer_size, tlen);
+ if (!compressed_buffer) {
+ av_log(s, AV_LOG_ERROR, "Failed to alloc %d bytes\n", tlen);
+ goto seek;
+ }
+
+ n = avio_read(s->pb, compressed_buffer, tlen);
+ if (n < 0) {
+ av_log(s, AV_LOG_ERROR, "Failed to read compressed tag\n");
+ goto seek;
+ }
+
+ err = uncompress(buffer, &dlen, compressed_buffer, n);
+ if (err != Z_OK) {
+ av_log(s, AV_LOG_ERROR, "Failed to uncompress tag: %d\n", err);
+ goto seek;
+ }
++ b += dlen;
+ }
+#endif
- ffio_init_context(&pb, buffer, j, 0, NULL, NULL, NULL, NULL);
- tlen = j;
++ if (unsync || tunsync) {
++ if (tcomp) {
++ av_log_ask_for_sample(s, "tcomp with unsync\n");
++ goto seek;
+ }
+ while (avio_tell(s->pb) < end) {
+ *b++ = avio_r8(s->pb);
+ if (*(b - 1) == 0xff && avio_tell(s->pb) < end - 1) {
+ uint8_t val = avio_r8(s->pb);
+ *b++ = val ? val : avio_r8(s->pb);
+ }
+ }
+ }
+ ffio_init_context(&pb, buffer, b - buffer, 0, NULL, NULL, NULL, NULL);
+ tlen = b - buffer;
pbx = &pb; // read from sync buffer
} else {
pbx = s->pb; // read straight from input