Unified · Split
| @@ -4776,24 +4776,28 @@ static int mov_read_uuid(MOVContext *c, AVIOContext *pb, MOVAtom atom) · 4775 unmodified lines | ||
| 4776 | 4776 | } else if (!memcmp(uuid, uuid_xmp, sizeof(uuid))) { |
| 4777 | 4777 | uint8_t *buffer; |
| 4778 | 4778 | size_t len = atom.size - sizeof(uuid); |
| 4779 | − | |
| 4780 | − buffer = av_mallocz(len + 1); | |
| 4781 | − if (!buffer) { | |
| 4782 | − return AVERROR(ENOMEM); | |
| 4783 | − } | |
| 4784 | − ret = avio_read(pb, buffer, len); | |
| 4785 | − if (ret < 0) { | |
| 4786 | − av_free(buffer); | |
| 4787 | − return ret; | |
| 4788 | − } else if (ret != len) { | |
| 4789 | − av_free(buffer); | |
| 4790 | − return AVERROR_INVALIDDATA; | |
| 4791 | − } | |
| 4792 | 4779 | if (c->export_xmp) { |
| 4780 | + buffer = av_mallocz(len + 1); | |
| 4781 | + if (!buffer) { | |
| 4782 | + return AVERROR(ENOMEM); | |
| 4783 | + } | |
| 4784 | + ret = avio_read(pb, buffer, len); | |
| 4785 | + if (ret < 0) { | |
| 4786 | + av_free(buffer); | |
| 4787 | + return ret; | |
| 4788 | + } else if (ret != len) { | |
| 4789 | + av_free(buffer); | |
| 4790 | + return AVERROR_INVALIDDATA; | |
| 4791 | + } | |
| 4793 | 4792 | buffer[len] = '\0'; |
| 4794 | 4793 | av_dict_set(&c->fc->metadata, "xmp", buffer, 0); |
| 4794 | + av_free(buffer); | |
| 4795 | + } else { | |
| 4796 | + // skip all uuid atom, which makes it fast for long uuid-xmp file | |
| 4797 | + ret = avio_skip(pb, len); | |
| 4798 | + if (ret < 0) | |
| 4799 | + return ret; | |
| 4795 | 4800 | } |
| 4796 | − av_free(buffer); | |
| 4797 | 4801 | } else if (!memcmp(uuid, uuid_spherical, sizeof(uuid))) { |
| 4798 | 4802 | size_t len = atom.size - sizeof(uuid); |
| 4799 | 4803 | ret = mov_parse_uuid_spherical(sc, pb, len); |