Skip to content

Commit 1d7efae

Browse files
committed
mkclean: add support for Zstd compression via new --compalgo option
1 parent 6840502 commit 1d7efae

File tree

1 file changed

+46
-5
lines changed

1 file changed

+46
-5
lines changed

mkclean/mkclean.c

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1424,7 +1424,7 @@ static bool_t BlockIsCompressed(const matroska_block *Block)
14241424
return 1; // we don't support encryption
14251425

14261426
Elt = (ebml_master*)EBML_MasterGetChild(Elt, MATROSKA_getContextContentCompAlgo(), DstProfile);
1427-
if (Elt!=NULL && EBML_IntegerValue((ebml_integer*)Elt)==MATROSKA_TRACK_ENCODING_COMP_ZLIB)
1427+
if (Elt!=NULL && (EBML_IntegerValue((ebml_integer*)Elt)!=MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP))
14281428
return 1;
14291429
}
14301430
}
@@ -1517,6 +1517,7 @@ int main(int argc, const char *argv[])
15171517
mkv_timestamp_t PrevTimestamp;
15181518
bool_t CuesChanged;
15191519
bool_t KeepCues = 0, Remux = 0, CuesCreated = 0, Optimize = 0, OptimizeVideo = 1, UnOptimize = 0, ClustersNeedRead = 0, Regression = 0;
1520+
MatroskaTrackEncodingCompAlgo CompressionAlgo = MATROSKA_TRACK_ENCODING_COMP_NONE;
15201521
int InputPathIndex = 1;
15211522
int64_t TimestampScale = 0, OldTimestampScale;
15221523
size_t MaxTrackNum = 0;
@@ -1623,6 +1624,26 @@ int main(int argc, const char *argv[])
16231624
else if (tcsisame_ascii(Path,T("--unsafe"))) { Unsafe = 1; InputPathIndex = i+1; }
16241625
else if (tcsisame_ascii(Path,T("--optimize"))) { Optimize = 1; OptimizeVideo = 1; InputPathIndex = i+1; }
16251626
else if (tcsisame_ascii(Path,T("--optimize_nv"))) { Optimize = 1; OptimizeVideo = 0; InputPathIndex = i+1; }
1627+
else if (tcsisame_ascii(Path,T("--compalgo")) && i+1<argc-1)
1628+
{
1629+
#if defined(TARGET_WIN) && defined(UNICODE)
1630+
Node_FromWcs(&p,Path,TSIZEOF(Path),argv[++i]);
1631+
#else
1632+
Node_FromStr(&p,Path,TSIZEOF(Path),argv[++i]);
1633+
#endif
1634+
if (tcsisame_ascii(Path,T("0")))
1635+
CompressionAlgo = MATROSKA_TRACK_ENCODING_COMP_ZLIB;
1636+
else if (tcsisame_ascii(Path,T("4")))
1637+
CompressionAlgo = MATROSKA_TRACK_ENCODING_COMP_ZSTD;
1638+
else
1639+
{
1640+
TextPrintf(StdErr,T("Unsupported compression algorithm %s (0: zlib, 4: Zstd)\r\n"),Path);
1641+
Path[0] = 0;
1642+
Result = -8;
1643+
goto exit;
1644+
}
1645+
InputPathIndex = i+1;
1646+
}
16261647
else if (tcsisame_ascii(Path,T("--regression"))) { Regression = 1; InputPathIndex = i+1; }
16271648
else if (tcsisame_ascii(Path,T("--no-optimize"))) { UnOptimize = 1; InputPathIndex = i+1; }
16281649
else if (tcsisame_ascii(Path,T("--quiet"))) { Quiet = 1; InputPathIndex = i+1; }
@@ -1650,6 +1671,7 @@ int main(int argc, const char *argv[])
16501671
TextWrite(StdErr,T(" --live the output file resembles a live stream\r\n"));
16511672
TextWrite(StdErr,T(" --timecodescale <v> force the global TimestampScale to <v> (1000000 is a good value)\r\n"));
16521673
TextWrite(StdErr,T(" --unsafe don't output elements that are used for file recovery (saves more space)\r\n"));
1674+
TextWrite(StdErr,T(" --compalgo <v> force compression algorithm of all tracks\r\n"));
16531675
TextWrite(StdErr,T(" --optimize use all possible optimization for the output file\r\n"));
16541676
TextWrite(StdErr,T(" --optimize_nv use all possible optimization for the output file, except video tracks\r\n"));
16551677
TextWrite(StdErr,T(" --no-optimize disable some optimization for the output file\r\n"));
@@ -2772,7 +2794,9 @@ int main(int argc, const char *argv[])
27722794
{
27732795
Elt = EBML_MasterFindFirstElt(RLevel1,MATROSKA_getContextCodecID(),1,0,0);
27742796
EBML_StringGet((ebml_string*)Elt,CodecID,TSIZEOF(CodecID));
2775-
if (tcsisame_ascii(CodecID,T("S_USF")) || tcsisame_ascii(CodecID,T("S_VOBSUB")) || tcsisame_ascii(CodecID,T("S_HDMV/PGS")) || tcsisame_ascii(CodecID,T("B_VOBBTN"))
2797+
if (CompressionAlgo != MATROSKA_TRACK_ENCODING_COMP_NONE)
2798+
encoding = CompressionAlgo;
2799+
else if (tcsisame_ascii(CodecID,T("S_USF")) || tcsisame_ascii(CodecID,T("S_VOBSUB")) || tcsisame_ascii(CodecID,T("S_HDMV/PGS")) || tcsisame_ascii(CodecID,T("B_VOBBTN"))
27762800
|| tcsisame_ascii(CodecID,T("V_UNCOMPRESSED"))|| tcsstr(CodecID,T("A_PCM"))==CodecID)
27772801
encoding = MATROSKA_TRACK_ENCODING_COMP_ZLIB;
27782802
else
@@ -2809,13 +2833,24 @@ int main(int argc, const char *argv[])
28092833
if (CodecPrivate!=NULL)
28102834
{
28112835
size_t ExtraCompHeaderBytes = (encoding == MATROSKA_TRACK_ENCODING_COMP_NONE) ? 13 : 3; // extra bytes needed to add the comp header to the track
2836+
if (CompressionAlgo != MATROSKA_TRACK_ENCODING_COMP_ZLIB)
2837+
ExtraCompHeaderBytes += 1; // extra for the non default algo
28122838
size_t CompressedSize = (size_t)EBML_ElementDataSize((ebml_element*)CodecPrivate, 1);
28132839
size_t origCompressedSize = CompressedSize;
28142840
uint8_t *Compressed = malloc(CompressedSize);
2815-
if (CompressFrameZLib(EBML_BinaryGetData(CodecPrivate), origCompressedSize, &Compressed, &CompressedSize)==ERR_NONE
2816-
&& (CompressedSize + ExtraCompHeaderBytes) < origCompressedSize)
2841+
uint8_t *NewCompressed = Compressed;
2842+
int comp_err;
2843+
if (CompressionAlgo == MATROSKA_TRACK_ENCODING_COMP_ZSTD)
2844+
{
2845+
comp_err = CompressFrameZstd(EBML_BinaryGetData(CodecPrivate), origCompressedSize, &NewCompressed, &CompressedSize);
2846+
}
2847+
else
28172848
{
2818-
encoding = MATROSKA_TRACK_ENCODING_COMP_ZLIB;
2849+
comp_err = CompressFrameZLib(EBML_BinaryGetData(CodecPrivate), origCompressedSize, &NewCompressed, &CompressedSize);
2850+
}
2851+
if (comp_err==ERR_NONE && (CompressedSize + ExtraCompHeaderBytes) < origCompressedSize)
2852+
{
2853+
encoding = CompressionAlgo;
28192854
compress_scope |= MATROSKA_CONTENTENCODINGSCOPE_PRIVATE;
28202855
}
28212856
free(Compressed);
@@ -2830,6 +2865,12 @@ int main(int argc, const char *argv[])
28302865
if (MATROSKA_TrackSetCompressionAlgo((matroska_trackentry*)RLevel1, compress_scope,DstProfile, MATROSKA_TRACK_ENCODING_COMP_ZLIB))
28312866
ClustersNeedRead = 1;
28322867
break;
2868+
#if defined(CONFIG_ZSTD)
2869+
case MATROSKA_TRACK_ENCODING_COMP_ZSTD:
2870+
if (MATROSKA_TrackSetCompressionAlgo((matroska_trackentry*)RLevel1, compress_scope,DstProfile, MATROSKA_TRACK_ENCODING_COMP_ZSTD))
2871+
ClustersNeedRead = 1;
2872+
break;
2873+
#endif
28332874
case MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP:
28342875
if (!HeaderData || MATROSKA_TrackSetCompressionHeader((matroska_trackentry*)RLevel1, ARRAYBEGIN(*HeaderData,uint8_t), ARRAYCOUNT(*HeaderData,uint8_t), DstProfile))
28352876
ClustersNeedRead = 1;

0 commit comments

Comments
 (0)