fix: prevent infinite loop when processing TS files with no subtitles
Problem: When processing TS files containing no subtitles, ccextractor enters an infinite loop and floods the terminal with binary output instead of exiting gracefully (Issue #1754).
Root Cause:
The ts_readstream function in ts_functions.c had a do-while (!gotpes) loop that would run indefinitely when no subtitle streams were detected, because gotpes never became true in files without subtitles.
Solution:
- Added a packet counter to track how many packets have been processed
- Set a reasonable limit (50,000 packets) after which processing stops if no subtitles are found
- Added
subtitle_foundflag that gets set when actual caption data is processed - Clean exit with debug message when no subtitles are detected
Changes Made:
-
src/lib_ccx/ts_functions.c: Added termination condition ints_readstreamfunction
Testing
- ✅ Code compiles successfully without errors
- ✅ Basic functionality verified (version, help commands work)
- ✅ Error handling works properly
- ✅ The fix maintains backward compatibility for files with subtitles
Fixes #1754
Why would no subtitles cause an infinite loop? Do you have an example file?
I don't like the heuristics solution TBH.
Example TS file (no subtitles): no_subs.ts This is a valid MPEG-TS containing video + audio only, with no subtitle streams Verified via: ffprobe no_subs.ts | grep -i subtitle (no output)
A hard packet limit is not ideal and was added only as a safeguard to prevent the infinite loop. The fix can instead terminate cleanly based on EOF / PMT parsing when no subtitle streams exist
CCExtractor CI platform finished running the test files on linux. Below is a summary of the test results, when compared to test for commit 0b3ad40...:
| Report Name | Tests Passed |
| Broken | 3/13 |
| CEA-708 | 13/14 |
| DVB | 4/7 |
| DVD | 0/3 |
| DVR-MS | 2/2 |
| General | 5/27 |
| Hardsubx | 0/1 |
| Hauppage | 0/3 |
| MP4 | 3/3 |
| NoCC | 10/10 |
| Options | 62/86 |
| Teletext | 1/21 |
| WTV | 0/13 |
| XDS | 25/34 |
Your PR breaks these cases:
- ccextractor --autoprogram --out=ttxt --latin1 --ucla --xds 8e8229b88b...
- ccextractor --autoprogram --out=ttxt --latin1 7236304cfc...
- ccextractor --out=srt --latin1 06b3a9237d...
- ccextractor --out=srt --latin1 83f8cceb74...
- ccextractor --out=srt --latin1 611b4a9235...
- ccextractor --out=srt --latin1 b46e9e8e3f...
- ccextractor --out=srt --latin1 89e417e622...
- ccextractor --out=srt --latin1 d59eadc4ed...
- ccextractor --out=sami --latin1 --autoprogram --no-goptime 5b4e0a6034...
- ccextractor --service 1 --out=ttxt da904de35d...
- ccextractor --autoprogram --out=srt --latin1 --quant 0 85271be4d2...
- ccextractor --autoprogram --out=ttxt --latin1 5ae2007a79...
- ccextractor --autoprogram --out=ttxt --latin1 1e44efd810...
- ccextractor --autoprogram --out=ttxt --latin1 add511677c...
- ccextractor --autoprogram --out=ttxt --latin1 9a496d3828...
- ccextractor --out=srt --latin1 --autoprogram 56c9f34548...
- ccextractor --autoprogram --out=srt --latin1 e9b9008fdf...
- ccextractor --autoprogram --out=ttxt --latin1 c032183ef0...
- ccextractor --autoprogram --out=ttxt --latin1 d037c7509e...
- ccextractor --autoprogram --out=ttxt --latin1 1974a299f0...
- ccextractor --autoprogram --out=ttxt --latin1 132d7df7e9...
- ccextractor --autoprogram --out=ttxt --latin1 99e5eaafdc...
- ccextractor --autoprogram --out=srt --latin1 b22260d065...
- ccextractor --autoprogram --out=ttxt --latin1 --ucla 7aad20907e...
- ccextractor --autoprogram --out=ttxt --latin1 --ucla c41f73056a...
- ccextractor --autoprogram --out=ttxt --latin1 --ucla 5d3a29f9f8...
- ccextractor --autoprogram --out=ttxt --latin1 --ucla 70000200c0...
- ccextractor --autoprogram --out=ttxt --latin1 --ucla 6dc772d881...
- ccextractor --autoprogram --out=ttxt --latin1 --ucla dab1c1bd65...
- ccextractor --autoprogram --out=ttxt --latin1 --ucla adce82fd39...
- ccextractor --autoprogram --out=ttxt --latin1 01509e4d27...
- ccextractor --autoprogram --out=ttxt --latin1 --ucla ab9cf8cfad...
- ccextractor --autoprogram --out=ttxt --latin1 --ucla --output-field 2 5d3a29f9f8...
- ccextractor --autoprogram --out=ttxt --latin1 --ucla --output-field 2 c41f73056a...
- ccextractor --autoprogram --out=srt --latin1 --sentencecap c032183ef0...
- ccextractor --autoprogram --out=bin --latin1 c032183ef0...
- ccextractor --hardsubx 1a0302f7fd...
- ccextractor --hauppauge --autoprogram --out=srt --latin1 a03b5b2a56...
- ccextractor --autoprogram --out=srt --hauppauge --latin1 553d78e755...
- ccextractor --autoprogram --out=ttxt --hauppauge --ucla --latin1 553d78e755...
- ccextractor --out=txt c83f765c66...
- ccextractor --out=ttxt c83f765c66...
- ccextractor --out=spupng c83f765c66...
- ccextractor --goptime c83f765c66...
- ccextractor --unixts 5 --out=txt c83f765c66...
- ccextractor --out=txt --datets c83f765c66...
- ccextractor --out=txt --sects c83f765c66...
- ccextractor --out=txt --lf c83f765c66...
- ccextractor --in=es dc7169d7c4...
- ccextractor --in=wtv b46e9e8e3f...
- ccextractor --in=bin 988d4e8bba...
- ccextractor --wtvmpeg2 10f0f77cf4...
- ccextractor --startcreditstext "CCextractor Start crdit Testing" c4dd893cb9...
- ccextractor --startcreditsnotbefore 1 --startcreditstext "CCextractor Start crdit Testing" c4dd893cb9...
- ccextractor --startcreditsnotafter 2 --startcreditstext "CCextractor Start crdit Testing" c4dd893cb9...
- ccextractor --startcreditsforatleast 1 --startcreditstext "CCextractor Start crdit Testing" c4dd893cb9...
- ccextractor --startcreditsforatmost 2 --startcreditstext "CCextractor Start crdit Testing" c4dd893cb9...
- ccextractor --endcreditstext "CCextractor Ends crdit Testing" addf5e2fc9...
- ccextractor --endcreditsforatleast 3 --endcreditstext "CCextractor Ends crdit Testing" addf5e2fc9...
- ccextractor --endcreditsforatmost 2 --endcreditstext "CCextractor Ends crdit Testing" addf5e2fc9...
- ccextractor --out=srt --latin1 f23a544ba8...
- ccextractor --out=srt --latin1 97cc394d87...
- ccextractor --out=srt --latin1 10f0f77cf4...
- ccextractor --out=srt --latin1 df3b4d62d3...
- ccextractor --out=srt --latin1 d7e7dbdf68...
- ccextractor --out=srt --latin1 76734ac4a7...
- ccextractor --out=srt --latin1 c791382c94...
- ccextractor --out=srt --latin1 f673b2f916...
- ccextractor --out=srt --latin1 da75bdee47...
- ccextractor --out=srt --latin1 bd6f33a669...
- ccextractor --out=srt --latin1 0e5e6b26be...
- ccextractor --out=srt --latin1 a226cc302d...
- ccextractor --out=srt --latin1 ae6327683e...
- ccextractor --autoprogram --out=ttxt --latin1 --ucla --xds 725a49f871...
- ccextractor --autoprogram --out=ttxt --latin1 --xds --ucla c813e713a0...
- ccextractor --autoprogram --out=ttxt --latin1 --ucla --xds b992e0cccb...
- ccextractor --autoprogram --out=ttxt --latin1 --ucla --xds d0291cdcf6...
- ccextractor --autoprogram --out=ttxt --latin1 --ucla --xds c8dc039a88...
- ccextractor --autoprogram --out=srt --latin1 --ucla 53339f3455...
- ccextractor --autoprogram --out=ttxt --latin1 --ucla --xds 83b03036a2...
- ccextractor --autoprogram --out=ttxt --latin1 --ucla --xds 7d3f25c32c...
- ccextractor --autoprogram --out=srt --latin1 --ucla 7d3f25c32c...
NOTE: The following tests have been failing on the master branch as well as the PR:
- ccextractor --out=srt --latin1 --autoprogram 73d9313d64..., Last passed:
- ccextractor --autoprogram --out=srt --latin1 f1422b8bfe..., Last passed:
- ccextractor --datapid 5603 --autoprogram --out=srt --latin1 --teletext 85c7fc1ad7..., Last passed:
- ccextractor --tpage 801 4e56e88ba4..., Last passed:
- ccextractor --tverbose 4e56e88ba4..., Last passed:
- ccextractor --teletext 4e56e88ba4..., Last passed:
- ccextractor --xmltv=3 --out=null 96efd279cf..., Last passed:
- ccextractor --datapid 2310 --autoprogram --out=srt --latin1 e639e54550..., Last passed:
- ccextractor --autoprogram --out=srt --latin1 4e56e88ba4..., Last passed:
- ccextractor --autoprogram --out=ttxt --latin1 c0d2fba8c0..., Last passed:
- ccextractor --autoprogram --out=ttxt --latin1 006fdc391a..., Last passed:
- ccextractor --autoprogram --out=ttxt --latin1 e92a1d4d2a..., Last passed:
- ccextractor --autoprogram --out=ttxt --latin1 b37ce60eb9..., Last passed:
- ccextractor --autoprogram --out=ttxt --latin1 7e4ebf7fd7..., Last passed:
- ccextractor --autoprogram --out=ttxt --latin1 9256a60e4b..., Last passed:
- ccextractor --autoprogram --out=ttxt --latin1 27d7a43dd6..., Last passed:
- ccextractor --autoprogram --out=ttxt --latin1 297a44921a..., Last passed:
- ccextractor --autoprogram --out=ttxt --latin1 efbe129086..., Last passed:
- ccextractor --autoprogram --out=ttxt --latin1 eae0077731..., Last passed:
- ccextractor --autoprogram --out=ttxt --latin1 e2e2b501e0..., Last passed:
- ccextractor --autoprogram --out=ttxt --latin1 8c1615c1a8..., Last passed:
- ccextractor --autoprogram --out=ttxt --latin1 c6407fb294..., Last passed:
- ccextractor --autoprogram --out=ttxt --latin1 --datets dcada745de..., Last passed:
- ccextractor --autoprogram --out=srt --latin1 --tpage 398 5d5838bde9..., Last passed:
- ccextractor --autoprogram --out=srt --latin1 --tpage 299 44c45593fb..., Last passed:
- ccextractor --autoprogram --out=srt --latin1 --tpage 299 b8c55aa2e9..., Last passed:
- ccextractor --autoprogram --out=srt --latin1 --teletext --tpage 398 3b276ad8bf..., Last passed:
It seems that not all tests were passed completely. This is an indication that the output of some files is not as expected (but might be according to you).
Check the result page for more info.
CCExtractor CI platform finished running the test files on windows. Below is a summary of the test results, when compared to test for commit f6cb862...:
| Report Name | Tests Passed |
| Broken | 12/13 |
| CEA-708 | 14/14 |
| DVB | 5/7 |
| DVD | 3/3 |
| DVR-MS | 2/2 |
| General | 27/27 |
| Hardsubx | 0/1 |
| Hauppage | 3/3 |
| MP4 | 3/3 |
| NoCC | 10/10 |
| Options | 75/86 |
| Teletext | 1/21 |
| WTV | 13/13 |
| XDS | 34/34 |
Your PR breaks these cases:
- ccextractor --out=txt c83f765c66...
- ccextractor --out=spupng c83f765c66...
- ccextractor --unixts 5 --out=txt c83f765c66...
- ccextractor --out=txt --datets c83f765c66...
- ccextractor --out=txt --sects c83f765c66...
- ccextractor --out=txt --lf c83f765c66...
NOTE: The following tests have been failing on the master branch as well as the PR:
- ccextractor --out=srt --latin1 --autoprogram 73d9313d64..., Last passed:
- ccextractor --autoprogram --out=srt --latin1 f1422b8bfe..., Last passed:
- ccextractor --datapid 5603 --autoprogram --out=srt --latin1 --teletext 85c7fc1ad7..., Last passed:
- ccextractor --hardsubx 1a0302f7fd..., Last passed:
- ccextractor --in=bin 988d4e8bba..., Last passed:
- ccextractor --tpage 801 4e56e88ba4..., Last passed:
- ccextractor --tverbose 4e56e88ba4..., Last passed:
- ccextractor --teletext 4e56e88ba4..., Last passed:
- ccextractor --xmltv=3 --out=null 96efd279cf..., Last passed:
- ccextractor --datapid 2310 --autoprogram --out=srt --latin1 e639e54550..., Last passed:
- ccextractor --autoprogram --out=srt --latin1 4e56e88ba4..., Last passed:
- ccextractor --autoprogram --out=ttxt --latin1 c0d2fba8c0..., Last passed:
- ccextractor --autoprogram --out=ttxt --latin1 006fdc391a..., Last passed:
- ccextractor --autoprogram --out=ttxt --latin1 e92a1d4d2a..., Last passed:
- ccextractor --autoprogram --out=ttxt --latin1 b37ce60eb9..., Last passed:
- ccextractor --autoprogram --out=ttxt --latin1 7e4ebf7fd7..., Last passed:
- ccextractor --autoprogram --out=ttxt --latin1 9256a60e4b..., Last passed:
- ccextractor --autoprogram --out=ttxt --latin1 27d7a43dd6..., Last passed:
- ccextractor --autoprogram --out=ttxt --latin1 297a44921a..., Last passed:
- ccextractor --autoprogram --out=ttxt --latin1 efbe129086..., Last passed:
- ccextractor --autoprogram --out=ttxt --latin1 eae0077731..., Last passed:
- ccextractor --autoprogram --out=ttxt --latin1 e2e2b501e0..., Last passed:
- ccextractor --autoprogram --out=ttxt --latin1 8c1615c1a8..., Last passed:
- ccextractor --autoprogram --out=ttxt --latin1 c6407fb294..., Last passed:
- ccextractor --autoprogram --out=srt --latin1 --tpage 398 5d5838bde9..., Last passed:
- ccextractor --autoprogram --out=srt --latin1 --tpage 299 44c45593fb..., Last passed:
- ccextractor --autoprogram --out=srt --latin1 --tpage 299 b8c55aa2e9..., Last passed:
- ccextractor --autoprogram --out=srt --latin1 --teletext --tpage 398 3b276ad8bf..., Last passed:
- ccextractor --autoprogram --out=ttxt --latin1 b236a0590b..., Last passed:
Congratulations: Merging this PR would fix the following tests:
- ccextractor --autoprogram --out=ttxt --latin1 --ucla --xds 8e8229b88b..., Last passed: Never
- ccextractor --autoprogram --out=ttxt --latin1 7236304cfc..., Last passed: Never
- ccextractor --out=srt --latin1 06b3a9237d..., Last passed: Never
- ccextractor --out=srt --latin1 83f8cceb74..., Last passed: Never
- ccextractor --out=srt --latin1 611b4a9235..., Last passed: Never
- ccextractor --out=srt --latin1 b46e9e8e3f..., Last passed: Never
- ccextractor --out=srt --latin1 89e417e622..., Last passed: Never
- ccextractor --out=srt --latin1 d59eadc4ed..., Last passed: Never
- ccextractor --out=sami --latin1 --autoprogram --no-goptime 5b4e0a6034..., Last passed: Never
- ccextractor --service 1 --out=ttxt da904de35d..., Last passed: Never
- ccextractor --autoprogram --out=srt --latin1 --quant 0 85271be4d2..., Last passed: Never
- ccextractor --autoprogram --out=ttxt --latin1 5ae2007a79..., Last passed: Never
- ccextractor --autoprogram --out=ttxt --latin1 1e44efd810..., Last passed: Never
- ccextractor --autoprogram --out=ttxt --latin1 add511677c..., Last passed: Never
- ccextractor --autoprogram --out=ttxt --latin1 9a496d3828..., Last passed: Never
- ccextractor --out=srt --latin1 --autoprogram 56c9f34548..., Last passed: Never
- ccextractor --autoprogram --out=srt --latin1 e9b9008fdf..., Last passed: Never
- ccextractor --autoprogram --out=ttxt --latin1 c032183ef0..., Last passed: Never
- ccextractor --autoprogram --out=ttxt --latin1 d037c7509e..., Last passed: Never
- ccextractor --autoprogram --out=ttxt --latin1 1974a299f0..., Last passed: Never
- ccextractor --autoprogram --out=ttxt --latin1 132d7df7e9..., Last passed: Never
- ccextractor --autoprogram --out=ttxt --latin1 99e5eaafdc..., Last passed: Never
- ccextractor --autoprogram --out=srt --latin1 b22260d065..., Last passed: Never
- ccextractor --autoprogram --out=ttxt --latin1 --ucla 7aad20907e..., Last passed: Never
- ccextractor --autoprogram --out=ttxt --latin1 --ucla c41f73056a..., Last passed: Never
- ccextractor --autoprogram --out=ttxt --latin1 --ucla 5d3a29f9f8..., Last passed: Never
- ccextractor --autoprogram --out=ttxt --latin1 --ucla 70000200c0..., Last passed: Never
- ccextractor --autoprogram --out=ttxt --latin1 --ucla 6dc772d881..., Last passed: Never
- ccextractor --autoprogram --out=ttxt --latin1 --ucla dab1c1bd65..., Last passed: Never
- ccextractor --autoprogram --out=ttxt --latin1 --ucla adce82fd39..., Last passed: Never
- ccextractor --autoprogram --out=ttxt --latin1 01509e4d27..., Last passed: Never
- ccextractor --autoprogram --out=ttxt --latin1 --ucla ab9cf8cfad..., Last passed: Never
- ccextractor --autoprogram --out=ttxt --latin1 --ucla --output-field 2 5d3a29f9f8..., Last passed: Never
- ccextractor --autoprogram --out=ttxt --latin1 --ucla --output-field 2 c41f73056a..., Last passed: Never
- ccextractor --autoprogram --out=srt --latin1 --sentencecap c032183ef0..., Last passed: Never
- ccextractor --autoprogram --out=bin --latin1 c032183ef0..., Last passed: Never
- ccextractor --hauppauge --autoprogram --out=srt --latin1 a03b5b2a56..., Last passed: Never
- ccextractor --autoprogram --out=srt --hauppauge --latin1 553d78e755..., Last passed: Never
- ccextractor --autoprogram --out=ttxt --hauppauge --ucla --latin1 553d78e755..., Last passed: Never
- ccextractor --out=ttxt c83f765c66..., Last passed: Never
- ccextractor --goptime c83f765c66..., Last passed: Never
- ccextractor --in=es dc7169d7c4..., Last passed: Never
- ccextractor --in=wtv b46e9e8e3f..., Last passed: Never
- ccextractor --wtvmpeg2 10f0f77cf4..., Last passed: Never
- ccextractor --startcreditstext "CCextractor Start crdit Testing" c4dd893cb9..., Last passed: Never
- ccextractor --startcreditsnotbefore 1 --startcreditstext "CCextractor Start crdit Testing" c4dd893cb9..., Last passed: Never
- ccextractor --startcreditsnotafter 2 --startcreditstext "CCextractor Start crdit Testing" c4dd893cb9..., Last passed: Never
- ccextractor --startcreditsforatleast 1 --startcreditstext "CCextractor Start crdit Testing" c4dd893cb9..., Last passed: Never
- ccextractor --startcreditsforatmost 2 --startcreditstext "CCextractor Start crdit Testing" c4dd893cb9..., Last passed: Never
- ccextractor --endcreditstext "CCextractor Ends crdit Testing" addf5e2fc9..., Last passed: Never
- ccextractor --endcreditsforatleast 3 --endcreditstext "CCextractor Ends crdit Testing" addf5e2fc9..., Last passed: Never
- ccextractor --endcreditsforatmost 2 --endcreditstext "CCextractor Ends crdit Testing" addf5e2fc9..., Last passed: Never
- ccextractor --autoprogram --out=ttxt --latin1 --datets dcada745de..., Last passed: Never
- ccextractor --out=srt --latin1 f23a544ba8..., Last passed: Never
- ccextractor --out=srt --latin1 97cc394d87..., Last passed: Never
- ccextractor --out=srt --latin1 10f0f77cf4..., Last passed: Never
- ccextractor --out=srt --latin1 df3b4d62d3..., Last passed: Never
- ccextractor --out=srt --latin1 d7e7dbdf68..., Last passed: Never
- ccextractor --out=srt --latin1 76734ac4a7..., Last passed: Never
- ccextractor --out=srt --latin1 c791382c94..., Last passed: Never
- ccextractor --out=srt --latin1 f673b2f916..., Last passed: Never
- ccextractor --out=srt --latin1 da75bdee47..., Last passed: Never
- ccextractor --out=srt --latin1 bd6f33a669..., Last passed: Never
- ccextractor --out=srt --latin1 0e5e6b26be..., Last passed: Never
- ccextractor --out=srt --latin1 a226cc302d..., Last passed: Never
- ccextractor --out=srt --latin1 ae6327683e..., Last passed: Never
- ccextractor --autoprogram --out=ttxt --latin1 --ucla --xds 725a49f871..., Last passed: Never
- ccextractor --autoprogram --out=ttxt --latin1 --xds --ucla c813e713a0..., Last passed: Never
- ccextractor --autoprogram --out=ttxt --latin1 --ucla --xds b992e0cccb..., Last passed: Never
- ccextractor --autoprogram --out=ttxt --latin1 --ucla --xds d0291cdcf6..., Last passed: Never
- ccextractor --autoprogram --out=ttxt --latin1 --ucla --xds c8dc039a88..., Last passed: Never
- ccextractor --autoprogram --out=srt --latin1 --ucla 53339f3455..., Last passed: Never
- ccextractor --autoprogram --out=ttxt --latin1 --ucla --xds 83b03036a2..., Last passed: Never
- ccextractor --autoprogram --out=ttxt --latin1 --ucla --xds 7d3f25c32c..., Last passed: Never
- ccextractor --autoprogram --out=srt --latin1 --ucla 7d3f25c32c..., Last passed: Never
It seems that not all tests were passed completely. This is an indication that the output of some files is not as expected (but might be according to you).
Check the result page for more info.
What's the root cause of the problem? what is subtitles begin half way through the video (e.g. when a new segment or show starts)?