Compare commits
305 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
97b381a2b0 | ||
|
|
03b0749e91 | ||
|
|
7bcdd6729f | ||
|
|
3dd3d5f6aa | ||
|
|
ba37cc41c8 | ||
|
|
6efa41a7e6 | ||
|
|
9b90c91f07 | ||
|
|
35936618e3 | ||
|
|
e98a584e98 | ||
|
|
1a8c8a86f3 | ||
|
|
57663b8cf1 | ||
|
|
2b3d759e20 | ||
|
|
ed1b5dddce | ||
|
|
86fede6af8 | ||
|
|
68e6390c76 | ||
|
|
0ebeec4183 | ||
|
|
8c10ded107 | ||
|
|
3a1851f904 | ||
|
|
50aceb45fb | ||
|
|
cad6b0495c | ||
|
|
c7ebd45d9f | ||
|
|
77abe01885 | ||
|
|
98cec31516 | ||
|
|
46b145a396 | ||
|
|
ccf2a031e9 | ||
|
|
9784cd5bd1 | ||
|
|
5d8dc3b9eb | ||
|
|
a42e847bcb | ||
|
|
b7a1dd1030 | ||
|
|
b18e696c85 | ||
|
|
d58f078c38 | ||
|
|
0bbdfc13ee | ||
|
|
5127da50d1 | ||
|
|
352f035214 | ||
|
|
f04ba8d0c4 | ||
|
|
1ea94d0b14 | ||
|
|
7f99603859 | ||
|
|
3713283dfc | ||
|
|
09129f1e63 | ||
|
|
c56840ff2c | ||
|
|
2a34bd99e6 | ||
|
|
c7886ed615 | ||
|
|
948531a4be | ||
|
|
022987c804 | ||
|
|
db6c852fae | ||
|
|
b793f16343 | ||
|
|
ceaaa65a26 | ||
|
|
1d7589e653 | ||
|
|
e09abe7a83 | ||
|
|
e86e8692a8 | ||
|
|
961bfda727 | ||
|
|
8218d5ff73 | ||
|
|
5850ef073d | ||
|
|
7347440277 | ||
|
|
4007198342 | ||
|
|
c09524d043 | ||
|
|
d81c692bbb | ||
|
|
6d366bfdc6 | ||
|
|
ceb0110378 | ||
|
|
f06436c1fe | ||
|
|
67e15aaf80 | ||
|
|
5b29ef281a | ||
|
|
24b90970c7 | ||
|
|
84e6891922 | ||
|
|
0dcdf72042 | ||
|
|
e3b939baad | ||
|
|
0e5910ebee | ||
|
|
8a81a57a24 | ||
|
|
02d84d27d0 | ||
|
|
a2af0d7044 | ||
|
|
4f5bd7bf37 | ||
|
|
91ef488dff | ||
|
|
1af107aef8 | ||
|
|
9a60796674 | ||
|
|
7f4acae74b | ||
|
|
fa8b0a3023 | ||
|
|
acb55470f6 | ||
|
|
97da554da6 | ||
|
|
a121823adc | ||
|
|
cb85740690 | ||
|
|
e91a13bb60 | ||
|
|
a063be996b | ||
|
|
19da837232 | ||
|
|
22a494d834 | ||
|
|
2e68e9f600 | ||
|
|
b1c22e5034 | ||
|
|
e3c54327e8 | ||
|
|
9e62f8c557 | ||
|
|
6216247ecb | ||
|
|
082100a0d4 | ||
|
|
cf828471d6 | ||
|
|
cf84757e02 | ||
|
|
f486efbb57 | ||
|
|
0db5b0c838 | ||
|
|
e411a75dcd | ||
|
|
33ecccedce | ||
|
|
28dd35b040 | ||
|
|
e82a492c94 | ||
|
|
4509b9daf5 | ||
|
|
d330b78f37 | ||
|
|
ab89f88aea | ||
|
|
0227c2787a | ||
|
|
84dec36845 | ||
|
|
b4f692807a | ||
|
|
1f5ec6cd8d | ||
|
|
6f375cd9b3 | ||
|
|
e959654c6f | ||
|
|
18484d555f | ||
|
|
1534d81ae7 | ||
|
|
84b5df2713 | ||
|
|
8e729cc62c | ||
|
|
0f1f4d889f | ||
|
|
487b521c9b | ||
|
|
1aed90e42c | ||
|
|
e2d387bfa9 | ||
|
|
b974a7ed81 | ||
|
|
522ebae65e | ||
|
|
1b17a04b25 | ||
|
|
588c4a8187 | ||
|
|
88830e6c58 | ||
|
|
db646f50ac | ||
|
|
b1c9540085 | ||
|
|
e98137e059 | ||
|
|
3c37d49764 | ||
|
|
a8d6b81baf | ||
|
|
b8321cac0f | ||
|
|
6697ed3496 | ||
|
|
722d52420c | ||
|
|
af6d8282cb | ||
|
|
732b20aefa | ||
|
|
54318d0402 | ||
|
|
5f61fae0c7 | ||
|
|
0afba56a26 | ||
|
|
0873953d9f | ||
|
|
75af5f2e8c | ||
|
|
8d8dc9ccc2 | ||
|
|
e37a21aace | ||
|
|
40a603d366 | ||
|
|
c5bed1e3b2 | ||
|
|
8db3398eb7 | ||
|
|
7b038ab649 | ||
|
|
7d0c2ede26 | ||
|
|
60773bb859 | ||
|
|
a919ef4410 | ||
|
|
424e67f5f4 | ||
|
|
4097831b9b | ||
|
|
1764aa1f92 | ||
|
|
19de49763a | ||
|
|
a0b4e389f9 | ||
|
|
2281051d3d | ||
|
|
fc21280857 | ||
|
|
746806dcef | ||
|
|
812734fd2a | ||
|
|
66d59e498b | ||
|
|
5599ce9eaf | ||
|
|
2e2075ca52 | ||
|
|
c69d2db52b | ||
|
|
54ecce8b86 | ||
|
|
82b60988bb | ||
|
|
ab1af7c678 | ||
|
|
84ba7c5238 | ||
|
|
676be1f193 | ||
|
|
e8cb55e739 | ||
|
|
30613b224a | ||
|
|
19241744d7 | ||
|
|
27288ccf89 | ||
|
|
34282c17b8 | ||
|
|
227f149670 | ||
|
|
27477e9f7c | ||
|
|
b3018e083e | ||
|
|
96de55429d | ||
|
|
863eacc440 | ||
|
|
78249045f8 | ||
|
|
dad108b7e1 | ||
|
|
79f18b996b | ||
|
|
987c5cd301 | ||
|
|
34d0df1d96 | ||
|
|
1db731a7a8 | ||
|
|
af67596e66 | ||
|
|
86f98ddf5f | ||
|
|
bba6c4fcfd | ||
|
|
af64fa8a3d | ||
|
|
e1d3060232 | ||
|
|
3a1815163f | ||
|
|
0954b47a24 | ||
|
|
594a83cc4e | ||
|
|
ecec3ea22b | ||
|
|
f9cfc7219d | ||
|
|
c854d25963 | ||
|
|
4fe32b1482 | ||
|
|
5fcb31d279 | ||
|
|
b2d3a2fefc | ||
|
|
70ac7f9a40 | ||
|
|
f739d54cbc | ||
|
|
fc78fc3192 | ||
|
|
b0e5eb03e1 | ||
|
|
84cff4d6d8 | ||
|
|
e5575a0f50 | ||
|
|
f4961a0bd8 | ||
|
|
e3e810f34e | ||
|
|
57eb1795aa | ||
|
|
37e4d4163f | ||
|
|
59a8c7a049 | ||
|
|
8ef89f6bf1 | ||
|
|
2739602575 | ||
|
|
a7d2264cc1 | ||
|
|
7d8499a7fb | ||
|
|
99a12b8737 | ||
|
|
5b29db341f | ||
|
|
777ce98aa5 | ||
|
|
fe9c94d50c | ||
|
|
6d074928b6 | ||
|
|
1e32bee8e5 | ||
|
|
6281e128aa | ||
|
|
c1c0627dab | ||
|
|
9cfc345041 | ||
|
|
f3a72bff3d | ||
|
|
e906585287 | ||
|
|
b27c6fe415 | ||
|
|
5e888ee895 | ||
|
|
c9f55f5a39 | ||
|
|
1e9939bc8a | ||
|
|
df66746e89 | ||
|
|
5dac23f156 | ||
|
|
a3148f07ac | ||
|
|
75e21feee3 | ||
|
|
334a87aed1 | ||
|
|
ee3418cd60 | ||
|
|
b9ca8a1291 | ||
|
|
280b4308f7 | ||
|
|
45eec1c919 | ||
|
|
7ad5859629 | ||
|
|
bdfe4ca25b | ||
|
|
3020fd24e7 | ||
|
|
0f2a5b3b96 | ||
|
|
8fec59e753 | ||
|
|
7598225ee1 | ||
|
|
8a9d924fc1 | ||
|
|
2bcd993c0f | ||
|
|
e461c14b48 | ||
|
|
c9a6707fdc | ||
|
|
6cb70be4a4 | ||
|
|
403581462e | ||
|
|
9e212fa104 | ||
|
|
b6978f2fd8 | ||
|
|
513372978c | ||
|
|
de9b198496 | ||
|
|
dac9de4d67 | ||
|
|
d56728bd7f | ||
|
|
7fe8ab767c | ||
|
|
403d2fd8a4 | ||
|
|
a9c3207773 | ||
|
|
bf478c0ee2 | ||
|
|
324667b3e6 | ||
|
|
3ccb250d18 | ||
|
|
15b42e2d0c | ||
|
|
181b8650ab | ||
|
|
724d756aa6 | ||
|
|
2f096879d5 | ||
|
|
d3543ff1a2 | ||
|
|
17a6779146 | ||
|
|
116f308a0b | ||
|
|
414a57d97e | ||
|
|
6d7c60fe14 | ||
|
|
718cf55131 | ||
|
|
4d24568a0b | ||
|
|
ab4f3d0d26 | ||
|
|
9f308271b9 | ||
|
|
b2d97eb627 | ||
|
|
6209c63ccf | ||
|
|
fbf99e8a5e | ||
|
|
ebcd2bc9ca | ||
|
|
0b76cc1991 | ||
|
|
9c20e0afb1 | ||
|
|
74eefaeea7 | ||
|
|
5a8758fdd2 | ||
|
|
7b4bf0b15a | ||
|
|
be34781a64 | ||
|
|
e3c14991b3 | ||
|
|
38fc6e5623 | ||
|
|
5dbbe654f0 | ||
|
|
5df1dbb922 | ||
|
|
ef3d25c25b | ||
|
|
d22ab6f9a1 | ||
|
|
b8a15f6f9d | ||
|
|
ebf06a9c2b | ||
|
|
04abf755c2 | ||
|
|
a99bc37d88 | ||
|
|
1807ea9098 | ||
|
|
0b29fc2329 | ||
|
|
ced636025e | ||
|
|
3cfe406a79 | ||
|
|
23a745dcec | ||
|
|
03b1f5bfd2 | ||
|
|
b8c1499111 | ||
|
|
3189fc915e | ||
|
|
127756b838 | ||
|
|
e0b909a67e | ||
|
|
475865b3be | ||
|
|
3a6fd3450d | ||
|
|
81a00ddf55 | ||
|
|
4ff40f1be8 | ||
|
|
8861f7b40a | ||
|
|
96edd9031e | ||
|
|
edae5a3cea |
7
.clang-format
Normal file
@@ -0,0 +1,7 @@
|
||||
BreakBeforeBraces: Allman
|
||||
ColumnLimit: 0
|
||||
IndentCaseLabels: true
|
||||
IndentWidth: 8
|
||||
TabWidth: 8
|
||||
UseTab: Always
|
||||
SortIncludes: false
|
||||
49
.github/ISSUE_TEMPLATE.md
vendored
@@ -1,8 +1,28 @@
|
||||
Please prefix your issue with one of the following: [BUG], [PROPOSAL], [QUESTION].
|
||||
|
||||
CCExtractor version (using the --version parameter preferably) : **X.X**
|
||||
To get the version of CCExtractor, you can use `--version`.
|
||||
|
||||
**In raising this issue, I confirm the following (please check boxes, eg [X] - and delete unchecked ones):**
|
||||
If this issue is related to the flutter GUI, please make the issue on the GUI repo [here](https://github.com/CCExtractor/ccextractorfluttergui/issues/new)
|
||||
|
||||
Please check all that apply and **remove the ones that do not**.
|
||||
|
||||
In the necessary information section, if this is a regression (something that used to work does not work anymore), make sure to specify the last known working version.
|
||||
|
||||
Only specify the minimum number of arguments needed to reproduce the issue.
|
||||
|
||||
In the additional information section, describe your problem.
|
||||
|
||||
Please make the affected input file available for us (no screenshots, those don't help!). Public links to Dropbox, Google Drive, etc, are all fine. If it is not possible to make it available publicly, send us a private invitation (both Dropbox and Google Drive allow that). In this case we will download the file and upload it to the private developer repository. Methods to send the private invitation to us can be found [here](https://ccextractor.org/public:general:support#email).
|
||||
|
||||
Do **not** upload your file to any location that will require us to sign up or endure a wait list, slow downloads, etc. If your upload expires make sure you keep it active somehow (replace links if needed). Keep in mind that while we go over all tickets some may take a few days, and it's important we have the file available when we actually need it.
|
||||
|
||||
Make sure to enable notifications in GitHub so you get notifications about your ticket. We may need to ask questions and we do everything inside GitHub's system.
|
||||
|
||||
Once you have read all of the instructions **delete all the text from here to the top**.
|
||||
|
||||
CCExtractor version: {replace with the version}
|
||||
|
||||
# In raising this issue, I confirm the following:
|
||||
|
||||
- [ ] I have read and understood the [contributors guide](https://github.com/CCExtractor/ccextractor/blob/master/.github/CONTRIBUTING.md).
|
||||
- [ ] I have checked that the bug-fix I am reporting can be replicated, or that the feature I am suggesting isn't already present.
|
||||
@@ -10,27 +30,18 @@ CCExtractor version (using the --version parameter preferably) : **X.X**
|
||||
- [ ] I have checked that the issue I'm porting isn't already solved and no duplicates exist in [closed issues](https://github.com/CCExtractor/ccextractor/issues?q=is%3Aissue+is%3Aclosed) and in [opened issues](https://github.com/CCExtractor/ccextractor/issues)
|
||||
- [ ] I have checked the pull requests tab for existing solutions/implementations to my issue/suggestion.
|
||||
- [ ] I have used the latest available version of CCExtractor to verify this issue exists.
|
||||
- [ ] I have ticked all the boxes in this section and to prove it I'm deleting the section completely to remove boilerplate text.
|
||||
|
||||
**My familiarity with the project is as follows (check one, eg [X] - and delete unchecked ones):**
|
||||
# Necessary information
|
||||
|
||||
- [ ] I have never used CCExtractor.
|
||||
- [ ] I have used CCExtractor just a couple of times.
|
||||
- [ ] I absolutely love CCExtractor, but have not contributed previously.
|
||||
- [ ] I am an active contributor to CCExtractor.
|
||||
- Is this a regression (i.e. did it work before)? {YES/NO}
|
||||
- What platform did you use? {Window/Linux/Mac}
|
||||
- What were the used arguments? `{replace with the arguments}`
|
||||
|
||||
**Necessary information**
|
||||
- Is this a regression (did it work before)? [ ] NO | [ ] YES - *please specify the last known working version*
|
||||
- What platform did you use? [ ] Windows - [ ] Linux - [ ] Mac
|
||||
- What were the used arguments? `-autoprogram`
|
||||
# Video links
|
||||
|
||||
**Video links (replace text below with your links) **
|
||||
* {Replace with a link to a video file}
|
||||
|
||||
Please make the affected input file available for us (no screenshots, those don't help!). Public links to Dropbox, Google Drive, etc, are all fine. If it is not possible to make it available publicly, send us a private invitation (both Dropbox and Google Drive allow that). In this case we will download the file and upload it to the private developer repository.
|
||||
|
||||
Do *not* upload your file to any location that will require us to sign up or endure a wait list, slow downloads, etc. If your upload expires make sure you keep it active somehow (replace links if needed). Keep in mind that while we go over all tickets some may take a few days, and it's important we have the file available when we actually need it.
|
||||
|
||||
**Additional information**
|
||||
# Additional information
|
||||
|
||||
{issue content here, replace this line with your issue content}
|
||||
|
||||
PS: Make sure you set an alert in GitHub so you get notifications about your ticket. We may need to ask questions and we do everything inside GitHub's system.
|
||||
|
||||
3
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -1,4 +1,4 @@
|
||||
Please prefix your pull request with one of the following: **[FEATURE]** **[FIX]** **[IMPROVEMENT]**.
|
||||
<!-- Please prefix your pull request with one of the following: **[FEATURE]** **[FIX]** **[IMPROVEMENT]**. -->
|
||||
|
||||
**In raising this pull request, I confirm the following (please check boxes):**
|
||||
|
||||
@@ -7,6 +7,7 @@ Please prefix your pull request with one of the following: **[FEATURE]** **[FIX]
|
||||
- [ ] I have considered, and confirmed that this submission will be valuable to others.
|
||||
- [ ] I accept that this submission may not be used, and the pull request closed at the will of the maintainer.
|
||||
- [ ] I give this submission freely, and claim no ownership to its content.
|
||||
- [ ] **I have mentioned this change in the [changelog](https://github.com/CCExtractor/ccextractor/blob/master/docs/CHANGES.TXT).**
|
||||
|
||||
**My familiarity with the project is as follows (check one):**
|
||||
|
||||
|
||||
9
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: github-actions
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: daily
|
||||
time: "10:00"
|
||||
timezone: America/Los_Angeles
|
||||
open-pull-requests-limit: 10
|
||||
105
.github/workflows/build_linux.yml
vendored
Normal file
@@ -0,0 +1,105 @@
|
||||
name: Build CCExtractor on Linux
|
||||
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- '.github/workflows/build_linux.yml'
|
||||
- '**.c'
|
||||
- '**.h'
|
||||
- '**Makefile**'
|
||||
- 'linux/**'
|
||||
- 'package_creators/**'
|
||||
- 'src/rust/**'
|
||||
tags-ignore: # ignore push via new tag
|
||||
- '*.*'
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened]
|
||||
paths:
|
||||
- '.github/workflows/build_linux.yml'
|
||||
- '**.c'
|
||||
- '**.h'
|
||||
- '**Makefile**'
|
||||
- 'linux/**'
|
||||
- 'package_creators/**'
|
||||
- 'src/rust/**'
|
||||
jobs:
|
||||
build_shell:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Install tesseract
|
||||
run: sudo apt-get install libtesseract-dev
|
||||
- uses: actions/checkout@v2.4.0
|
||||
- name: build
|
||||
run: ./build
|
||||
working-directory: ./linux
|
||||
- name: Display version information
|
||||
run: ./ccextractor --version
|
||||
working-directory: ./linux
|
||||
- name: Prepare artifacts
|
||||
run: mkdir ./linux/artifacts
|
||||
- name: Copy release artifact
|
||||
run: cp ./linux/ccextractor ./linux/artifacts/
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: CCExtractor Linux build
|
||||
path: ./linux/artifacts
|
||||
build_autoconf:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2.4.0
|
||||
- name: run autogen
|
||||
run: ./autogen.sh
|
||||
working-directory: ./linux
|
||||
- name: configure
|
||||
run: ./configure --enable-debug
|
||||
working-directory: ./linux
|
||||
- name: make
|
||||
run: make
|
||||
working-directory: ./linux
|
||||
- name: Display version information
|
||||
run: ./ccextractor --version
|
||||
working-directory: ./linux
|
||||
cmake:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2.4.0
|
||||
- name: cmake
|
||||
run: mkdir build && cd build && cmake ../src
|
||||
- name: build
|
||||
run: make -j$(nproc)
|
||||
working-directory: build
|
||||
- name: Display version information
|
||||
run: ./build/ccextractor --version
|
||||
cmake_ocr_hardsubx:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2.4.0
|
||||
- name: dependencies
|
||||
run: sudo apt update && sudo apt install libtesseract-dev libavformat-dev libswscale-dev
|
||||
- name: cmake
|
||||
run: mkdir build && cd build && cmake -DWITH_OCR=ON -DWITH_HARDSUBX=ON ../src
|
||||
- name: build
|
||||
run: make -j$(nproc)
|
||||
working-directory: build
|
||||
- name: Display version information
|
||||
run: ./build/ccextractor --version
|
||||
build_rust:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2.4.0
|
||||
- name: cache
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: |
|
||||
src/rust/.cargo/registry
|
||||
src/rust/.cargo/git
|
||||
src/rust/target
|
||||
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
|
||||
restore-keys: ${{ runner.os }}-cargo-
|
||||
- uses: actions-rs/toolchain@v1
|
||||
with:
|
||||
toolchain: stable
|
||||
override: true
|
||||
- name: build
|
||||
run: cargo build
|
||||
working-directory: ./src/rust
|
||||
158
.github/workflows/build_windows.yml
vendored
Normal file
@@ -0,0 +1,158 @@
|
||||
name: Build CCExtractor on Windows
|
||||
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- ".github/workflows/build_windows.yml"
|
||||
- "**.c"
|
||||
- "**.h"
|
||||
- "windows/**"
|
||||
tags-ignore: # ignore push via new tag
|
||||
- "*.*"
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened]
|
||||
paths:
|
||||
- ".github/workflows/build_windows.yml"
|
||||
- "**.c"
|
||||
- "**.h"
|
||||
- "windows/**"
|
||||
|
||||
jobs:
|
||||
build_non_ocr_release:
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- name: Check out repository
|
||||
uses: actions/checkout@v2.4.0
|
||||
- name: Setup MSBuild.exe
|
||||
uses: microsoft/setup-msbuild@v1.0.2
|
||||
- name: Install llvm and clang
|
||||
run: choco install llvm
|
||||
- uses: actions-rs/toolchain@v1
|
||||
with:
|
||||
toolchain: 1.56.0
|
||||
override: true
|
||||
- name: Install Win 10 SDK
|
||||
uses: ilammy/msvc-dev-cmd@v1
|
||||
- name: build Release
|
||||
env:
|
||||
LIBCLANG_PATH: "C:\\Program Files\\LLVM\\lib"
|
||||
LLVM_CONFIG_PATH: "C:\\Program Files\\LLVM\\bin\\llvm-config"
|
||||
CARGO_TARGET_DIR: "..\\..\\windows"
|
||||
BINDGEN_EXTRA_CLANG_ARGS: -fmsc-version=0
|
||||
run: msbuild ccextractor.sln /p:Configuration=Release /p:Platform=x64
|
||||
working-directory: ./windows
|
||||
- name: Display version information
|
||||
run: ./ccextractorwin.exe --version
|
||||
working-directory: ./windows/x64/Release
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: CCExtractor Windows Non-OCR Release build
|
||||
path: |
|
||||
./windows/x64/Release/ccextractorwin.exe
|
||||
./windows/x64/Release/*.dll
|
||||
build_non_ocr_debug:
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- name: Check out repository
|
||||
uses: actions/checkout@v2.4.0
|
||||
- name: Setup MSBuild.exe
|
||||
uses: microsoft/setup-msbuild@v1.0.2
|
||||
- name: Install llvm and clang
|
||||
run: choco install llvm
|
||||
- uses: actions-rs/toolchain@v1
|
||||
with:
|
||||
toolchain: 1.56.0
|
||||
override: true
|
||||
- name: Install Win 10 SDK
|
||||
uses: ilammy/msvc-dev-cmd@v1
|
||||
- name: build Debug
|
||||
env:
|
||||
LIBCLANG_PATH: "C:\\Program Files\\LLVM\\lib"
|
||||
LLVM_CONFIG_PATH: "C:\\Program Files\\LLVM\\bin\\llvm-config"
|
||||
CARGO_TARGET_DIR: "..\\..\\windows"
|
||||
BINDGEN_EXTRA_CLANG_ARGS: -fmsc-version=0
|
||||
run: msbuild ccextractor.sln /p:Configuration=Debug /p:Platform=x64
|
||||
working-directory: ./windows
|
||||
- name: Display version information
|
||||
run: ./ccextractorwin.exe --version
|
||||
working-directory: ./windows/x64/Debug
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: CCExtractor Windows Non-OCR Debug build
|
||||
path: |
|
||||
./windows/x64/Debug/ccextractorwin.exe
|
||||
./windows/x64/Debug/ccextractorwin.pdb
|
||||
./windows/x64/Debug/*.dll
|
||||
build_ocr_hardsubx_release:
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- name: Check out repository
|
||||
uses: actions/checkout@v2.4.0
|
||||
- name: Setup MSBuild.exe
|
||||
uses: microsoft/setup-msbuild@v1.0.2
|
||||
- name: Install llvm and clang
|
||||
uses: egor-tensin/setup-clang@v1
|
||||
with:
|
||||
version: latest
|
||||
platform: x86
|
||||
- uses: actions-rs/toolchain@v1
|
||||
with:
|
||||
toolchain: 1.56.0
|
||||
override: true
|
||||
target: i686-pc-windows-msvc
|
||||
- name: Install Win 10 SDK
|
||||
uses: ilammy/msvc-dev-cmd@v1
|
||||
- name: build Release-Full
|
||||
env:
|
||||
LIBCLANG_PATH: "C:\\Program Files\\LLVM\\lib"
|
||||
LLVM_CONFIG_PATH: "C:\\Program Files\\LLVM\\bin\\llvm-config"
|
||||
CARGO_TARGET_DIR: "..\\..\\windows"
|
||||
BINDGEN_EXTRA_CLANG_ARGS: -fmsc-version=0
|
||||
run: msbuild ccextractor.sln /p:Configuration=Release-Full /p:Platform=Win32
|
||||
working-directory: ./windows
|
||||
- name: Display version information
|
||||
run: ./ccextractorwinfull.exe --version
|
||||
working-directory: ./windows/Release-Full
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: CCExtractor Windows OCR and HardSubX Release build
|
||||
path: |
|
||||
./windows/Release-Full/ccextractorwinfull.exe
|
||||
./windows/Release-Full/*.dll
|
||||
build_ocr_hardsubx_debug:
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- name: Check out repository
|
||||
uses: actions/checkout@v2.4.0
|
||||
- name: Setup MSBuild.exe
|
||||
uses: microsoft/setup-msbuild@v1.0.2
|
||||
- name: Install llvm and clang
|
||||
uses: egor-tensin/setup-clang@v1
|
||||
with:
|
||||
version: latest
|
||||
platform: x86
|
||||
- uses: actions-rs/toolchain@v1
|
||||
with:
|
||||
toolchain: 1.56.0
|
||||
override: true
|
||||
target: i686-pc-windows-msvc
|
||||
- name: Install Win 10 SDK
|
||||
uses: ilammy/msvc-dev-cmd@v1
|
||||
- name: build Debug-Full
|
||||
env:
|
||||
LIBCLANG_PATH: "C:\\Program Files\\LLVM\\lib"
|
||||
LLVM_CONFIG_PATH: "C:\\Program Files\\LLVM\\bin\\llvm-config"
|
||||
CARGO_TARGET_DIR: "..\\..\\windows"
|
||||
BINDGEN_EXTRA_CLANG_ARGS: -fmsc-version=0
|
||||
run: msbuild ccextractor.sln /p:Configuration=Debug-Full /p:Platform=Win32
|
||||
working-directory: ./windows
|
||||
- name: Display version information
|
||||
run: ./ccextractorwinfull.exe --version
|
||||
working-directory: ./windows/Debug-Full
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: CCExtractor Windows OCR and HardSubX Debug build
|
||||
path: |
|
||||
./windows/Debug-Full/ccextractorwinfull.exe
|
||||
./windows/Debug-Full/ccextractorwinfull.pdb
|
||||
./windows/Debug-Full/*.dll
|
||||
51
.github/workflows/format.yml
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
name: Format sourcecode
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- '.github/workflows/format.yml'
|
||||
- 'src/**.c'
|
||||
- 'src/**.h'
|
||||
- 'src/rust/**'
|
||||
tags-ignore: # ignore push via new tag
|
||||
- '*.*'
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened]
|
||||
paths:
|
||||
- '.github/workflows/format.yml'
|
||||
- 'src/**.c'
|
||||
- 'src/**.h'
|
||||
- 'src/rust/**'
|
||||
jobs:
|
||||
format:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2.4.0
|
||||
- name: Format code
|
||||
run: |
|
||||
find src/ -type f -not -path "src/thirdparty/*" -not -path "src/lib_ccx/zvbi/*" -name '*.c' -not -path "src/GUI/icon_data.c" | xargs clang-format -i
|
||||
git diff-index --quiet HEAD -- || (git diff && exit 1)
|
||||
format_rust:
|
||||
runs-on: ubuntu-latest
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./src/rust
|
||||
steps:
|
||||
- uses: actions/checkout@v2.4.0
|
||||
- name: cache
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: |
|
||||
src/rust/.cargo/registry
|
||||
src/rust/.cargo/git
|
||||
src/rust/target
|
||||
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
|
||||
restore-keys: ${{ runner.os }}-cargo-
|
||||
- uses: actions-rs/toolchain@v1
|
||||
with:
|
||||
toolchain: stable
|
||||
override: true
|
||||
components: rustfmt, clippy
|
||||
- name: rustfmt
|
||||
run: cargo fmt --all -- --check
|
||||
- name: clippy
|
||||
run: cargo clippy -- -D warnings
|
||||
82
.github/workflows/release.yml
vendored
Normal file
@@ -0,0 +1,82 @@
|
||||
name: Upload releases
|
||||
|
||||
on:
|
||||
release:
|
||||
types:
|
||||
- created
|
||||
|
||||
jobs:
|
||||
build_windows:
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- name: Check out repository
|
||||
uses: actions/checkout@v2.4.0
|
||||
- name: Get the version
|
||||
id: get_version
|
||||
run: echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\/v/}
|
||||
shell: bash
|
||||
- name: Setup MSBuild.exe
|
||||
uses: microsoft/setup-msbuild@v1.0.2
|
||||
- name: Install llvm and clang
|
||||
uses: egor-tensin/setup-clang@v1
|
||||
with:
|
||||
version: latest
|
||||
platform: x86
|
||||
- uses: actions-rs/toolchain@v1
|
||||
with:
|
||||
toolchain: 1.56.0
|
||||
override: true
|
||||
target: i686-pc-windows-msvc
|
||||
- name: Install Win 10 SDK
|
||||
uses: ilammy/msvc-dev-cmd@v1
|
||||
- name: build Release-Full
|
||||
env:
|
||||
LIBCLANG_PATH: "C:\\Program Files\\LLVM\\lib"
|
||||
LLVM_CONFIG_PATH: "C:\\Program Files\\LLVM\\bin\\llvm-config"
|
||||
CARGO_TARGET_DIR: "..\\..\\windows"
|
||||
BINDGEN_EXTRA_CLANG_ARGS: -fmsc-version=0
|
||||
run: msbuild ccextractor.sln /p:Configuration=Release-Full /p:Platform=Win32
|
||||
working-directory: ./windows
|
||||
- name: Copy files to directory for installer
|
||||
run: mkdir installer; cp ./Release-Full/ccextractorwinfull.exe ./installer; cp ./Release-Full/*.dll ./installer
|
||||
working-directory: ./windows
|
||||
- name: install WiX
|
||||
run: dotnet tool install --global wix --version 4.0.0-preview.0 && wix extension -g add WixToolset.UI.wixext
|
||||
- name: Make sure WiX works
|
||||
run: wix --version && wix extension -g list
|
||||
- name: Download Flutter GUI
|
||||
run: ((Invoke-WebRequest -UseBasicParsing https://api.github.com/repos/CCExtractor/ccextractorfluttergui/releases/latest).Content | ConvertFrom-Json).assets | ForEach-Object {if ($_.name -eq "windows.zip") { Invoke-WebRequest -UseBasicParsing -Uri $_.browser_download_url -OutFile windows.zip}}
|
||||
working-directory: ./windows
|
||||
- name: Display contents of dir
|
||||
run: ls
|
||||
working-directory: ./windows
|
||||
- name: Unzip Flutter GUI
|
||||
run: Expand-Archive -Path ./windows.zip -DestinationPath ./installer
|
||||
working-directory: ./windows
|
||||
- name: Display installer folder contents
|
||||
run: Get-ChildItem -Recurse ./installer
|
||||
working-directory: ./windows
|
||||
- name: Create portable zip
|
||||
run: Compress-Archive -Path ./installer/* -DestinationPath ./CCExtractor_win_portable.zip
|
||||
working-directory: ./windows
|
||||
- name: Build installer
|
||||
run: wix build -ext "$HOME\.wix\extensions\WixToolset.UI.wixext\4.0.0-preview.0\tools\WixToolset.UI.wixext.dll" -d "AppVersion=${{ steps.get_version.outputs.VERSION }}.0.0" -o CCExtractor.msi installer.wxs
|
||||
working-directory: ./windows
|
||||
- name: Upload as asset
|
||||
uses: AButler/upload-release-assets@v2.0
|
||||
with:
|
||||
files: './windows/CCExtractor.msi;./windows/CCExtractor_win_portable.zip'
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
create_linux_package:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2.4.0
|
||||
with:
|
||||
path: ./ccextractor
|
||||
- name: Create .tar.gz without git and windows folders
|
||||
run: tar -pczf ./ccextractor_minimal.tar.gz --exclude "ccextractor/windows" --exclude "ccextractor/.git" ccextractor
|
||||
- name: Upload as asset
|
||||
uses: AButler/upload-release-assets@v2.0
|
||||
with:
|
||||
files: './ccextractor_minimal.tar.gz'
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
7
.gitignore
vendored
@@ -34,6 +34,9 @@ build/
|
||||
####
|
||||
# Visual Studio project Ignored files
|
||||
|
||||
.vs/**
|
||||
windows/.vs/**
|
||||
!windows/.vs/config/applicationhost.config
|
||||
*.suo
|
||||
*.sdf
|
||||
*.opensdf
|
||||
@@ -122,6 +125,7 @@ src/**/.deps
|
||||
src/**/.dirstamp
|
||||
mac/ccextractorGUI
|
||||
linux/ccextractorGUI
|
||||
linux/ccxGUI.ini
|
||||
linux/CMakeCache.txt
|
||||
linux/CMakeFiles/
|
||||
linux/cmake_install.cmake
|
||||
@@ -133,3 +137,6 @@ mac/cmake_install.cmake
|
||||
mac/CMakeFiles/
|
||||
mac/CMakeCache.txt
|
||||
*.py.bak
|
||||
|
||||
# Bazel
|
||||
bazel*
|
||||
|
||||
118
.travis.yml
@@ -1,25 +1,101 @@
|
||||
language: c
|
||||
os:
|
||||
- osx
|
||||
- linux
|
||||
|
||||
sudo:
|
||||
- true
|
||||
|
||||
compiler:
|
||||
- gcc
|
||||
- clang
|
||||
matrix:
|
||||
include:
|
||||
- os: osx
|
||||
osx_image: xcode10.1
|
||||
compiler: gcc
|
||||
addons:
|
||||
homebrew:
|
||||
packages:
|
||||
autoconf
|
||||
libtool
|
||||
tesseract
|
||||
leptonica
|
||||
script:
|
||||
- cd mac
|
||||
- ./build.command
|
||||
- ./ccextractor --version
|
||||
|
||||
before_install:
|
||||
- if [[ $TRAVIS_OS_NAME == 'osx' ]]; then brew upgrade automake; brew install pkg-config autoconf automake libtool tesseract leptonica; fi
|
||||
- if [[ $TRAVIS_OS_NAME == 'linux' ]]; then sudo apt-get install -y libcurl4-gnutls-dev tesseract-ocr tesseract-ocr-dev libleptonica-dev autoconf-archive; fi
|
||||
- if [[ $TRAVIS_OS_NAME == 'linux' ]]; then sudo apt-get install python-distutils-extra tesseract-ocr tesseract-ocr-eng libopencv-dev libtesseract-dev libleptonica-dev python-all-dev swig libcv-dev python-opencv python-numpy python-setuptools build-essential subversion; fi
|
||||
- if [[ $TRAVIS_OS_NAME == 'linux' ]]; then wget https://github.com/DanBloomberg/leptonica/releases/download/1.74.4/leptonica-1.74.4.tar.gz && tar xvf leptonica-1.74.4.tar.gz; cd leptonica-1.74.4; ./configure && make && sudo make install; cd ..; fi
|
||||
- if [[ $TRAVIS_OS_NAME == 'linux' ]]; then git clone https://github.com/tesseract-ocr/tesseract.git; cd tesseract; ./autogen.sh; ./configure --enable-debug; LDFLAGS="-L/usr/local/lib" CFLAGS="-I/usr/local/include" make; sudo make install; sudo ldconfig; cd ..; fi
|
||||
- os: osx
|
||||
osx_image: xcode10.1
|
||||
compiler: clang
|
||||
addons:
|
||||
homebrew:
|
||||
packages:
|
||||
autoconf
|
||||
libtool
|
||||
tesseract
|
||||
leptonica
|
||||
script:
|
||||
- cd mac
|
||||
- ./build.command
|
||||
- ./ccextractor --version
|
||||
|
||||
script:
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then cd mac; ./build.command; cd ..; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then cd mac; ./autogen.sh; ./configure; make; cd ..; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then cd linux; ./build; cd ..; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then mkdir build; cd build; cmake ../src/; make; cd ..; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then cd linux; ./autogen.sh; ./configure; make; cd ..; fi
|
||||
- os: osx
|
||||
osx_image: xcode10.1
|
||||
compiler: gcc
|
||||
addons:
|
||||
homebrew:
|
||||
packages:
|
||||
autoconf
|
||||
libtool
|
||||
tesseract
|
||||
leptonica
|
||||
script:
|
||||
- cd mac
|
||||
- ./autogen.sh
|
||||
- ./configure
|
||||
- make
|
||||
- ./ccextractor --version
|
||||
|
||||
- os: osx
|
||||
osx_image: xcode10.1
|
||||
compiler: clang
|
||||
addons:
|
||||
homebrew:
|
||||
packages:
|
||||
autoconf
|
||||
libtool
|
||||
tesseract
|
||||
leptonica
|
||||
script:
|
||||
- cd mac
|
||||
- ./autogen.sh
|
||||
- ./configure
|
||||
- make
|
||||
- ./ccextractor --version
|
||||
|
||||
- os: osx
|
||||
osx_image: xcode10.1
|
||||
compiler: gcc
|
||||
addons:
|
||||
homebrew:
|
||||
packages:
|
||||
autoconf
|
||||
libtool
|
||||
tesseract
|
||||
leptonica
|
||||
script:
|
||||
- mkdir build
|
||||
- cd build
|
||||
- cmake ../src/
|
||||
- make
|
||||
- ./ccextractor --version
|
||||
|
||||
- os: osx
|
||||
osx_image: xcode10.1
|
||||
compiler: clang
|
||||
addons:
|
||||
homebrew:
|
||||
packages:
|
||||
autoconf
|
||||
libtool
|
||||
tesseract
|
||||
leptonica
|
||||
script:
|
||||
- mkdir build
|
||||
- cd build
|
||||
- cmake ../src/
|
||||
- make
|
||||
- ./ccextractor --version
|
||||
@@ -3,8 +3,8 @@
|
||||
MAINTAINER = Marc Espie <espie@openbsd.org>
|
||||
CATEGORIES = multimedia
|
||||
COMMENT = closed caption subtitles extractor
|
||||
HOMEPAGE = http://ccextractor.sourceforge.net/
|
||||
V = 0.77
|
||||
HOMEPAGE = https://ccextractor.org
|
||||
V = 0.94
|
||||
DISTFILES = ccextractor.${V:S/.//}-src.zip
|
||||
MASTER_SITES = ${MASTER_SITE_SOURCEFORGE:=ccextractor/}
|
||||
DISTNAME = ccextractor-$V
|
||||
|
||||
25
README.md
@@ -2,10 +2,11 @@
|
||||
|
||||
# CCExtractor
|
||||
|
||||
[](https://travis-ci.org/CCExtractor/ccextractor)
|
||||
<a href="https://travis-ci.org/CCExtractor/ccextractor"><img src="https://raw.githubusercontent.com/CCExtractor/ccextractor-org-media/master/static/macOS-build-badge-logo.png" width="20"></a> [](https://travis-ci.org/CCExtractor/ccextractor)
|
||||
[](https://sampleplatform.ccextractor.org/test/master/windows)
|
||||
[](https://sampleplatform.ccextractor.org/test/master/linux)
|
||||
[](https://sourceforge.net/projects/ccextractor/)
|
||||
[](https://github.com/CCExtractor/ccextractor/releases/latest)
|
||||
|
||||
CCExtractor is a tool used to produce subtitles for TV recordings from almost anywhere in the world. We intend to keep up with all sources and formats.
|
||||
|
||||
@@ -24,19 +25,9 @@ The official repository is ([CCExtractor/ccextractor](https://github.com/CCExtra
|
||||
|
||||
The core functionality is written in C. Other languages used include C++ and Python.
|
||||
|
||||
## Google Code-in 2018
|
||||
|
||||
CCExtractor is participating in Google Code-in 2018!
|
||||
|
||||
Google Code-in is a competition of encouraging young people to learn more about Open Source and contributing to it. Tasks range from coding, documentation, quality assurance, design, outreach and research.
|
||||
|
||||
This is our third year of participating and creating challenging tasks for pre-university students aged 13-17.
|
||||
|
||||
If you are a student fitting the age criteria, interested to contribute to CCExtractor feel free to join us. You can read more at the [Google Code-in website](https://codein.withgoogle.com).
|
||||
|
||||
## Installation and Usage
|
||||
|
||||
Downloads for precompiled binaries and source code can be found [on our website](https://www.ccextractor.org?id=public:general:downloads).
|
||||
Downloads for precompiled binaries and source code can be found [on our website](https://ccextractor.org/public/general/downloads/).
|
||||
|
||||
Extracting subtitles is relatively simple. Just run the following command:
|
||||
|
||||
@@ -46,11 +37,13 @@ This will extract the subtitles.
|
||||
|
||||
More usage information can be found on our website:
|
||||
|
||||
- [Using the command line tool](https://www.ccextractor.org/doku.php?id=public:general:command_line_usage)
|
||||
- [Using the Windows GUI](https://www.ccextractor.org/doku.php?id=public:general:win_gui_usage)
|
||||
- [Using the command line tool](https://ccextractor.org/public/general/command_line_usage/)
|
||||
- [Using the Flutter GUI](https://ccextractor.org/public/general/flutter_gui/)
|
||||
|
||||
You can also find the list of parameters and their brief description by running `ccextractor` without any arguments.
|
||||
|
||||
You can find sample files on [our website](https://ccextractor.org/public/general/tvsamples/) to test the software.
|
||||
|
||||
## Compiling CCExtractor
|
||||
|
||||
To learn more about how to compile and build CCExtractor for your platform check the [compilation guide](https://github.com/CCExtractor/ccextractor/blob/master/docs/COMPILATION.MD).
|
||||
@@ -61,9 +54,9 @@ By far the best way to get support is by opening an issue at our [issue tracker]
|
||||
|
||||
When you create a new issue, please fill in the needed details in the provided template. That makes it easier for us to help you more efficiently.
|
||||
|
||||
If you have a question or a problem you can also [contact us by email or chat with the team in Slack](https://www.ccextractor.org/doku.php?id=public:general:support).
|
||||
If you have a question or a problem you can also [contact us by email or chat with the team in Slack](https://ccextractor.org/public/general/support/).
|
||||
|
||||
If you want to contribute to CCExtractor but can't submit some code patches or issues or video samples, you can also [donate to us](https://www.ccextractor.org/public:general:http:sourceforge.net_donate_index.php?group_id=190832)
|
||||
If you want to contribute to CCExtractor but can't submit some code patches or issues or video samples, you can also [donate to us](https://sourceforge.net/donate/index.php?group_id=190832)
|
||||
|
||||
## Contributing
|
||||
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
from builtins import str
|
||||
import ccextractor as cc
|
||||
import ccx_to_python_g608 as g608
|
||||
import python_srt_generator as srt_generator
|
||||
text,font,color = [],[],[]
|
||||
filename = " "
|
||||
srt_counter = " "
|
||||
def generate_output_srt(line, encoding):
|
||||
global text,font,color
|
||||
global filename, srt_counter
|
||||
if "filename:" in line:
|
||||
filename = str(str(line.split(":")[1]).split("\n")[0])
|
||||
with open(filename, 'w+') as fh:
|
||||
pass
|
||||
elif "srt_counter-" in line:
|
||||
srt_counter = str(line.split("-")[1])
|
||||
with open(filename, 'a+') as fh:
|
||||
fh.write(srt_counter)
|
||||
elif "start_time" in line:
|
||||
with open(filename, 'a+') as fh:
|
||||
data = line.split("-")
|
||||
end_time = str(data[-1].split("\n")[0])
|
||||
start_time = str(data[1].split("\t")[0])
|
||||
fh.write(start_time)
|
||||
fh.write(" --> ")
|
||||
fh.write(end_time)
|
||||
fh.write("\n")
|
||||
fh.flush()
|
||||
elif "***END OF FRAME***" in line:
|
||||
d={}
|
||||
d['text']=text
|
||||
d['color']=color
|
||||
d['font']=font
|
||||
srt_generator.generate_output_srt(filename,d, encoding)
|
||||
text,font,color = [],[],[]
|
||||
else:
|
||||
g608.g608_grid_former(line,text,color,font)
|
||||
|
||||
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
from __future__ import print_function
|
||||
###
|
||||
#MANDATORY UPDATES IN EVERY PYTHON SCRIPT
|
||||
###
|
||||
import sys
|
||||
|
||||
import ccextractor as cc
|
||||
|
||||
|
||||
def callback(line, encoding):
|
||||
print(line)
|
||||
|
||||
|
||||
def init_ccextractor(callback):
|
||||
"""
|
||||
:param callback: The callback which we use to handle
|
||||
the extracted subtitle info
|
||||
:return return the initialized options
|
||||
"""
|
||||
optionos = cc.api_init_options()
|
||||
cc.check_configuration_file(optionos)
|
||||
for arg in sys.argv[1:]:
|
||||
cc.api_add_param(optionos, arg)
|
||||
compile_ret = cc.compile_params(optionos, len(sys.argv[1:]))
|
||||
|
||||
# use my_pythonapi to add callback in C source code
|
||||
cc.my_pythonapi(optionos, callback)
|
||||
|
||||
return optionos
|
||||
|
||||
|
||||
def main():
|
||||
options = init_ccextractor(callback)
|
||||
cc.api_start(options)
|
||||
|
||||
|
||||
if __name__=="__main__":
|
||||
main()
|
||||
@@ -1,97 +0,0 @@
|
||||
#!/bin/bash
|
||||
BLD_FLAGS="-std=gnu99 -Wno-write-strings -DGPAC_CONFIG_LINUX -D_FILE_OFFSET_BITS=64 -DVERSION_FILE_PRESENT -DENABLE_OCR -DFT2_BUILD_LIBRARY -DGPAC_DISABLE_VTT -DGPAC_DISABLE_OD_DUMP -DPYTHON_API"
|
||||
BLD_INCLUDE="-I/usr/include/python2.7/ -I../src -I /usr/include/leptonica/ -I /usr/include/tesseract/ -I../src/lib_ccx/ -I../src/gpacmp4/ -I../src/libpng/ -I../src/zlib/ -I../src/zvbi -I../src/lib_hash -I../src/protobuf-c -I../src/utf8proc -I../src/freetype/include"
|
||||
SRC_LIBPNG="$(find ../src/libpng/ -name '*.c')"
|
||||
SRC_ZLIB="$(find ../src/zlib/ -name '*.c')"
|
||||
SRC_ZVBI="$(find ../src/zvbi/ -name '*.c')"
|
||||
SRC_CCX="$(find ../src/lib_ccx/ -name '*.c')"
|
||||
SRC_GPAC="$(find ../src/gpacmp4/ -name '*.c')"
|
||||
SRC_HASH="$(find ../src/lib_hash/ -name '*.c')"
|
||||
SRC_PROTOBUF="$(find ../src/protobuf-c/ -name '*.c')"
|
||||
SRC_UTF8PROC="../src/utf8proc/utf8proc.c"
|
||||
SRC_FREETYPE="../src/freetype/autofit/autofit.c
|
||||
../src/freetype/base/ftbase.c
|
||||
../src/freetype/base/ftbbox.c
|
||||
../src/freetype/base/ftbdf.c
|
||||
../src/freetype/base/ftbitmap.c
|
||||
../src/freetype/base/ftcid.c
|
||||
../src/freetype/base/ftfntfmt.c
|
||||
../src/freetype/base/ftfstype.c
|
||||
../src/freetype/base/ftgasp.c
|
||||
../src/freetype/base/ftglyph.c
|
||||
../src/freetype/base/ftgxval.c
|
||||
../src/freetype/base/ftinit.c
|
||||
../src/freetype/base/ftlcdfil.c
|
||||
../src/freetype/base/ftmm.c
|
||||
../src/freetype/base/ftotval.c
|
||||
../src/freetype/base/ftpatent.c
|
||||
../src/freetype/base/ftpfr.c
|
||||
../src/freetype/base/ftstroke.c
|
||||
../src/freetype/base/ftsynth.c
|
||||
../src/freetype/base/ftsystem.c
|
||||
../src/freetype/base/fttype1.c
|
||||
../src/freetype/base/ftwinfnt.c
|
||||
../src/freetype/bdf/bdf.c
|
||||
../src/freetype/bzip2/ftbzip2.c
|
||||
../src/freetype/cache/ftcache.c
|
||||
../src/freetype/cff/cff.c
|
||||
../src/freetype/cid/type1cid.c
|
||||
../src/freetype/gzip/ftgzip.c
|
||||
../src/freetype/lzw/ftlzw.c
|
||||
../src/freetype/pcf/pcf.c
|
||||
../src/freetype/pfr/pfr.c
|
||||
../src/freetype/psaux/psaux.c
|
||||
../src/freetype/pshinter/pshinter.c
|
||||
../src/freetype/psnames/psnames.c
|
||||
../src/freetype/raster/raster.c
|
||||
../src/freetype/sfnt/sfnt.c
|
||||
../src/freetype/smooth/smooth.c
|
||||
../src/freetype/truetype/truetype.c
|
||||
../src/freetype/type1/type1.c
|
||||
../src/freetype/type42/type42.c
|
||||
../src/freetype/winfonts/winfnt.c"
|
||||
API_WRAPPERS="$(find ../src/wrappers/ -name '*.c')"
|
||||
# the `swig -python ccextractor.i` will generate ccextractor_wrap.c
|
||||
BLD_SOURCES="../src/ccextractor.c ccextractor_wrap.c $SRC_CCX $SRC_GPAC $SRC_ZLIB $SRC_ZVBI $SRC_LIBPNG $SRC_HASH $SRC_PROTOBUF $SRC_UTF8PROC $API_WRAPPERS $SRC_FREETYPE"
|
||||
|
||||
BLD_LINKER="-lm -zmuldefs -l tesseract -l lept -l python3.6m"
|
||||
|
||||
echo "Running pre-build script..."
|
||||
../linux/pre-build.sh
|
||||
echo "Trying to compile..."
|
||||
|
||||
|
||||
out=$((swig -python ccextractor.i && LC_ALL=C gcc -fPIC -c $BLD_FLAGS $BLD_INCLUDE $BLD_SOURCES $BLD_LINKER)2>&1)
|
||||
res=$?
|
||||
if [[ $out == *"gcc: command not found"* ]]
|
||||
then
|
||||
echo "Error: please install gcc";
|
||||
exit 1
|
||||
fi
|
||||
if [[ $out == *"curl.h: No such file or directory"* ]]
|
||||
then
|
||||
echo "Error: please install curl development library (libcurl4-gnutls-dev for Debian/Ubuntu)";
|
||||
exit 2
|
||||
fi
|
||||
if [[ $out == *"capi.h: No such file or directory"* ]]
|
||||
then
|
||||
echo "Error: please install tesseract development library (tesseract-ocr-dev for Debian/Ubuntu)";
|
||||
exit 3
|
||||
fi
|
||||
if [[ $out == *"allheaders.h: No such file or directory"* ]]
|
||||
then
|
||||
echo "Error: please install leptonica development library (libleptonica-dev for Debian/Ubuntu)";
|
||||
exit 4
|
||||
fi
|
||||
if [[ $res -ne 0 ]] # Unknown error
|
||||
then
|
||||
echo "Compiled with errors"
|
||||
>&2 echo "$out"
|
||||
exit 5
|
||||
fi
|
||||
if [[ "$out" != "" ]] ; then
|
||||
echo "$out"
|
||||
echo "Compilation successful, compiler message shown in previous lines"
|
||||
else
|
||||
echo "Compilation successful, no compiler messages."
|
||||
fi
|
||||
@@ -1,34 +0,0 @@
|
||||
#!/bin/bash
|
||||
BLD_LINKER="-lm -zmuldefs -l tesseract -l lept -l python2.7"
|
||||
WRAPPER_FLAGS="-Wl,-wrap,write"
|
||||
|
||||
out=$((./build_api && gcc -shared $(find -name '*.o') -o _ccextractor.so $BLD_LINKER)2>&1)
|
||||
res=$?
|
||||
if [[ $out == *"gcc: command not found"* ]]
|
||||
then
|
||||
echo "Error: please install gcc";
|
||||
exit 1
|
||||
fi
|
||||
if [[ $out == *"curl.h: No such file or directory"* ]]
|
||||
then
|
||||
echo "Error: please install curl development library (libcurl4-gnutls-dev for Debian/Ubuntu)";
|
||||
exit 2
|
||||
fi
|
||||
if [[ $out == *"capi.h: No such file or directory"* ]]
|
||||
then
|
||||
echo "Error: please install tesseract development library (tesseract-ocr-dev for Debian/Ubuntu)";
|
||||
exit 3
|
||||
fi
|
||||
if [[ $out == *"allheaders.h: No such file or directory"* ]]
|
||||
then
|
||||
echo "Error: please install leptonica development library (libleptonica-dev for Debian/Ubuntu)";
|
||||
exit 4
|
||||
fi
|
||||
if [[ $res -ne 0 ]] # Unknown error
|
||||
then
|
||||
echo "Compiled with errors"
|
||||
>&2 echo "$out"
|
||||
exit 5
|
||||
fi
|
||||
rm *.o
|
||||
echo "Compilation successful";
|
||||
@@ -1,18 +0,0 @@
|
||||
%module ccextractor
|
||||
%{
|
||||
#define SWIG_FILE_WITH_INIT
|
||||
#include "../src/lib_ccx/lib_ccx.h"
|
||||
#include "../src/lib_ccx/configuration.h"
|
||||
#include "../src/lib_ccx/ccx_common_option.h"
|
||||
#include "../src/lib_ccx/ccx_mp4.h"
|
||||
#include "../src/lib_ccx/hardsubx.h"
|
||||
#include "../src/lib_ccx/ccx_share.h"
|
||||
#include "../src/ccextractor.h"
|
||||
#include "../src/wrappers/wrapper.h"
|
||||
%}
|
||||
struct ccx_s_options* api_init_options();
|
||||
void check_configuration_file(struct ccx_s_options api_options);
|
||||
int compile_params(struct ccx_s_options *api_options,int argc);
|
||||
void api_add_param(struct ccx_s_options* api_options,char* arg);
|
||||
int api_start(struct ccx_s_options api_options);
|
||||
void my_pythonapi(struct ccx_s_options *api_options, PyObject *func);
|
||||
@@ -1,63 +0,0 @@
|
||||
from __future__ import print_function
|
||||
from builtins import str
|
||||
def g608_grid_former(line,text,color,font):
|
||||
if "text[" in line:
|
||||
line = str(line.split(":", 1)[1])
|
||||
line = str(line.split("\n")[0])
|
||||
text.append(line)
|
||||
if "color[" in line:
|
||||
line = str(line.split(":", 1)[1])
|
||||
line = str(line.split("\n")[0])
|
||||
color.append(line)
|
||||
if "font[" in line:
|
||||
line = str(line.split(":", 1)[1])
|
||||
line = str(line.split("\n")[0])
|
||||
font.append(line)
|
||||
|
||||
def return_g608_grid(case,text,color,font):
|
||||
ret_val = {'text':" ",'color':" ",'font':" "}
|
||||
help_string = """
|
||||
Case is the value that would give the desired output.
|
||||
case = 0 --> print start_time,end_time,text,color,font
|
||||
case = 1 --> print start_time,end_time,text
|
||||
case = 2 --> print start_time,end_time,color
|
||||
case = 3 --> print start_time,end_time,font
|
||||
case = 4 --> print start_time,end_time,text,color
|
||||
case = 5 --> print start_time,end_time,text,font
|
||||
case = 6 --> print start_time,end_time,color,font
|
||||
"""
|
||||
if case==0:
|
||||
if text:
|
||||
ret_val['text']=text
|
||||
if color:
|
||||
ret_val['color']=color
|
||||
if font:
|
||||
ret_val['font']=font
|
||||
|
||||
elif case==1:
|
||||
if text:
|
||||
ret_val['text']=text
|
||||
elif case==2:
|
||||
if color:
|
||||
ret_val['color']=color
|
||||
elif case==3:
|
||||
if font:
|
||||
ret_val['font']=font
|
||||
elif case==4:
|
||||
if text:
|
||||
ret_val['text']=text
|
||||
if color:
|
||||
ret_val['color']=color
|
||||
elif case==5:
|
||||
if text:
|
||||
ret_val['text']=text
|
||||
if font:
|
||||
ret_val['font']=font
|
||||
elif case==6:
|
||||
if color:
|
||||
ret_val['color']=color
|
||||
if font:
|
||||
ret_val['font']=font
|
||||
else:
|
||||
print(help_string)
|
||||
return ret_val
|
||||
@@ -1,155 +0,0 @@
|
||||
from __future__ import print_function
|
||||
from builtins import zip
|
||||
from builtins import str
|
||||
import ccextractor as cc
|
||||
import re
|
||||
"""
|
||||
#Handling underline
|
||||
buff = ""
|
||||
underline_flag = 0
|
||||
for i,font_type in enumerate(font_line):
|
||||
if font_type == 'U' and not underline_flag:
|
||||
buff = buff + '<u> '
|
||||
underline_flag = 1
|
||||
underline=1
|
||||
elif font_type =="R" and underline_flag:
|
||||
buff = buff + '</u>'
|
||||
underline_flag = 0
|
||||
continue;
|
||||
buff += letter[i]
|
||||
#adding a new line after buff has seen underline
|
||||
#need to cross check with CCExtractor output as to how they are doing
|
||||
if underline:
|
||||
buff+= "\n"
|
||||
else:
|
||||
buff=""
|
||||
"""
|
||||
encodings_map = {
|
||||
'0':'unicode',
|
||||
'1':'latin1',
|
||||
'2':'utf-8',
|
||||
'3':'ascii',
|
||||
}
|
||||
|
||||
color_text_start={
|
||||
"0":"",
|
||||
"1":"<font color=\"#00ff00\">",
|
||||
"2":"<font color=\"#0000ff\">",
|
||||
"3":"<font color=\"#00ffff\">",
|
||||
"4":"<font color=\"#ff0000\">",
|
||||
"5":"<font color=\"#ffff00\">",
|
||||
"6":"<font color=\"#ff00ff\">",
|
||||
"7":"<font color=\"",
|
||||
"8":"",
|
||||
"9":""
|
||||
};
|
||||
color_text_end={
|
||||
"0":"",
|
||||
"1":"</font",
|
||||
"2":"</font>",
|
||||
"3":"</font>",
|
||||
"4":"</font>",
|
||||
"5":"</font>",
|
||||
"6":"</font>",
|
||||
"7":"</font>",
|
||||
"8":"",
|
||||
"9":""
|
||||
};
|
||||
no_color_tag = ['0','8','9']
|
||||
def comparing_text_font_grids(text, font, color):
|
||||
original_text = text
|
||||
original_color = color
|
||||
temp_color = []
|
||||
for letter,color_line in zip(original_text,color):
|
||||
color = 0
|
||||
prev = color_line[0]
|
||||
buff = color_text_start[str(prev)]
|
||||
if prev not in no_color_tag:
|
||||
color_flag = 1
|
||||
else:
|
||||
color_flag = 0
|
||||
if letter.count(" ")<32:
|
||||
for i,color_type in enumerate(color_line):
|
||||
if color_type not in no_color_tag and prev!=color_type and not color_flag:
|
||||
color = 1
|
||||
buff = buff + color_text_start[str(color_type)]
|
||||
color_flag = 1
|
||||
elif prev!=color_type and color_flag:
|
||||
color = 1
|
||||
buff = buff + color_text_end[str(prev)]
|
||||
color_flag = 0
|
||||
buff += letter[i]
|
||||
prev=color_type
|
||||
if color_flag:
|
||||
color_flag=0
|
||||
buff+=color_text_end[str(prev)]
|
||||
if color:
|
||||
temp_color.append((buff,1))
|
||||
else:
|
||||
temp_color.append((letter,0))
|
||||
temp_font_italics=[]
|
||||
for letter,font_line in zip(original_text,font):
|
||||
if letter.count(" ")<32:
|
||||
buff=""
|
||||
underline,italics = 0,0
|
||||
#Handling italics
|
||||
italics_flag = 0
|
||||
for i,font_type in enumerate(font_line):
|
||||
if font_type == 'I' and not italics_flag:
|
||||
italics=1
|
||||
buff = buff + '<i>'
|
||||
italics_flag = 1
|
||||
elif font_type =="R" and italics_flag:
|
||||
italics=1
|
||||
buff = buff + '</i>'
|
||||
italics_flag = 0
|
||||
buff += letter[i]
|
||||
if italics_flag:
|
||||
buff+='</i>'
|
||||
if italics:
|
||||
temp_font_italics.append((buff,1))
|
||||
else:
|
||||
temp_font_italics.append((letter,0))
|
||||
else:
|
||||
temp_font_italics.append((letter,0))
|
||||
final = []
|
||||
for i,j in zip(temp_color,temp_font_italics):
|
||||
if i[1] and not j[1]:
|
||||
final.append(i[0])
|
||||
elif j[1] and not i[1]:
|
||||
final.append(j[0])
|
||||
else:
|
||||
if not i[1]:
|
||||
final.append(i[0])
|
||||
else:
|
||||
print("error")
|
||||
return (final,font,color)
|
||||
|
||||
|
||||
def generate_output_srt(filename,d, encoding):
|
||||
if encoding in list(encodings_map.keys()):
|
||||
if encoding!='0':
|
||||
encoding_format = encodings_map[encoding]
|
||||
else:
|
||||
encoding_format = ""
|
||||
else:
|
||||
print("encoding error in python")
|
||||
return
|
||||
if encoding_format:
|
||||
d['text'] = [str(item,encoding_format) for item in d['text']]
|
||||
else:
|
||||
d['text'] = [str(item) for item in d['text']]
|
||||
d['text'],d['font'],d['color']= comparing_text_font_grids(d['text'],d['font'],d['color'])
|
||||
for item in d['text']:
|
||||
if item.count(" ")<32:
|
||||
o=item
|
||||
with open(filename,'ab+') as fh:
|
||||
if encoding_format:
|
||||
fh.write(o.encode(encoding_format))
|
||||
else:
|
||||
fh.write(str(o))
|
||||
fh.write("\n")
|
||||
fh.flush()
|
||||
with open(filename,'ab+') as fh:
|
||||
fh.write("\n")
|
||||
fh.flush()
|
||||
@@ -1,26 +0,0 @@
|
||||
from __future__ import print_function
|
||||
import sys
|
||||
import os
|
||||
import subprocess
|
||||
|
||||
output_formats = ['.srt','.ass','.ssa','.webvtt','.sami','.txt','.original','.python','.py']
|
||||
args_list = sys.argv[1:]
|
||||
args_count = len(args_list)
|
||||
if args_count>1:
|
||||
print("wrong usage")
|
||||
exit(0)
|
||||
directory = args_list[0]
|
||||
if not os.path.isdir(directory):
|
||||
print("error: path given is not a directory")
|
||||
exit(0)
|
||||
files = []
|
||||
for item in os.listdir(directory):
|
||||
ext = os.path.splitext(item)[1]
|
||||
if ext not in output_formats:
|
||||
files.append(os.path.join(directory,item))
|
||||
for sample in files:
|
||||
print("Processing file: "+sample)
|
||||
#command=['../linux/ccextractor',sample]
|
||||
command = ['python','api_testing.py',sample]
|
||||
subprocess.call(command)
|
||||
print("Finished processing file: "+sample)
|
||||
@@ -83,3 +83,10 @@ Google Summer of Code 2017 students
|
||||
- Diptanshu Jamgade
|
||||
- Mayank Gupta
|
||||
|
||||
Google Code-in 2018 students
|
||||
- Matej Plavevski
|
||||
- Ivan Makarov
|
||||
- Albert (alufers)
|
||||
- Brian M
|
||||
- John Chew
|
||||
- T1duS
|
||||
|
||||
343
docs/CHANGES.TXT
@@ -1,3 +1,97 @@
|
||||
0.94 (2021-12-14)
|
||||
-----------------
|
||||
- BOM is no longer enabled by default on windows platforms
|
||||
- CEA-708: Rust decoder is now default instead of C decoder
|
||||
- CEA-708 subs are now extracted by default
|
||||
- New: Add check for Minimum supported rust version (MSRV) (#1387)
|
||||
- Fix: Fix CEA-708 Carriage Return command implementation
|
||||
- Fix: Fix bug with startat/endat parameter (#1396)
|
||||
- Fix: Mac Build processes (#1390)
|
||||
- Fix: Fix bug with negative delay parameter (#1365)
|
||||
|
||||
0.93 (2021-08-16)
|
||||
-----------------
|
||||
- Minor Rust updates (format, typos, docs)
|
||||
- Updated GUI
|
||||
|
||||
0.92 (2021-08-10)
|
||||
-----------------
|
||||
- Rust updates: Added srt writer
|
||||
- Rust updates:-Added writers for transcripts and SAMI
|
||||
- Added missing DLL to Windows installer
|
||||
- Updated Windows GUI
|
||||
|
||||
0.91 (2021-07-26)
|
||||
-----------------
|
||||
- More Rust in the 708 decoder (Add Pen Presets and timing functions)
|
||||
- Updated GUI
|
||||
|
||||
0.90 (2021-07-14)
|
||||
-----------------
|
||||
- New installer (WiX based)
|
||||
- New GUI (flutter based)
|
||||
- More Rust (the 708 decoder is being rewritten)
|
||||
|
||||
0.89 (2021-06-13)
|
||||
-----------------
|
||||
- Fix: Fix broken links in README
|
||||
- Fix: Timing in DVB, sub duration check for timeout.
|
||||
- New: Added support for SCC and CCD encoder formats
|
||||
- New: Added support to output captions to MCC file (#733).
|
||||
- New: Add support for censoring words ("Kid Friendly") (#1139)
|
||||
- New: Extend support of capitalization for all BITMAP and 608 subtitles (#1214)
|
||||
- New: Added an option to disable timestamps for WebVTT (In response to issue #1127)
|
||||
- Fix: Change inet_ntop to inet_ntoa for Windows XP compatibility
|
||||
- Fix: Added italics, underline, and color rendering support for -out=spupng with EIA608/teletext
|
||||
- Fix: ccx_demuxer_mxf.c: Parse framerate from MXF captions to fix caption timings.
|
||||
- Fix: hardsubx_decoder.c: Fix memory leaks using Leptonica API.
|
||||
- Fix: linux/Makefile.am: added some sources to enable rpms to be created.
|
||||
- Fix: Crash when using -sc (sentence case) option (#1115)
|
||||
- Fix: Segmentation fault on VOB #1128
|
||||
- Fix: Hang while processing video #1121
|
||||
- Fix: lib_ccx.c: Initialize fatal error logging function before first usage in init_libraries
|
||||
- Fix: A few (minor) memory leaks around the code.
|
||||
- Fix: General code clean up / reformatting
|
||||
- Fix: Fix multiple definitions with new -fno-common default in GCC 10
|
||||
- Fix: Mac now builds reproducibly again without errors on the date command (#1230)
|
||||
- Fix: Allow all oem modes with tesseract v4 (#1264)
|
||||
- Doc: Updated ccextractor.cnf.sample.
|
||||
- Update: Updated LibPNG to 1.6.37
|
||||
- Remove: Python API (since no one cares about it and it's unmaintained)
|
||||
- Remove: -cf , just use FFmpeg if you want a ES from a TS or PS, CCExtractor is a bad tool
|
||||
for this.
|
||||
- Fix: Segmentation fault on Windows
|
||||
- Update: Updated libGPAC to 1.0.1
|
||||
- Fix: Segmentation fault with unsupported and multitrack file reports
|
||||
- Fix: Write subtitle header to multitrack outputs
|
||||
- Fix: Write multitrack files to the output file directory
|
||||
- Fix: Correct frame number calculation in SCC (#1340)
|
||||
- Fix: Regression on Teletext that caused dates to be wrong (RT 78 on the sample platform)
|
||||
- Fix: CEA-708: Better timing, fixes for missing subtitles
|
||||
- Fix: timing for direct rollup
|
||||
- Fix: timing for VOB files with multiple chapters
|
||||
|
||||
0.88 (2019-05-21)
|
||||
-----------------
|
||||
- New: More tapping points for debug image in ccextractor.
|
||||
- New: Add support for tesseract 4.0
|
||||
- Optimize: Remove multiple RGB to grey conversion in OCR.
|
||||
- Fix: Update UTF8Proc to 2.2.0
|
||||
- Fix: Update LibPNG to 1.6.35
|
||||
- Fix: Update Protobuf-c to 1.3.1
|
||||
- Fix: Warn instead of fatal when a 0xFF marker is missing
|
||||
- Fix: Segfault in general_loop.c due to null pointer dereference (case of no encoder)
|
||||
- Fix: Enable printing hdtv stats to console.
|
||||
- Fix: Many typos in comments and output messages
|
||||
- Fix: Ignore Visual Studio temporary project files
|
||||
- New: Add support for non-Latin characters in stdout
|
||||
- Fix: Check whether stream is empty
|
||||
- New: Add support for EIA-608 inside .mkv
|
||||
- New: Add support for DVB inside .mkv
|
||||
- Fix: Added -latrusmap Map Latin symbols to Cyrillic ones in special cases
|
||||
of Russian Teletext files (issue #1086)
|
||||
- Fix: Several OCR crashes
|
||||
|
||||
0.87 (2018-10-23)
|
||||
-----------------
|
||||
- New: Upgrade libGPAC to 0.7.1.
|
||||
@@ -76,10 +170,10 @@
|
||||
- New: Added tarball generation script.
|
||||
- New: Added --analyzevideo. If present the video stream will be processed even if the
|
||||
subtitles are in a different stream. This is useful when we want video information
|
||||
(resolution, frame type, etc). -vides now implies this option too.
|
||||
(resolution, frame type, etc). -vides now implies this option too.
|
||||
[Note: Tentative - some possibly breaking changed were made for this, so if you
|
||||
use it validate results]
|
||||
- New: Added a GUI in the main CCExtractor binary (separate from the external GUIs
|
||||
- New: Added a GUI in the main CCExtractor binary (separate from the external GUIs
|
||||
such as CCExtractorGUI).
|
||||
- New: A Python binding extension so it's possible to use CCExtractor's tools from
|
||||
Python.
|
||||
@@ -90,29 +184,29 @@
|
||||
- New: FreeType-based text renderer (-out=spupng with teletext/EIA608).
|
||||
- New: Upgrade library UTF8proc
|
||||
- New: Upgrade library win_iconv
|
||||
- New: Upgrade library zlib
|
||||
- New: Upgrade library LibPNG
|
||||
- New: Upgrade library zlib
|
||||
- New: Upgrade library LibPNG
|
||||
- New: Support for Source-Specific Multicast
|
||||
- New: Added Travis CI support
|
||||
- New: Added Travis CI support
|
||||
- New: Made error messages clearer, less ambiguous
|
||||
- Fix: Prevent the OCR being initialized more than once (happened on multiprogram and
|
||||
PAT changes)
|
||||
- Fix: Makefiles, build scripts, etc... everything updated and corrected for all
|
||||
platforms.
|
||||
-Fix: Proper line ending for .srt files from bitmaps.
|
||||
- Fix: OCR corrections using grayscale before extracting texts.
|
||||
-Fix: Proper line ending for .srt files from bitmaps.
|
||||
- Fix: OCR corrections using grayscale before extracting texts.
|
||||
- Fix: End timestamps in transcripts from DVB.
|
||||
- Fix: Forcing -noru to cause deduplication in ISDB
|
||||
- Fix: TS: Skip NULL packets
|
||||
- Fix: TS: Skip NULL packets
|
||||
- Fix: When NAL decoding fails, don't dump the whole decoded thing, limit to 160 bytes.
|
||||
- Fix: Modify Autoconf scripts to generate tarball for mac from `/package_creators/tarball.sh`
|
||||
- Fix: Modify Autoconf scripts to generate tarball for mac from `/package_creators/tarball.sh`
|
||||
and include GUI files in tarball
|
||||
- Fix: Started work on libGPAC upgrade.
|
||||
- Fix: DVB subtitle not extracted if there's no display segment
|
||||
- Fix: Heap corruption in add_ocrtext2str
|
||||
- Fix: bug that caused -out=spupng sometimes crashes
|
||||
- Fix: Checks for text before newlines on DVB subtitles
|
||||
- Fix: OCR issue caused by separated dvb subtitle regions
|
||||
- Fix: Checks for text before newlines on DVB subtitles
|
||||
- Fix: OCR issue caused by separated dvb subtitle regions
|
||||
- Fix: DVB crash on specific condition (!rect->ocr_text)
|
||||
- Fix: DVB bug (Multiple-line subtitle; Missing last line)
|
||||
- Fix: --sentencecap for teletext samples
|
||||
@@ -159,7 +253,7 @@
|
||||
|
||||
0.84 (2016-12-16)
|
||||
-----------------
|
||||
- New: In Windows, both with and without-OCR binaries are bundled, since the OCR one causes problems due to
|
||||
- New: In Windows, both with and without-OCR binaries are bundled, since the OCR one causes problems due to
|
||||
dependencies in some system. So unless you need the OCR just use the non-OCR version.
|
||||
- New: Added -sbs (sentence by sentence) for DVB output. Each frame in the output file contains a complete
|
||||
sentence (experimental).
|
||||
@@ -182,7 +276,7 @@
|
||||
- Fix: Added detail in many error messages.
|
||||
- Fix: Memory leaks in videos with XDS.
|
||||
- Fix: Makefile compatibility issues with Raspberry pi.
|
||||
- Fix: missing separation between WebVTT header and body.
|
||||
- Fix: missing separation between WebVTT header and body.
|
||||
- Fix: Stupid bug in M2TS that preventing it from working.
|
||||
- Fix: OCR libraries dependencies for the release version in Windows.
|
||||
- Fix: non-buffered reading from pipes.
|
||||
@@ -229,7 +323,7 @@
|
||||
- Fix: Timing in -ucla
|
||||
- Fix: Timing in ISDB (some instances)
|
||||
- Fix: "mfra" mp4 box weight changed to 1 (this helps with correct file format detection)
|
||||
- Fix: Fix for TARGET File is null.
|
||||
- Fix: Fix for TARGET File is null.
|
||||
- Fix: Fixed SegFaults while parsing parameters (if mandatory parameter is not present in -outinterval, -codec or -nocodec)
|
||||
- Fix: Crash when input small is too small
|
||||
- Fix: Update some URLs in code (references to docs)
|
||||
@@ -287,7 +381,7 @@
|
||||
- CCExtractor can be used as library if compiled using cmake
|
||||
- By default the Windows version adds BOM to generated UTF files (this is
|
||||
because it's needed to open the files correctly) while all other
|
||||
builds don't add it (because it messes with text processing tools).
|
||||
builds don't add it (because it messes with text processing tools).
|
||||
You can use -bom and -nobom to change the behaviour.
|
||||
|
||||
0.74 (2014-09-24)
|
||||
@@ -326,7 +420,7 @@
|
||||
------------------------
|
||||
This is the first release that is part of Google's Summer of Code.
|
||||
Anshul, Ruslan and Willem joined CCExtractor to work on a number of things
|
||||
over the summer, and their work is already reaching the mainstream
|
||||
over the summer, and their work is already reaching the mainstream
|
||||
version of CCExtractor.
|
||||
|
||||
- Added a huge dictionary submitted by Matt Stockard.
|
||||
@@ -359,7 +453,7 @@ version of CCExtractor.
|
||||
0000101 is the default setting for transcripts
|
||||
1110101 is the default for timed transcripts
|
||||
1111001 is the default setting for -ucla
|
||||
Make sure you use this parameter after others that might affect these
|
||||
Make sure you use this parameter after others that might affect these
|
||||
settings (-out, -ucla, -xds, -txt, -ttxt, ...)
|
||||
- Fixed Negative timing Bug
|
||||
|
||||
@@ -377,7 +471,7 @@ version of CCExtractor.
|
||||
- Started refactoring and clean-up.
|
||||
- Fix: MPEG clock rollover (happens each 26 hours) caused a time
|
||||
discontinuity.
|
||||
- Windows GUI: Started work on HDHomeRun support. For now it just looks
|
||||
- Windows GUI: Started work on HDHomeRun support. For now it just looks
|
||||
for HDHomeRun devices. Lots of other things will arrive in the next
|
||||
versions.
|
||||
- Windows GUI: Some code refactoring, since the HDHomeRun support makes
|
||||
@@ -394,7 +488,7 @@ version of CCExtractor.
|
||||
a good test sample file...
|
||||
- Color and fonts in PAC commands were ignored, fixed (Helen Buus).
|
||||
- Added a new output format, spupng. It consists on one .png file
|
||||
for each subtitle frame and one .xml with all the timing
|
||||
for each subtitle frame and one .xml with all the timing
|
||||
(Heleen Buus).
|
||||
- Some fixes (Chris Small).
|
||||
|
||||
@@ -416,12 +510,12 @@ version of CCExtractor.
|
||||
- Added -latin1 to select Latin 1 as encoding. Default is now
|
||||
UTF-8 (-utf8 still exists but it's not needed).
|
||||
- Added -ru1, which emulates a (non-existing in real life) 1 line
|
||||
roll-up mode.
|
||||
roll-up mode.
|
||||
|
||||
|
||||
0.66 (2013-07-01)
|
||||
-----------------
|
||||
- Fixed bug in auto detection code that triggered a message
|
||||
- Fixed bug in auto detection code that triggered a message
|
||||
about file being auto of sync.
|
||||
- Added -investigate_packets
|
||||
The PMT is used to select the most promising elementary stream
|
||||
@@ -430,39 +524,39 @@ version of CCExtractor.
|
||||
manually, in case the CC location is not obvious from the PMT
|
||||
contents. To assist looking for the right stream, the parameter
|
||||
"-investigate_packets" will have CCExtractor look inside each
|
||||
stream, looking for CC markers, and report the streams that
|
||||
stream, looking for CC markers, and report the streams that
|
||||
are likely to contain CC data even if it can't be determined from
|
||||
their PMT entry.
|
||||
- Added -datastreamtype to manually selecting a stream based on
|
||||
its type instead of its PID. Useful if your recording program
|
||||
always hides the caption under the stream type.
|
||||
always hides the caption under the stream type.
|
||||
- Added -streamtype so if an elementary stream is selected manually
|
||||
for processing, the streamtype can be selected too. This can be
|
||||
needed if you process, for example a stream that is declared as
|
||||
for processing, the streamtype can be selected too. This can be
|
||||
needed if you process, for example a stream that is declared as
|
||||
"private MPEG" in the PMT, so CCExtractor can't tell what it is.
|
||||
Usually you'll want -streamtype 2 (MPEG video) or -streamtype 6
|
||||
(MPEG private data).
|
||||
- PMT content listing improved, it now shows the stream type for
|
||||
more types.
|
||||
- Fixes in roll-up, cursor was being moved to column 1 if a
|
||||
- Fixes in roll-up, cursor was being moved to column 1 if a
|
||||
RU2, RU3 or RU4 was received even if already in roll-up mode.
|
||||
- Added -autoprogram. If a multiprogram TS is processed and
|
||||
- Added -autoprogram. If a multiprogram TS is processed and
|
||||
-autoprogram is used, CCExtractor will analyze all PMTs and use
|
||||
the first program that has a suitable data stream.
|
||||
- Timed transcript (ttxt) now also exports the caption mode
|
||||
(roll-up, paint-on, etc.) next to each line, as it's useful to
|
||||
- Timed transcript (ttxt) now also exports the caption mode
|
||||
(roll-up, paint-on, etc.) next to each line, as it's useful to
|
||||
detect things like commercials.
|
||||
- Content Advisory information from XDS is now decoded if it's
|
||||
transmitted in "US TV parental guidelines" or "MPA".
|
||||
Other encoding such as Canada's are not supported yet due
|
||||
transmitted in "US TV parental guidelines" or "MPA".
|
||||
Other encoding such as Canada's are not supported yet due
|
||||
to lack of samples.
|
||||
- Copy Management information from XDS is now decoded.
|
||||
- Added -xds. If present and export format is timed transcript
|
||||
(only), XDS information will be saved to file (same file as the
|
||||
transcript, with XDS being clearly marked). Note that for now
|
||||
all XDS data is exported even if it doesn't change, so the
|
||||
all XDS data is exported even if it doesn't change, so the
|
||||
transcript file will be significantly larger.
|
||||
- Added some PaintOn support, at least enough to prevent it
|
||||
- Added some PaintOn support, at least enough to prevent it
|
||||
from breaking things when the other modes are used.
|
||||
- Removed afd_data() warning. AFD doesn't carry any caption related
|
||||
data. AFD still detected in code in case we want to do something
|
||||
@@ -480,21 +574,21 @@ version of CCExtractor.
|
||||
calculated distance, the maximum allowed distance, and whether
|
||||
the strings are ultimately considered equivalent or not, i.e.
|
||||
the calculated distance is less or equal than the max allowed.
|
||||
-levdistmincnt value: Minimum distance we always allow
|
||||
regardless of the length of the strings. Default 2. This means
|
||||
that if the calculated distance is 0, 1 or 2, we consider the
|
||||
-levdistmincnt value: Minimum distance we always allow
|
||||
regardless of the length of the strings. Default 2. This means
|
||||
that if the calculated distance is 0, 1 or 2, we consider the
|
||||
strings to be equivalent.
|
||||
-levdistmaxpct value: Maximum distance we allow, as a
|
||||
percentage of the shortest string length. Default 10%. For
|
||||
example, consider a comparison of one string of 30 characters
|
||||
and one of 60 characters. We want to determine whether the
|
||||
first 30 characters of the longer string are more or less the
|
||||
same as the shortest string, i.e. whether the longest string
|
||||
is the shortest one plus new characters and maybe some
|
||||
corrections. Since the shortest string is 30 characters and
|
||||
the default percentage is 10%, we would allow a distance of
|
||||
-levdistmaxpct value: Maximum distance we allow, as a
|
||||
percentage of the shortest string length. Default 10%. For
|
||||
example, consider a comparison of one string of 30 characters
|
||||
and one of 60 characters. We want to determine whether the
|
||||
first 30 characters of the longer string are more or less the
|
||||
same as the shortest string, i.e. whether the longest string
|
||||
is the shortest one plus new characters and maybe some
|
||||
corrections. Since the shortest string is 30 characters and
|
||||
the default percentage is 10%, we would allow a distance of
|
||||
up to 3 between the first 30 characters.
|
||||
- Added -lf : Use UNIX line terminator (LF) instead of Windows (CRLF).
|
||||
- Added -lf : Use UNIX line terminator (LF) instead of Windows (CRLF).
|
||||
- Added -noautotimeref: Prevent UTC reference from being auto set from
|
||||
the stream data.
|
||||
|
||||
@@ -504,7 +598,7 @@ version of CCExtractor.
|
||||
- Added end timestamps in timed transcripts
|
||||
- Added support for SMPTE (patch by John Kemp)
|
||||
- Initial support for MPEG2 video tracks inside MP4 files (thanks a
|
||||
lot to GPAC's Jean who assisted in analyzing the sample and
|
||||
lot to GPAC's Jean who assisted in analyzing the sample and
|
||||
doing the required changes in GPAC).
|
||||
- Improved MP4 auto detection
|
||||
- Support for PCR if PTS is not available (needed for some teletext
|
||||
@@ -530,7 +624,7 @@ version of CCExtractor.
|
||||
data (bypassing detections).
|
||||
- Added -ru2 and -ru3 to limit the number of visible lines in roll-up
|
||||
captions (bypassing whatever the broadcast says).
|
||||
- Added support for a .hex (hexadecimal) dump of data.
|
||||
- Added support for a .hex (hexadecimal) dump of data.
|
||||
- Added support for wtv in Windows. This is done by using a new program
|
||||
(wtvccdump.exe) and a new DirectShow filter (CCExtractorDump.dll) that
|
||||
process the .wtv using DirecShow's filters and export the line 21 data
|
||||
@@ -541,9 +635,9 @@ version of CCExtractor.
|
||||
0.63 (2012-08-17)
|
||||
-----------------
|
||||
- Telext support added, by integrating Petr Kutalek's telxcc. Integration is
|
||||
still quite basic (there's equivalent code from both CCExtractor and
|
||||
telxcc) and some clean up is needed, but it works. Petr has announced that
|
||||
he's abandoning telxcc so further development will happen directly in
|
||||
still quite basic (there's equivalent code from both CCExtractor and
|
||||
telxcc) and some clean up is needed, but it works. Petr has announced that
|
||||
he's abandoning telxcc so further development will happen directly in
|
||||
CCExtractor.
|
||||
- Some bug fixes, as usual.
|
||||
|
||||
@@ -553,14 +647,14 @@ version of CCExtractor.
|
||||
Mac users that sent this.
|
||||
- Hauppauge mode now uses PES timing, needed for files that don't have
|
||||
caption data during all the video (such as in commercial breaks).
|
||||
- Added -mp4 and -in:mp4 to force the input to be processed as MP4.
|
||||
- Added -mp4 and -in:mp4 to force the input to be processed as MP4.
|
||||
- CC608 data embedded in a separate stream (as opposed as in the video
|
||||
stream itself) in MP4 files is now supported (not heavily tested).
|
||||
stream itself) in MP4 files is now supported (not heavily tested).
|
||||
This should be rather useful since closed captioned files from iTunes
|
||||
use this format.
|
||||
- More CEA-708 work. The debugger is now able to dump the "TV" contents for
|
||||
the first time. Also, a .srt can be generated, however timing is not quite
|
||||
good yet (still need to figure out why).
|
||||
the first time. Also, a .srt can be generated, however timing is not quite
|
||||
good yet (still need to figure out why).
|
||||
- Added -svc (or --service) to select the CEA-708 services to be processed.
|
||||
For example, -svc 1,2 will process the primary and secondary language
|
||||
services. Valid values are 1-63, where 1 is the primary language, 2 is
|
||||
@@ -575,9 +669,9 @@ version of CCExtractor.
|
||||
- Fix: GCC 3.4.4 can now build CCExtractor.
|
||||
- Fix: Damaged TS packets (those that come with 'error in transport' bit
|
||||
on) are now skipped.
|
||||
- Fix: Part of the changes for MP4 support (CC packets buffering in
|
||||
particular) broke some stuff for other files, causing at least very
|
||||
annoying character duplication. We hope we've fixed it without breaking
|
||||
- Fix: Part of the changes for MP4 support (CC packets buffering in
|
||||
particular) broke some stuff for other files, causing at least very
|
||||
annoying character duplication. We hope we've fixed it without breaking
|
||||
anything but please report).
|
||||
- Some non-interesting cleanup.
|
||||
|
||||
@@ -588,13 +682,13 @@ version of CCExtractor.
|
||||
code, the stream must be a file (no streaming), etc.
|
||||
- Fix: The Windows version was writing text files with double \r.
|
||||
- Fix: Closed captions blocks with no data could cause a crash.
|
||||
- Fix: -noru (to generate files without duplicate lines in
|
||||
- Fix: -noru (to generate files without duplicate lines in
|
||||
roll-up) was broken, with complete lines being missing.
|
||||
- Fix: bin format not working as input.
|
||||
- Fix: bin format not working as input.
|
||||
|
||||
0.59 (2011-10-07)
|
||||
-----------------
|
||||
- More AVC/H.264 work. pic_order_cnt_type != 0 will be processed now.
|
||||
- More AVC/H.264 work. pic_order_cnt_type != 0 will be processed now.
|
||||
- Fix: Roll-up captions with interruptions for Text (with ResumeTextDisplay
|
||||
in the middle of the caption data) were missing complete lines.
|
||||
- Added a timed text transcript output format, probably only useful for
|
||||
@@ -617,7 +711,7 @@ version of CCExtractor.
|
||||
- Added -stdout => If used, the captions will be sent to stdout (console)
|
||||
instead of file. Combined with -, CCExtractor can work as a filter in
|
||||
a larger process, receiving the stream from stdin and sending the
|
||||
captions to stdout.
|
||||
captions to stdout.
|
||||
- Some code clean up, minor refactoring.
|
||||
- Teletext detection (not yet processing).
|
||||
|
||||
@@ -626,20 +720,20 @@ version of CCExtractor.
|
||||
- Implemented new PTS based mode to order the caption information
|
||||
of AVC/H.264 data streams. The old pic_order_cnt_lsb based method
|
||||
is still available via the -poc or --usepicorder command switches.
|
||||
- Removed a couple of those annoying "Impossible!" error messages
|
||||
- Removed a couple of those annoying "Impossible!" error messages
|
||||
that appears when processing some (possibly broken, unsure) files.
|
||||
- Added -nots --notypesettings to prevent italics and underline
|
||||
- Added -nots --notypesettings to prevent italics and underline
|
||||
codes from being displayed.
|
||||
- Note to those not liking the paragraph symbol being used for the
|
||||
- Note to those not liking the paragraph symbol being used for the
|
||||
music note: Submit a VALID replacement in latin-1.
|
||||
- Added preliminary support for multiple program TS files. The
|
||||
- Added preliminary support for multiple program TS files. The
|
||||
parameter --program-number (or -pn) will let you choose which
|
||||
program number to process. If no number is passed and the TS
|
||||
program number to process. If no number is passed and the TS
|
||||
file contains more than one, CCExtractor will display a list of
|
||||
found programs and terminate.
|
||||
- Added support (basic, because I only received one sample) for some
|
||||
Hauppauge cards that save CC data in their own format. Use the
|
||||
parameter -haup to enable it (CCExtractor will display a notice
|
||||
parameter -haup to enable it (CCExtractor will display a notice
|
||||
if it thinks that it's processing a Hauppauge capture anyway).
|
||||
- Fixed bug in roll-up.
|
||||
- More AVC work, now TS files from echostar that provided garbled
|
||||
@@ -649,7 +743,7 @@ version of CCExtractor.
|
||||
0.57 (2010-12-16)
|
||||
-----------------
|
||||
- Bug fixes in the Windows version. Some debug code was unintentionally
|
||||
left in the released version.
|
||||
left in the released version.
|
||||
|
||||
0.56 (2010-12-09)
|
||||
-----------------
|
||||
@@ -666,10 +760,10 @@ version of CCExtractor.
|
||||
- Start implementation of EIA-708 decoding (not active yet).
|
||||
- Add -gt / --goptime switch to use GOP timing instead of PTS timing.
|
||||
- Start implementation of AVC/H.264 decoding (not active yet).
|
||||
- Fixed: The basic problem is that when 24fps movie film gets converted to 30fps NTSC
|
||||
they repeat every 4th frame. Some pics have 3 fields of CC data with field 3 CC data
|
||||
belongs to the same channel as field 1. The following pics have the fields reversed
|
||||
because of the odd number of fields. I used top_field_first to tell when the channels
|
||||
- Fixed: The basic problem is that when 24fps movie film gets converted to 30fps NTSC
|
||||
they repeat every 4th frame. Some pics have 3 fields of CC data with field 3 CC data
|
||||
belongs to the same channel as field 1. The following pics have the fields reversed
|
||||
because of the odd number of fields. I used top_field_first to tell when the channels
|
||||
are reversed. See Table 6-1 of the SCTE 20 [Paul Fernquist]
|
||||
|
||||
0.54 (2009-04-16)
|
||||
@@ -679,9 +773,9 @@ version of CCExtractor.
|
||||
- Improve synchronization of captions for source files with
|
||||
jumps in their time information or gaps in the caption
|
||||
information.
|
||||
- [R. Abarca] Changed Mac script, it now compiles/link
|
||||
everything from the /src directory.
|
||||
- It's now possible to have CCExtractor add credits
|
||||
- [R. Abarca] Changed Mac script, it now compiles/link
|
||||
everything from the /src directory.
|
||||
- It's now possible to have CCExtractor add credits
|
||||
automatically.
|
||||
- Added a feature to add start and end messages (for credits).
|
||||
See help screen for details.
|
||||
@@ -702,13 +796,13 @@ version of CCExtractor.
|
||||
for Raw Captions With Time). This new format
|
||||
allows one file to contain all the available
|
||||
closed caption data instead of just one stream.
|
||||
- Added --no_progress_bar to disable status
|
||||
- Added --no_progress_bar to disable status
|
||||
information (mostly used when debugging, as the
|
||||
progress information is annoying in the middle
|
||||
of debug logs).
|
||||
- The Windows GUI was reported to freeze in some
|
||||
- The Windows GUI was reported to freeze in some
|
||||
conditions. Fixed.
|
||||
- The Windows GUI is now targeted for .NET 2.0
|
||||
- The Windows GUI is now targeted for .NET 2.0
|
||||
instead of 3.5. This allows Windows 2000 to run
|
||||
it (there's not .NET 3.5 for Windows 2000), as
|
||||
requested by a couple of key users.
|
||||
@@ -716,17 +810,17 @@ version of CCExtractor.
|
||||
0.51 (unreleased)
|
||||
-----------------
|
||||
- Removed -autopad and -goppad, no longer needed.
|
||||
- In preparation to a new binary format we have
|
||||
renamed the current .bin to .raw. Raw files
|
||||
- In preparation to a new binary format we have
|
||||
renamed the current .bin to .raw. Raw files
|
||||
have only CC data (with no header, timing, etc.).
|
||||
- The input file format (when forced) is now
|
||||
specified with
|
||||
specified with
|
||||
-in=format
|
||||
such as -in=ts, -in=raw, -in=ps ...
|
||||
The old switches (-ts, -ps, etc.) still work.
|
||||
The only exception is -bin which has been removed
|
||||
(reserved for the new binary format). Use
|
||||
-in=raw to process a raw file.
|
||||
-in=raw to process a raw file.
|
||||
- Removed -d, which when produced a raw file used
|
||||
a DVD format. This has been merged into a new
|
||||
output type "dvdraw". So now instead of using
|
||||
@@ -735,7 +829,7 @@ version of CCExtractor.
|
||||
- Removed --noff
|
||||
- Added gui_mode_reports for frontend communications,
|
||||
see related file.
|
||||
- Windows GUI rewritten. Source code now included,
|
||||
- Windows GUI rewritten. Source code now included,
|
||||
too.
|
||||
- [Volker] Dish Network clean-up
|
||||
|
||||
@@ -748,12 +842,12 @@ version of CCExtractor.
|
||||
0.49 (2008-12-10)
|
||||
-----------------
|
||||
- [Volker] Major MPEG parser rework. Code much
|
||||
cleaner now.
|
||||
cleaner now.
|
||||
- Some stations transmit broken roll-up captions,
|
||||
and for some reason don't send CRs but RUs...
|
||||
Added work-around code to make captions readable.
|
||||
- Started work on EIA-708 (DTV). Right now you can
|
||||
add -debug-708 to get a dump of the 708 data.
|
||||
add -debug-708 to get a dump of the 708 data.
|
||||
An actually useful decoder will come soon.
|
||||
- Some of the changes MIGHT HAVE BROKEN MythTV's
|
||||
code. I don't use MythTV myself so I rely on
|
||||
@@ -769,9 +863,9 @@ version of CCExtractor.
|
||||
can now process files that are being recorded
|
||||
at the same time.
|
||||
|
||||
- [Volker] Added a new DVR-MS loop - this is
|
||||
- [Volker] Added a new DVR-MS loop - this is
|
||||
completely new, DVR-MS specific code, so we no
|
||||
longer use the generic MPEG code for DVR-MS.
|
||||
longer use the generic MPEG code for DVR-MS.
|
||||
DVR-MS should (or will be eventually at least)
|
||||
be as reliable as TS.
|
||||
Note: For now, it's only ATSC recordings, not
|
||||
@@ -790,11 +884,11 @@ version of CCExtractor.
|
||||
new options.
|
||||
- Added -lg --largegops
|
||||
From the help screen:
|
||||
Each Group-of-Picture comes with timing
|
||||
information. When this info is too separate
|
||||
(for example because there are a lot of
|
||||
frames in a GOP) ccextractor may prefer not
|
||||
to use GOP timing. Use this option is you
|
||||
Each Group-of-Picture comes with timing
|
||||
information. When this info is too separate
|
||||
(for example because there are a lot of
|
||||
frames in a GOP) ccextractor may prefer not
|
||||
to use GOP timing. Use this option is you
|
||||
need ccextractor to use GOP timing in large
|
||||
GOPs.
|
||||
|
||||
@@ -813,8 +907,8 @@ version of CCExtractor.
|
||||
0.43 (2008-06-20)
|
||||
-----------------
|
||||
- Fixed a bug in the read loop (no less)
|
||||
that caused some files to fail when
|
||||
reading without buffering (which is
|
||||
that caused some files to fail when
|
||||
reading without buffering (which is
|
||||
the default in the Linux build).
|
||||
- Several improvements in the GUI, such as
|
||||
saving current options as default.
|
||||
@@ -831,8 +925,8 @@ version of CCExtractor.
|
||||
-----------------
|
||||
- Default output is now .srt instead of .bin,
|
||||
use -raw if you need the data dump instead of
|
||||
.srt.
|
||||
- Added -trim, which removes blank spaces at
|
||||
.srt.
|
||||
- Added -trim, which removes blank spaces at
|
||||
the left and rights of each line in .srt.
|
||||
Note that those spaces are there to help
|
||||
deaf people know if the person talking is
|
||||
@@ -842,8 +936,8 @@ version of CCExtractor.
|
||||
|
||||
0.40 (2008-05-20)
|
||||
-----------------
|
||||
- Fixed a bug in the sanity check function
|
||||
that caused the Myth branch to abort.
|
||||
- Fixed a bug in the sanity check function
|
||||
that caused the Myth branch to abort.
|
||||
- Fixed the OSX build script, it needed a
|
||||
new #define to work.
|
||||
|
||||
@@ -853,30 +947,30 @@ version of CCExtractor.
|
||||
have no time information. Also, if in roll-up
|
||||
mode there will be no repeated lines.
|
||||
- Lots of changes in the MPEG parser, most of
|
||||
them submitted by Volker Quetschke.
|
||||
them submitted by Volker Quetschke.
|
||||
- Fixed a bug in the CC decoder that could cause
|
||||
the first line not to be cleared in roll-up
|
||||
mode.
|
||||
mode.
|
||||
- CCExtractor can now follow number sequences in
|
||||
file names, by suffixing the name with +.
|
||||
For example,
|
||||
|
||||
DVD0001.VOB+
|
||||
DVD0001.VOB+
|
||||
|
||||
means DVD0001.VOB, DVD0002.VOB, etc. This works
|
||||
for all files, so part001.ts+ does what you
|
||||
could expect.
|
||||
- Added -90090 which changes the clock frequency
|
||||
from the MPEG standard 90000 to 90090. It
|
||||
from the MPEG standard 90000 to 90090. It
|
||||
*could* (remains to be seen) help if there are
|
||||
timing issues.
|
||||
timing issues.
|
||||
- Better support for Tivo files.
|
||||
- By default ccextractor now considers the whole
|
||||
input file list a one large file, instead of
|
||||
several, independent, video files. This has
|
||||
been changed because most programs (for example
|
||||
DVDDecrypt) just cut the files by size.
|
||||
If you need the old behaviour (because you
|
||||
DVDDecrypt) just cut the files by size.
|
||||
If you need the old behaviour (because you
|
||||
actually edited the video files and want to
|
||||
join the subs), use -ve.
|
||||
|
||||
@@ -894,7 +988,7 @@ version of CCExtractor.
|
||||
that have been added because old behaviour was
|
||||
annoying to most people: _1 and _2 at the end
|
||||
of the output file names is now added ONLY if
|
||||
-12 is used (i.e. when there are two output
|
||||
-12 is used (i.e. when there are two output
|
||||
files to produce). So
|
||||
|
||||
ccextractor -srt sopranos.mpg
|
||||
@@ -955,7 +1049,7 @@ version of CCExtractor.
|
||||
Alan
|
||||
Tony
|
||||
|
||||
So you get
|
||||
So you get
|
||||
|
||||
You better respect
|
||||
this robe, Alan.
|
||||
@@ -964,7 +1058,7 @@ version of CCExtractor.
|
||||
have a different spelling file per TV
|
||||
show, or a large file with a lot of
|
||||
words, etc.
|
||||
- ccextractor has been reported to
|
||||
- ccextractor has been reported to
|
||||
compile and run on Mac with a minor
|
||||
change in the build script, so I've
|
||||
created a mac directory with the
|
||||
@@ -978,17 +1072,17 @@ version of CCExtractor.
|
||||
-----------------
|
||||
- Added -scr or --screenfuls, to select the
|
||||
number of screenfuls ccextractor should
|
||||
write before exiting. A screenful is
|
||||
write before exiting. A screenful is
|
||||
a change of screen contents caused by
|
||||
a CC command (not new characters). In
|
||||
practice, this means that for .srt each
|
||||
group of lines is a screenful, except when
|
||||
using -dru (which produces a lot of
|
||||
using -dru (which produces a lot of
|
||||
groups of lines because each new character
|
||||
produces a new group).
|
||||
- Completed tables for all encodings.
|
||||
- Fixed bug in .srt related to milliseconds
|
||||
in time lines.
|
||||
in time lines.
|
||||
- Font colors are back for .srt (apparently
|
||||
some programs do support them after all).
|
||||
Use -nofc or --nofontcolor if you don't
|
||||
@@ -997,7 +1091,7 @@ version of CCExtractor.
|
||||
0.32 (unreleased)
|
||||
-----------------
|
||||
- Added -delay ms, which adds (or subtracts)
|
||||
a number of milliseconds to all times in
|
||||
a number of milliseconds to all times in
|
||||
.srt/.sami files. For example,
|
||||
|
||||
-delay 400
|
||||
@@ -1028,8 +1122,8 @@ version of CCExtractor.
|
||||
- Fix in extended char decoding, I wasn't
|
||||
replacing the previous char.
|
||||
- When a sequence code was found before
|
||||
having a PTS, reported time was
|
||||
undefined.
|
||||
having a PTS, reported time was
|
||||
undefined.
|
||||
|
||||
0.29 (unreleased)
|
||||
-----------------
|
||||
@@ -1054,7 +1148,7 @@ version of CCExtractor.
|
||||
0.26 (unreleased)
|
||||
-----------------
|
||||
- Added -gp (or -goppad) to make ccextractor use
|
||||
GOP timing. Try it for non TS files where
|
||||
GOP timing. Try it for non TS files where
|
||||
subs start OK but desync as the video advances.
|
||||
|
||||
0.25 (unreleased)
|
||||
@@ -1063,7 +1157,7 @@ version of CCExtractor.
|
||||
-nomyth to prevent the MytvTV code path to be
|
||||
called. I've seen apparently correct files that
|
||||
make MythTV's MPEG decoder to choke. So, if it
|
||||
doesn't work correctly automatically: Try
|
||||
doesn't work correctly automatically: Try
|
||||
-nomyth and -myth. Hopefully one of the two
|
||||
options will work.
|
||||
|
||||
@@ -1076,7 +1170,7 @@ version of CCExtractor.
|
||||
- Reworked input buffer code, faster now.
|
||||
- Completed MythTV's MPEG decoder for Program Streams,
|
||||
which results in better processing of some specific
|
||||
files.
|
||||
files.
|
||||
- Automatic file format detection for all kind of
|
||||
files and closed caption storage method. No need to
|
||||
tell ccextractor anything about your file (but you
|
||||
@@ -1085,10 +1179,10 @@ version of CCExtractor.
|
||||
|
||||
0.22 (2007-05-15)
|
||||
-----------------
|
||||
- Added text mode handling into decoder, which gets rids
|
||||
- Added text mode handling into decoder, which gets rids
|
||||
of junk when text mode data is present.
|
||||
- Added support for certain (possibly non standard
|
||||
compliant) DVDs that add more captions block in a
|
||||
compliant) DVDs that add more captions block in a
|
||||
user data block than they should (such as Red October).
|
||||
- Fix in roll-up init code that caused the previous popup
|
||||
captions not to be written to disk.
|
||||
@@ -1099,13 +1193,13 @@ version of CCExtractor.
|
||||
-----------------
|
||||
- Unicode should be decent now.
|
||||
- Added support for Hauppauge PVR 250 cards, and (possibly)
|
||||
many others (bttv) with the same closed caption recording
|
||||
many others (bttv) with the same closed caption recording
|
||||
format.
|
||||
This is the result of hacking MythTV's MPEG parser into
|
||||
CCExtractor. Integration is not very good (to put it
|
||||
midly) but it seems to work. Depending on the feedback I
|
||||
may continue working on this or just leave it 'as it'
|
||||
(good enough).
|
||||
(good enough).
|
||||
If you want to process a file generated by one of these
|
||||
analog cards, use -myth. This is essential as it will
|
||||
make the program take a totally different code path.
|
||||
@@ -1115,10 +1209,10 @@ version of CCExtractor.
|
||||
|
||||
0.19 (2007-05-03)
|
||||
-----------------
|
||||
- Work on Dish Network streams, timing was completely broken.
|
||||
- Work on Dish Network streams, timing was completely broken.
|
||||
It's fixed now at least for the samples I have, if it's not
|
||||
completely fixed let me know. Credit for this goes to
|
||||
Jack Ha who sent me a couple of samples and a first
|
||||
Jack Ha who sent me a couple of samples and a first
|
||||
implementation of a semi working-fix.
|
||||
- Added support for several input files (see help screen for
|
||||
details).
|
||||
@@ -1155,4 +1249,3 @@ version of CCExtractor.
|
||||
- Added video information (as extracted from sequence header).
|
||||
- Some code clean-up.
|
||||
- FF sanity check enabled by default.
|
||||
|
||||
|
||||
@@ -14,39 +14,53 @@ git clone https://github.com/CCExtractor/ccextractor.git
|
||||
|
||||
1. Make sure all the dependencies are met.
|
||||
|
||||
Debian:
|
||||
|
||||
```bash
|
||||
sudo apt-get install -y libglew-dev libglfw3-dev cmake gcc libcurl4-gnutls-dev tesseract-ocr libtesseract-dev libleptonica-dev clang libclang-dev
|
||||
```
|
||||
sudo apt-get install -y gcc
|
||||
sudo apt-get install -y libcurl4-gnutls-dev
|
||||
sudo apt-get install -y tesseract-ocr
|
||||
sudo apt-get install -y tesseract-ocr-dev
|
||||
sudo apt-get install -y libleptonica-dev
|
||||
|
||||
RHEL:
|
||||
|
||||
```bash
|
||||
yum install -y glew-devel glfw-devel cmake gcc libcurl-devel tesseract-devel leptonica-devel clang
|
||||
```
|
||||
Rust 1.54 or above is also required.[Install Rust](https://www.rust-lang.org/tools/install). Check specific compilation methods below, on how to compile without rust
|
||||
|
||||
**Note:** On Ubuntu Version 18.04 (Bionic) and later, `libtesseract-dev` is installed rather than `tesseract-ocr-dev`, which does not exist anymore.
|
||||
|
||||
**Note:** On Ubuntu Version 14.04 (Trusty) and earlier, you should build leptonica and tesseract from source
|
||||
|
||||
2. Compiling
|
||||
|
||||
### Using the build script
|
||||
By default build script does not include debugging information hence, you cannot debug the executable produced (i.e. `./ccextractor`) on a debugger. To include debugging information, use the `builddebug` script.
|
||||
|
||||
**Using the build script**
|
||||
|
||||
|
||||
```
|
||||
```bash
|
||||
#Navigate to linux directory and call the build script
|
||||
|
||||
cd ccextractor/linux
|
||||
|
||||
# compile without debug flags
|
||||
./build
|
||||
|
||||
# compile without rust
|
||||
./build -without-rust
|
||||
|
||||
# compile with debug info
|
||||
./builddebug
|
||||
|
||||
# test your build
|
||||
./ccextractor
|
||||
```
|
||||
|
||||
**Standard linux compilation through Autoconf scripts**
|
||||
### Standard linux compilation through Autoconf scripts
|
||||
|
||||
```
|
||||
```bash
|
||||
sudo apt-get install autoconf #Dependency to generate configuration script
|
||||
cd ccextractor/linux
|
||||
./autogen.sh
|
||||
./configure
|
||||
./configure # OR ./configure --without-rust
|
||||
make
|
||||
|
||||
# test your build
|
||||
@@ -56,18 +70,16 @@ make
|
||||
sudo make install
|
||||
```
|
||||
|
||||
**Using CMake**
|
||||
### Using CMake
|
||||
|
||||
```
|
||||
```bash
|
||||
#Create and navigate to directory where you want to store built files
|
||||
|
||||
cd ccextractor/
|
||||
mkdir build
|
||||
cd build
|
||||
|
||||
#Generate makefile using cmake and then compile
|
||||
|
||||
cmake ../src/
|
||||
cmake ../src/ # options here
|
||||
make
|
||||
|
||||
# test your build
|
||||
@@ -77,14 +89,18 @@ make
|
||||
sudo make install
|
||||
```
|
||||
|
||||
`cmake` also accepts the options:
|
||||
`-DWITH_OCR=ON` to enable OCR
|
||||
`-DWITHOUT_RUST=ON` to disable rust.
|
||||
`-DWITH_HARDSUBX=ON` to enable burned-in subtitles
|
||||
|
||||
**Compiling with GUI:**
|
||||
### Compiling with GUI:
|
||||
|
||||
To build CCExtractor with a gui you will additionally need to install [GLEW](http://glew.sourceforge.net/build.html) and [GLFW](http://www.glfw.org/docs/latest/compile.html)
|
||||
To build CCExtractor with a GUI, you will additionally need to install [GLEW](http://glew.sourceforge.net/build.html) and [GLFW](http://www.glfw.org/docs/latest/compile.html)
|
||||
|
||||
In order to compile it you'll need to configure it using autoconf by passing the `-with-gui` option.
|
||||
In order to compile it, you'll need to configure it using autoconf by passing the `-with-gui` option.
|
||||
|
||||
```
|
||||
```bash
|
||||
./autogen.sh
|
||||
./configure --with-gui
|
||||
make
|
||||
@@ -97,110 +113,145 @@ Once set up you can run the GUI interface from the terminal `./ccextractorGUI`
|
||||
|
||||
## macOS
|
||||
|
||||
1. Make sure all the dependencies are met. They can be installed via Homebrew as
|
||||
1. Make sure all the dependencies are met. Decide if you want OCR; if so, you'll need to install tesseract and leptonica.
|
||||
Dependencies can be installed via Homebrew as:
|
||||
|
||||
```
|
||||
```bash
|
||||
brew install pkg-config
|
||||
brew install autoconf automake libtool
|
||||
# optional if you want OCR:
|
||||
brew install tesseract
|
||||
brew install leptonica
|
||||
```
|
||||
|
||||
To verify tesseract and leptonica are detected by pkg-config, e.g.
|
||||
If configuring OCR, use pkg-config to verify tesseract and leptonica dependencies, e.g.
|
||||
|
||||
````
|
||||
```bash
|
||||
pkg-config --exists --print-errors tesseract
|
||||
pkg-config --exists --print-errors lept
|
||||
````
|
||||
|
||||
2. Compiling
|
||||
|
||||
**Using build.command script:**
|
||||
|
||||
```
|
||||
|
||||
### Compiling
|
||||
|
||||
#### Using build.command script:
|
||||
|
||||
```bash
|
||||
cd ccextractor/mac
|
||||
./build.command OCR
|
||||
./build.command # OR ./build.command OCR
|
||||
|
||||
# test your build
|
||||
./ccextractor
|
||||
```
|
||||
|
||||
If you don't want the OCR capabilities, then you don't need to configure the tesseract and leptonica packages, and build it with just
|
||||
#### Using CMake
|
||||
|
||||
```
|
||||
cd ccextractor/mac
|
||||
./build.command
|
||||
|
||||
# test your build
|
||||
./ccextractor
|
||||
```
|
||||
|
||||
**Using CMake**
|
||||
|
||||
```
|
||||
```bash
|
||||
#Create and navigate to directory where you want to store built files
|
||||
|
||||
cd ccextractor/
|
||||
mkdir build
|
||||
cd build
|
||||
|
||||
#Generate makefile using cmake and then compile
|
||||
|
||||
cmake ../src/
|
||||
cmake ../src/ # options here
|
||||
make
|
||||
|
||||
# test your build
|
||||
./ccextractor
|
||||
```
|
||||
|
||||
**Standard compilation through Autoconf scripts :**
|
||||
`cmake` also accepts the options:
|
||||
`-DWITH_OCR=ON` to enable OCR
|
||||
`-DWITHOUT_RUST=ON` to disable rust.
|
||||
`-DWITH_HARDSUBX=ON` to enable burned-in subtitles
|
||||
|
||||
```
|
||||
#### Standard compilation through Autoconf scripts:
|
||||
|
||||
```bash
|
||||
cd ccextractor/mac
|
||||
./autogen.sh
|
||||
./configure
|
||||
./configure # OR ./configure --without-rust
|
||||
make
|
||||
|
||||
# test your build
|
||||
./ccextractor
|
||||
```
|
||||
|
||||
**Compiling with GUI:**
|
||||
#### Compiling with GUI:
|
||||
|
||||
To use CCExtractor with a gui you will additionally need to install GLEW and GLFW. You can do that by installing it via homebrew using:
|
||||
|
||||
```
|
||||
```bash
|
||||
brew install glfw
|
||||
brew install glew
|
||||
```
|
||||
|
||||
In order to compile it you'll need to configure it using autoconf by passing the `-with-gui` option.
|
||||
In order to compile it, you'll need to configure it using autoconf by passing the `-with-gui` option.
|
||||
|
||||
```
|
||||
```bash
|
||||
./autogen.sh
|
||||
./configure --with-gui
|
||||
./configure --with-gui #OR .configure --with-gui --without-rust
|
||||
make
|
||||
```
|
||||
|
||||
Once set up you can run the GUI interface from the terminal `./ccextractorGUI`
|
||||
Once set up, you can run the GUI interface from the terminal `./ccextractorGUI`
|
||||
|
||||
## Windows
|
||||
Dependencies are clang and rust. To enable OCR, rust i686-pc-windows-msvc target should be installed
|
||||
|
||||
Open the windows/ccextractor.sln file with Visual Studio (2015 at least), and build it.
|
||||
Note: Following screenshots and steps are based on Visual Studio 2017, but they should be more or less same for other versions.
|
||||
|
||||
1.Open `windows/` directory to locate `ccextractor.vcxproj`, `ccextractorGUI.vcxproj` (blue arrows) and `ccextractor.sln` (red arrow).
|
||||
|
||||

|
||||
|
||||
2.Accept the security prompt (if any), to proceed with compilation.
|
||||

|
||||
|
||||
3.Using Visual Studio (2015 or above), open ccextractor.sln. This will build both CCExtractor and its GUI. To build them separately, open the respective .vcxproj file.
|
||||
|
||||
4.In Solution Explorer, you'll see two projects with the VS version and Windows release version in parenthesis. Change them to parameters which are true for you by clicking right mouse button on project and selecting properties.
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
5.Right click and select `build` to compile the project and generate executable file.
|
||||
|
||||

|
||||
|
||||
6.Find the executable file in `Debug` or `Release` folder, based on selected configuration.
|
||||
|
||||

|
||||
|
||||
Configurations options are: `(Debug|Release)-Full`
|
||||
|
||||
Configurations options include dependent libraries which are used for OCR.
|
||||
|
||||
**Using CMake**
|
||||
### Using CMake
|
||||
|
||||
You may also generate `.sln` files for Visual Studio and build using build tools, or open `.sln` files using Visual Studio.
|
||||
|
||||
```
|
||||
```bash
|
||||
cmake ../src/ -G "Visual Studio 14 2015"
|
||||
cmake --build . --config Release --ccextractor
|
||||
```
|
||||
|
||||
### Using MSBuild
|
||||
|
||||
Run the following command in `windows/` directory
|
||||
|
||||
```bash
|
||||
msbuild ccextractor.sln /p:Configuration=Release /p:Platform=x64
|
||||
```
|
||||
Different configuration options are,
|
||||
|
||||
| Configuration | Platform | Rust target required |
|
||||
| ------------- |:-------------:| -----:|
|
||||
| Release | x64 | default |
|
||||
| Debug | x64 | default |
|
||||
| Release-Full(OCR) | Win32 | i686-pc-windows-msvc |
|
||||
| Debug-Full(OCR) | Win32 | i686-pc-windows-msvc |
|
||||
|
||||
## Building Installation Packages
|
||||
|
||||
### Arch Linux
|
||||
@@ -210,4 +261,3 @@ Go to the package_creators folder using `cd` and run the `./arch.sh`
|
||||
### Redhat Package Manager (rpm) based Linux Distributions
|
||||
|
||||
Go to the package_creators folder using `cd` and run the `./rpm.sh`
|
||||
|
||||
|
||||
@@ -1,58 +0,0 @@
|
||||
Overview
|
||||
========
|
||||
FFmpeg Integration was done to support multiple encapsulations.
|
||||
|
||||
Dependency
|
||||
=========
|
||||
FFmpeg library's
|
||||
|
||||
Download and Install FFmpeg on your Linux pc.
|
||||
---------------------------------------------
|
||||
|
||||
Download latest source code from following link
|
||||
https://ffmpeg.org/download.html
|
||||
|
||||
then following command to install ffmpeg
|
||||
./configure && make && make install
|
||||
|
||||
Note:If you installed ffmpeg on non-standard location, please change/update your
|
||||
environment variable $PATH and $LD_LIBRARY_PATH
|
||||
|
||||
Download and Install FFmpeg on your Windows pc.
|
||||
----------------------------------------------
|
||||
Download prebuild library from following link
|
||||
http://ffmpeg.zeranoe.com/builds/
|
||||
|
||||
You need to download Shared Versions to run the program and Dev Versions to compile.
|
||||
|
||||
How to compile ccextractor
|
||||
==========================
|
||||
|
||||
In Linux
|
||||
--------
|
||||
make ENABLE_FFMPEG=yes
|
||||
|
||||
On Windows
|
||||
----------
|
||||
put the path of libs/include of ffmpeg library in library paths.
|
||||
Step 1) In visual studio 2013 right click <Project> and select property.
|
||||
Step 2) Select Configuration properties in left panel(column) of property.
|
||||
Step 3) Select VC++ Directory.
|
||||
Step 4) In the right pane, in the right-hand column of the VC++ Directory property,
|
||||
open the drop-down menu and choose Edit.
|
||||
Step 5) Add path of Directory where you have kept uncompressed library of FFmpeg.
|
||||
|
||||
|
||||
Set preprocessor flag ENABLE_FFMPEG=1
|
||||
Step 1) In visual studio 2013 right click <Project> and select property.
|
||||
Step 2) In the left panel, select Configuration Properties, C/C++, Preprocessor.
|
||||
Step 3) In the right panel, in the right-hand column of the Preprocessor Definitions property, open the drop-down menu and choose Edit.
|
||||
Step 4) In the Preprocessor Definitions dialog box, add ENABLE_FFMPEG=1. Choose OK to save your changes.
|
||||
|
||||
Add library in linker
|
||||
Step 1) Open property of project
|
||||
Step 2) Select Configuration properties
|
||||
Step 3) Select Linker in left panel(column)
|
||||
Step 4) Select Input
|
||||
Step 5) Select Additional dependencies in right panel
|
||||
Step 6) Add all FFmpeg's lib in new line
|
||||
50
docs/FFMPEG.md
Normal file
@@ -0,0 +1,50 @@
|
||||
# Overview
|
||||
|
||||
FFmpeg Integration was done to support multiple encapsulations.
|
||||
|
||||
## Dependencies
|
||||
FFmpeg libraries
|
||||
|
||||
### Download and Install FFmpeg on your Linux pc:
|
||||
Download latest source code from following link
|
||||
https://ffmpeg.org/download.html
|
||||
|
||||
Then following command to install ffmpeg:
|
||||
`./configure && make && make install`
|
||||
|
||||
Note:If you installed ffmpeg on non-standard location, please change/update your
|
||||
environment variable `$PATH` and `$LD_LIBRARY_PATH`
|
||||
|
||||
### Download and Install FFmpeg on your Windows pc:
|
||||
Download prebuilt library from following link:
|
||||
http://ffmpeg.zeranoe.com/builds/
|
||||
|
||||
You need to download Shared Versions to run the program and Dev Versions to compile.
|
||||
|
||||
## How to compile ccextractor
|
||||
|
||||
### On Linux:
|
||||
`make ENABLE_FFMPEG=yes`
|
||||
|
||||
### On Windows:
|
||||
#### Put the path of libs/include of ffmpeg library in library paths.
|
||||
1. In visual studio 2013 right click <Project> and select property.
|
||||
2. Select Configuration properties in left panel(column) of property.
|
||||
3. Select VC++ Directory.
|
||||
4. In the right pane, in the right-hand column of the VC++ Directory property, open the drop-down menu and choose Edit.
|
||||
5. Add path of Directory where you have kept uncompressed library of FFmpeg.
|
||||
|
||||
|
||||
#### Set preprocessor flag `ENABLE_FFMPEG=1`
|
||||
1. In visual studio 2013 right click <Project> and select property.
|
||||
2. In the left panel, select Configuration Properties, C/C++, Preprocessor.
|
||||
3. In the right panel, in the right-hand column of the Preprocessor Definitions property, open the drop-down menu and choose Edit.
|
||||
4. In the Preprocessor Definitions dialog box, add `ENABLE_FFMPEG=1`. Choose OK to save your changes.
|
||||
|
||||
#### Add library in linker
|
||||
1. Open property of project
|
||||
2. Select Configuration properties
|
||||
3. Select Linker in left panel(column)
|
||||
4. Select Input
|
||||
5. Select Additional dependencies in right panel
|
||||
6. Add all FFmpeg's lib in new line
|
||||
@@ -20,6 +20,10 @@ Linux
|
||||
Make sure Tesseract, Leptonica and FFMPeg are installed, and that their libraries can be found using pkg-config.
|
||||
Refer to OCR.txt for installation details.
|
||||
|
||||
FFmpeg from packages (on Debian) plus a couple of other dependencies you will need:
|
||||
sudo apt-get install libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libxcb-shm0-dev liblzma-dev
|
||||
|
||||
FFmpeg from source:
|
||||
To install FFmpeg (libav), follow the steps at:-
|
||||
https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu - For Ubuntu, Debian and Linux Mint
|
||||
https://trac.ffmpeg.org/wiki/CompilationGuide/Generic - For generic Linux compilation
|
||||
|
||||
61
docs/OCR.md
@@ -1,36 +1,38 @@
|
||||
|
||||
Overview
|
||||
========
|
||||
# Overview
|
||||
OCR (Optical Character Recognition) is a technique used to
|
||||
extract text from images. In the World of Subtitle, subtitle stored
|
||||
in bitmap format are common and even necessary for converting subtitle
|
||||
in bitmap format are common and even necessary. For converting subtitle
|
||||
in bitmap format to subtitle in text format OCR is used.
|
||||
|
||||
Dependency
|
||||
==========
|
||||
# Dependency
|
||||
1. Tesseract (OCR library by Google)
|
||||
2. Leptonica (Image processing library)
|
||||
|
||||
Ubuntu install Dependency using package manager
|
||||
===============================================
|
||||
# How to compile CCExtractor on Linux with OCR
|
||||
|
||||
## Install Dependency
|
||||
|
||||
### Using package manager
|
||||
#### Ubuntu, Debian
|
||||
```
|
||||
sudo apt-get install libleptonica-dev libtesseract-dev tesseract-ocr-eng
|
||||
```
|
||||
#### Suse
|
||||
```
|
||||
zypper install leptonica-devel
|
||||
```
|
||||
|
||||
How to compile CCExtractor on Linux with OCR
|
||||
=============================================
|
||||
### Downloading source code and compiling it.
|
||||
|
||||
Download and Install Leptonnica.
|
||||
-------------------------------
|
||||
#### Leptonnica.
|
||||
This package is available in your distro, you need liblept-devel library.
|
||||
|
||||
If Leptonica isn't available for your distribution, or you want to use a newer version
|
||||
than they offer, you can compile your own.
|
||||
|
||||
you can download lib leptonica from http://www.leptonica.com/download.html
|
||||
you can download lib leptonica source code from http://www.leptonica.com/download.html
|
||||
|
||||
Download and Install Tesseract.
|
||||
-------------------------------
|
||||
#### Tesseract.
|
||||
Tesseract is available directly from many Linux distributions. The package is generally
|
||||
called 'tesseract' or 'tesseract-ocr' - search your distribution's repositories to
|
||||
find it. Packages are also generally available for language training data (search the
|
||||
@@ -57,13 +59,32 @@ Note:
|
||||
2. *Tesseract training data* https://github.com/tesseract-ocr/tessdata/archive/3.04.00.tar.gz
|
||||
|
||||
|
||||
##Compilation
|
||||
|
||||
Compile CCExtractor passing flags like following
|
||||
-------------------------------------------------
|
||||
###using Build script
|
||||
```
|
||||
make ENABLE_OCR=yes
|
||||
cd ccextractor/linux
|
||||
./build
|
||||
```
|
||||
|
||||
### Passing flags to configure
|
||||
```
|
||||
cd ccextractor/linux
|
||||
./autogen.sh
|
||||
./configure --with-gui --enable-ocr
|
||||
make
|
||||
```
|
||||
|
||||
### Passing flags to cmake
|
||||
```
|
||||
cd <CCExrtactor cloned code>
|
||||
mkdir build
|
||||
cd build
|
||||
cmake -DWITH_OCR=ON ../src
|
||||
make
|
||||
```
|
||||
|
||||
|
||||
|
||||
How to compile CCExtractor on Windows with OCR
|
||||
===============================================
|
||||
@@ -72,7 +93,7 @@ Download prebuild library of leptonica and tesseract from following link
|
||||
https://drive.google.com/file/d/0B2ou7ZfB-2nZOTRtc3hJMHBtUFk/view?usp=sharing
|
||||
|
||||
put the path of libs/include of leptonica and tesseract in library paths.
|
||||
1. In visual studio 2013 right click <Project> and select property.
|
||||
1. In visual studio 2013 right click <Project> and select property.
|
||||
2. Select Configuration properties in left panel(column) of property.
|
||||
3. Select VC++ Directory.
|
||||
4. In the right pane, in the right-hand column of the VC++ Directory property, open the drop-down menu and choose Edit.
|
||||
@@ -99,4 +120,4 @@ https://code.google.com/p/tesseract-ocr/downloads/list
|
||||
after downloading the tesseract-ocr-3.02.eng.tar.gz extract the tar file and put
|
||||
tessdata folder where you have kept CCExtractor executable
|
||||
|
||||
Copy the tesseract and leptonica dll from lib folder downloaded from above link to folder of executable or in system32.
|
||||
Copy the tesseract and leptonica dll from lib folder downloaded from above link to folder of executable or in system32.
|
||||
|
||||
@@ -1,246 +0,0 @@
|
||||
This is the main documentation of Python extension module for CCExtractor:
|
||||
|
||||
====
|
||||
CCExtractor Library
|
||||
|
||||
----
|
||||
Refactoring the codebase into a library
|
||||
Earlier version of CCExtractor was compiled as a binary and could not be used as a library. The entire codebase was executed via a single main function defined in ccextractor.c and this architecture was not suitable for extending ccextractor source code to a library. Hence, many modifications were made to ccextractor.c so that conversion to a library could be done. Major modifications were:
|
||||
Segmenting the larger functions into smaller functions so that they could be called from one main function. Earlier the entire processing was carried out from one main function itself. This was not a good idea considering the possibility for library. This would allow the user to set the parameters to be passed to CCExtractor from Python with one parameter at a time and not the entire list of all parameters together.
|
||||
The refactoring of the code base and architectural judgements as to how the code should be segmented so that the entire working remains the same and also the library structure could be established.
|
||||
Apart from these changes, the header file ccextractor.h was also included into the codebase to define many global variables as well as the function declarations of definitions made in ccextractor.c. The major changes could be seen at this PR (merged). However, following the next stages of development after the changes made in the above mentioned PR, the final structure could be found at ccextractor.c and ccextractor.h.
|
||||
|
||||
----
|
||||
Definitions made in ccextractor.h
|
||||
In ccextractor.h, the major changes included declaring global variables which would be accessible throughout the codebase for calling the respective callbacks (discussed later in the documentation) from C to Python for processing the caption frames in Python as they are extracted in CCExtractor. So we need a global variable to store the py callback function for the future using which type is PyObject*.
|
||||
The major point to note is that the compilation of Python extension module includes setting a macro PYTHON_API which acts as an indication that the compilation is made for Python extension module and this helps in declaring as well as defining the functions which are only needed for Python extension module. As defined here, the PYTHON_API macro is used to define the functions/variables which are needed only by the extension module.
|
||||
Another major advantage of defining the macro PYTHON_API is that the definitions made for Python extension module only need python-dev package as a prerequisite for compilation. However, if the user wants to compile only CCExtractor and not the Python extension module, then the code should not have python-dev package as a dependency. This has been attained by using macro PYTHON_API and C pre-processors.
|
||||
|
||||
====
|
||||
CCExtractor Python Extension Module
|
||||
|
||||
----
|
||||
Extension module dependencies
|
||||
|
||||
1. SWIG
|
||||
For generation of the wrappers of the C code base, which would then be used to compile the extension module, I have used SWIG (swig-3.0.12). The entire compilation has been included in a build script (discussed later) and the user need not have prior knowledge of SWIG to get started.
|
||||
For compiling the Python extension module, the second dependency in addition to the dependencies of CCExtractor is SWIG. The user can follow these installation steps for getting SWIG installed.
|
||||
For generating the wrappers of the C/C++ code in a user required language, the user needs to have a basic understanding of the interface file which is used by SWIG. However, in case of generating the extension module for CCExtractor, the interface file has been written and is available here. SWIG uses this interface file to generate the wrappers for CCExtractor which are then compiled to form the extension module.
|
||||
2. Python-dev package
|
||||
|
||||
----
|
||||
Overall architecture
|
||||
|
||||
The entire Python Extension module related work is done in the api/ directory with modifications to the CCExtractor codebase to integrate the divergent path, CCExtractor would take if the processing is done via Python module.
|
||||
|
||||
----
|
||||
Generating the Python extension module:
|
||||
|
||||
For this project, I have mainly used two build scripts, viz., build_api and build_library which are both present in the api/ directory. For generating the Python bindings, user need to just run the build_library script as ./build_library. This would internally generate the SWIG wrappers from the SWIG interface file (ccextractor.i) present in the same directory. The user should note that if the user has not installed SWIG, the the compilation would stop at this step itself. Once the wrappers are generated, then the build_library script would execute the build_api script which would compile the entire code base of CCExtractor along with the wrappers generated by SWIG. In addition to this, build_api would also compile the wrappers defined in the wrappers/ directories. Once the compilation is successful, then build_library would generate a shared library called _ccextractor.so from the entire code which would be shared object for the module.
|
||||
In addition to generating the wrapper codes generated by SWIG, it also outputs the ccextractor.py which would be later used as Python extension module for accessing CCExtractor functionality via Python.
|
||||
As mentioned in earlier section, the build_api compiles the entire code base with an option -DPYTHON_API which is used by GCC to define a macro PYTHON_API. This macro then acts as a signal telling that the extension module is being generated and the bindings dependency need a check as well as the bindings dependent functions need to be defined.
|
||||
|
||||
----
|
||||
Workflow of Python extension module
|
||||
|
||||
The following section encompasses on the detailed description of the entire workflow of Python extension modules and the importance of each function in the codeflow. An example usage has been done in api_testing.py.
|
||||
|
||||
****
|
||||
api_init_options
|
||||
Function declaration- struct ccx_s_options* api_init_options()
|
||||
This function returns an initialized instance of struct ccx_s_options which is modified in CCExtractor according to the values of the parameters provided by the user while executing CCExtractor.
|
||||
****
|
||||
check_configuration_file
|
||||
Function declaration- void check_configuration_file(struct ccx_s_options api_options)
|
||||
This function is used to check the configuration file and it takes the struct ccx_s_options instance as returned by api_init_options().
|
||||
****
|
||||
api_add_param
|
||||
Function declaration- void api_add_param(struct ccx_s_options* api_options,char* arg)
|
||||
The api_add_param function is used to add user passed parameters to the struct ccx_s_options instance which would be used to compile the parameters and make the necessary modifications in the working of CCExtractor.
|
||||
This function takes the instance of struct ccx_s_options passed to check_configuration_file function and also, the string denoting the parameter passed by the user.
|
||||
The parameters are added to the python_params element of struct ccx_s_options and the count of the parameters is kept in python_param_count.
|
||||
****
|
||||
my_pythonapi
|
||||
Function declaration- void my_pythonapi(struct ccx_s_options *api_options, PyObject *callback_func)
|
||||
The my_pythonapi is aimed to provide a Python api to add the callback function when the subtitle extractor had done everyline
|
||||
Thus, it can been observed that my_pythonapi takes two arguments when the compilation is done as extension module. In both the case, the first argument is struct ccx_s_options instance as used by api_add_param. But in case of compiling the extension module, the my_pythonapi function takes a second parameter which is the python callback function that CCExtractor would call when passing values from C to Python (a detailed discussion about this has been done later).
|
||||
This function is not a mandatory function to call when using the CCExtractor binary.
|
||||
****
|
||||
compile_params
|
||||
Function declaration- int compile_params(struct ccx_s_options *api_options,int argc)
|
||||
The compile_params function mainly compiles all the parameters supplied by the user and modifies the elements of the api_options on the basis of the parameters supplied by the user.
|
||||
In this function, we add a dummy parameter ./ccextractor so that the parse_params function which is called from compile_params function properly compiles all the parameter except the first parameter as done in here.
|
||||
This function then returns the return value as obtained by the parse_params function.
|
||||
****
|
||||
api_start
|
||||
Function declaration- int api_start(struct ccx_s_options api_options)
|
||||
This is the most important function of entire processing done by CCExtractor. After the entire compiling of parameters have been completed, then comes the stage when the actual processing is done.
|
||||
The api_start is the function which is majorly responsible for extracting the caption frames and passing them back to Python for processing.
|
||||
|
||||
The user should note that the codeflow discussed above till this point is generic to both CCExtractor binary as well as CCExtractor’s Python extension module. From this point onwards, the codeflow that has been described is mainly how the Python extension module accepts the caption frames via callback function and then processings done on the caption frames to generate the output subtitle file (.srt) via Python.
|
||||
|
||||
The api_start function in case of CE-608 captions calls a function general_loop for processing of the sample(video) that needs to be processed which in turn makes a call to encode_sub which encodes the subtitle buffer obtained from the sample.
|
||||
In encode_sub function, the sub_type is checked to be CE-608. If the sub_type is 608, then a call to pass_cc_buffer_to_python is made. Otherwise, the processing continues as if the call for processing was made from CCExtractor binary.
|
||||
From the pass_cc_buffer_to_python function, the call is made to the extractor function, then the extractor function in turns calls the callback function provided earlier via my_pythonapi function. The arguments given to the callback function are the ones corresponding to the information content of the caption frame which has been processed by CCExtractor. This information is accessed via the Python SRT generator scripts which would process the caption frames and write the processed information in the output subtitle files.
|
||||
The following sections would be sequential in-detail descriptions about how each process functions:
|
||||
|
||||
----
|
||||
Python Encoder for CCExtractor
|
||||
|
||||
Following the architecture of CCExtractor’s codebase, a new file named ccx_encoders_python.c was added. The main reason of adding this file was to define the functions which would be called when the extraction process or CCExtractor extraction functionality is being performed via Python extension module. At this moment, since the extension module extends support only for CE-608 samples, only pass_cc_buffer_to_python function has been defined. Later on, when the binding’s support is extended to support other formats then in that case other functions like pass_cc_bitmap_to_python and others would be included in this file following the architecture of other encoders.
|
||||
****
|
||||
pass_cc_buffer_to_python
|
||||
Function declaration- int pass_cc_buffer_to_python(struct eia608_screen *data, struct encoder_ctx *context)
|
||||
This is the function where the actual work of passing the extracted caption buffer to Python extension modules for processing the caption frames is done.
|
||||
The pass_cc_buffer_to_python function is called when the sample from which the caption frames are to be extracted is a CE-608 sample and the call for extraction is made from Python extension module.
|
||||
In this function, whenever a caption frame element is extracted, be it the srt_counter, caption timing information or any information related to the text, font or color grid of the CE-608 captions, then that information is passed to extractor function defined in extractors/ directory. A detailed description about how exactly the extractors function would be included in the next section.
|
||||
|
||||
----
|
||||
Extractors for bindings
|
||||
|
||||
As documented in the previous section, when the extraction of CE-608 caption frames in done via Python, then the call is made to pass_cc_buffer_to_python function defined in ccx_encoders_python.c. In this function, after extracting lines in a caption frame (lines may belong to any of the text, font or color grid for CE-608), those lines are passed to python_extract_g608_grid function defined also in ccx_encoders_python.c.
|
||||
****
|
||||
python_extract_g608_grid
|
||||
Function declaration- void python_extract_g608_grid(unsigned h1, unsigned m1, unsigned s1, unsigned ms1, unsigned h2, unsigned m2, unsigned s2, unsigned ms2, char* buffer, int identifier, int srt_counter, int encoding)
|
||||
The main aim of using python_extract_g608_grid function is to able to identify the lines belonging to a particular frame and then passing these lines to the Python callback function with added identifiers for identification as to which CE-608 grid those lines belong to in a particular caption frame. More documentation about the identifiers and the nomenclature used for the bindings has been documented in the ‘Support for only CE-608 captions’ section and the user is advised to read that section to get a better understanding of the nomenclature.
|
||||
The arguments passed to python_extract_g608_grid include encoding which is the encoding that CCExtractor would have used to write the output subtitle file. Thus, the encoding is passed from CCExtractor to Python via the callback function so that the output subtitle file generated by Python would have the same encoding as the output generated by CCExtractor would have had.
|
||||
Out of all the arguments that are passed to the python_extract_g608_grid function, the one interesting argument is the identifier argument which has different values depending on the type of caption frame line it is called with. For example, if the line passed to python_extract_g608_grid function is a line belonging to its color grid, then the value of the identifier would be 2. Similarly, we have:
|
||||
identifier = 0 -> adding start and end time
|
||||
identifier = 1 -> subtitle
|
||||
identifier = 2 -> color
|
||||
identifier = 3 -> font
|
||||
identifier = 4 ---> end of frame
|
||||
This is how the python_extract_g608_grid function is able to generate the entire caption frame for a CE-608 sample along with timings.
|
||||
|
||||
----
|
||||
Callback Function architecture
|
||||
|
||||
When using the extension module, when a particular C function is called from Python, the control is transferred to C and returned to Python only after the execution of the function. However, according to the adopted architecture, a single function would process the entire sample and extract all the caption frames until the control is passed back to Python for processing the captions in Python. Thereupon, for further processing in Python the user would have had to wait until the end of the extraction of all the caption frames from the sample. This would violate the basic ideology that the module should be able to process the caption frames in Python as they are extracted in CCExtractor rather than waiting till the end of extraction from the entire sample.
|
||||
As a result of this, the callback function architecture was adopted. The main advantage of this architecture is that the moment a line from the caption frame is extracted the line is passed via a callback function to Python and the processing of the extracted line could be done in Python.
|
||||
In the present architecture, the user has a flexibility to tell CCExtractor which Python function would act as a callback function and a mechanism has been designed to convey this function to CCExtractor. This has been done with the use of my_pythonapi function as discussed in the previous sections.
|
||||
NOTE: In the api_testing.py, I have defined the callback function to be named callback. However, the user has complete freedom to define any name for the callback function. The user needs to note that the callback function would be getting nothing but a line from the caption frame that is extracted by CCExtractor. Further processing of the extracted line is the responsibility of the user.
|
||||
After defining the callback function, the user needs to make sure that this function is passed via Python to CCExtractor so that it can be used for callback. For doing so, the user needs to set the second argument of the function my_pythonapi as the callback function. This has been done in the api_testing.py script and the user can refer to it for example.
|
||||
A detailed description about why a single line of the caption frame is passed via the callback function and not the entire frame is described in detail in later sections.
|
||||
Also, when the user passes the callback function via Python to CCExtractor so the my_pythonapi function saves a pointer to this function as an element to a global structure, array, defined and declared in ccextractor.h. The element reporter holds the callback function passed by user via Python.
|
||||
Whenever the user wants to pass a line to the callback function then the user needs to call the function py_callback which has been defined in ccextractor.c.
|
||||
****
|
||||
py_callback
|
||||
Function declaration- void py_callback(char *line, int encoding);
|
||||
The py_callback function takes two arguments and their description is as follows:
|
||||
The first argument is the line which needs to be passed to Python.
|
||||
The second is the line's encoding.
|
||||
This is how the callback mechanism works for passing the lines from C to Python in real time.
|
||||
|
||||
----
|
||||
Processing output in Python
|
||||
|
||||
As described in the previous sections, the extension modules just return a single line from the caption frames. The processing of the caption frames to generate the output subtitle file is done in Python.
|
||||
A script to generate an output subtitle file from the extracted captions frames in Python has been written. The api_testing.py has a function named callback which acts as a callback function returning the extracted caption lines in Python. These lines then are passed to generated_output_srt in api_support.py described in the api/ directory. Thereupon, the function searches if the line has specific identifier which are used to decide how the output would be generated. A detailed section has been included in this documentation regarding the nomenclature used for processing different lines in CE-608 format caption fields (Support for only CE-608 captions section). The main reason for doing so is to avoid any buffering in C to hold the caption lines until the entire caption frames are extracted. This facilitates real time processing of the extracted caption frames.
|
||||
For getting the output filename from CCExtractor which would then be used to write the output srt file from Python, whenever the code is run from the extension module the first line that is passed via the callback function is the output filename generated by CCExtractor. This is incorporated by calling the callback function from init_write function defined in the src/lib_ccx/output.c file. The line passed to the callback function is of the format filename-<name of the output file to be generated> and this is then used to generate the output file. This line is then captured in the generate_output_srt function defined in the api_support.py.
|
||||
However, if the user wants the flexibility of defining the filename in a different manner, then for such outputs, the user must make changes in the generate_output_srt function to set the filename and ignoring the first line that appears in Python via the callback function.
|
||||
|
||||
----
|
||||
Support for only CE-608 captions:
|
||||
|
||||
For understanding the CE-608 caption format, the user is advised to refer to this documentation on CE-608.
|
||||
|
||||
The Python extension module is so far able to extract the captions frames from CE-608 samples. In samples with CE-608, the caption frames that are extracted by CCExtractor are in the form a 15x32 grid which depicts the screen. Thus, the information regarding the font of the captions, the colour they would be having on the screen as well as their alignment on the screen is captured in font,color and text grids respectively.
|
||||
Using Python modules each of such grids can be accessed in Python. However, as described in the previous section the callback function gets a single line and not the entire grid from CCExtractor, some processing needs to be done in Python for getting the user required grids per caption frames.
|
||||
The functions which would be acting as the processing and buffering functions for grid generations are present in the ccx_to_python_g608.py. The two major functions are return_g608_grid and g608_grid_former. The g608_grid_former is mainly used to form the grid from lines obtained at the callback function.
|
||||
The main advantage of the return_g608_grid function is that the user can generate whatever pattern the user desires to process in Python. For accessing various different combinations of the font, color and text grids in CE-608, a help_string has been defined in the return_g608_grid function in the ccx_to_python_g608.py file which describes on the value of mode to be passed to this function to get proper combination of the grids.
|
||||
In the earlier sections it has been stated that the callback function in Python is not passed with the entire caption frame but just one single line from the frame, a particular nomenclature has been devised to make sure that the lines belonging to the same caption frames are identified in the Python interface. The nomenclature is as follows:
|
||||
For every frame, the first line that is passed to the callback function is the srt_counter which indicates the identifier value of the caption frame that would be extracted next.
|
||||
Following the srt_counter, the next line would contain a conjunction of the start time and end time of the caption frame with respect to the timings when the captions would be visible on the screen. The start_time and end_time would be conjuncted as start_time-<start time>\t end_time-<end time>\n and the user needs to process this line to get the timings. This processing in case of getting a srt file as an output has been done in the generate_output_srt function.
|
||||
After the timings have been sent via the callback function, until the next srt_counter is extracted, the lines containing information about the color, font or text grids of CE-608 samples are passed via the callback function to Python.
|
||||
For processing the grids separately, the color grid could be identified by identifying the presence of color[<srt_counter value>]:<color grid line> in the line obtained from the callback function. Similarly, for the font and text grids, the nomenclatures are font[<srt_counter value>]:<font grid line> and text[<srt_counter value>]:<text grid line> respectively. Processing a grid on the basis of such a nomenclature has been done in the g608_grid_former in the ccx_to_python_g608.py file.
|
||||
After the entire caption frame has been sent via the callback function to Python for further processing, when the extraction of present caption frames finishes and CCExtractor shifts to a new frame, then a line containing ***END OF FRAME*** is passed via the callback function from C to Python. The user needs to catch this line in order to get the signal that from the next line onwards a new caption frame would begin. Similar approach has been implemented in the function generate_output_srt in the api_support.py file.
|
||||
This is how the entire CE-608 is transmitted to Python and the user needs to follow the nomenclature in order to get the caption frames in Python.
|
||||
However, if the user thinks to modify the nomenclature in accordance with some other nomenclature that suits their use case, then the user can do so by editing the python_extract_g608_grid function in the ccx_encoders_python.c file. In this file, the user needs to find the lines where the function py_callback is called with its parameter which are subtitle line and encoding.
|
||||
|
||||
----
|
||||
Wrappers for the extension module
|
||||
|
||||
In case of using an API, it is highly desired to set the parameters desired by the user not via command line but as call to built-in functions. This gave rise to the necessity of wrapper functions which can be called to set certain parameters for directing the functioning of the bindings.
|
||||
The wrappers have been defined in the wrapper.c file in api/wrappers/ directory. The user can use just call the wrappers to set some parameters. More wrappers can be defined according to the architecture followed in wrapper.c.
|
||||
The user needs to note that the wrappers can be called anytime in between adding parameters to CCExtractor instance (as done in api_testing.py) and before calling the compile_params function from the CCExtractor module.
|
||||
Another thing to note about the wrapper is that, the my_pythonapi wrapper function is a very important wrapper function. It tells CCExtractor that the call has been made using the Python module and thus the functioning of CCExtractor is altered. Hence, if the user intends to use the Python module the user is always advised to call this wrapper function with its first argument to be the object returned by api_init function from CCExtractor module and second argument being the callback function which would be called by the CCExtractor to pass the extracted caption lines back to Python.
|
||||
|
||||
----
|
||||
Test Script
|
||||
|
||||
Once the Python module are generated then the user can use them by importing ccextractor module in Python.
|
||||
For testing the output of the bindings a test script, api_testing.py. But to mention, the module at this stage only supports generating a subtitle file from the CE-608 standard samples only.
|
||||
Another testing feature, that has been added is that the user can use recursive_tester.py to generate the subtitle files for all the samples from a directory. The only parameter needed to run this script is the location of all the samples.
|
||||
|
||||
----
|
||||
Silent API
|
||||
|
||||
The Python bindings have been designed in such a way that the API is silent in itself as well as in the form of output generation. Silent in itself means that the API doesn’t write out any output to the STDOUT and the entire output of CCExtractor is silenced when the module is used for extraction of caption frames. This feature has been made possible by passing a parameter -pythonapi internally in api_testing.py using the function my_pythonapi() from the ccextractor module. The -pythonapi internally makes CCExtractor to silence all the outputs that could have been generated otherwise.
|
||||
If the user wants to add some print functionality from the CCExtractor, then may be defining the prints using printf C function could be an option. Note that the user cannot use the mprint function to get prints from the extension module from inside the CCExtractor C code part as used in CCExtractor to get the desired STDOUT prints as these are silenced via -pythonapi.
|
||||
|
||||
====
|
||||
Work status
|
||||
The proposal made by me for this project had a major component of multi-threading to let CCExtractor’s Python bindings run the CCExtractor’s extraction process in multi-threads.
|
||||
However, the end goal was modified while the GSOC 2017 coding period and after Second Phase Evaluation, the main aim was to create a Python extension module for CCExtractor which could process CE-608 video samples, extract the caption information present in them and pass this information to Python for further processing. The module was expected to be silent and the output generation from the caption information present in the video sample has to be done via Python.
|
||||
The present status of the extension module is that the module can extract caption information from CE-608 standard video samples and pass the caption information to Python. Further work has also been done to process this caption information to generate an output subtitle(srt) file (the user is advised to check completion of comparing_text_font_grids function sub-section under the future work section).
|
||||
|
||||
====
|
||||
Future Work
|
||||
|
||||
----
|
||||
Identifying the input format and raising errors if unsupported
|
||||
|
||||
CCExtractor does not process any non-video files. Similarly, the processing of non-video files is not supported by extension module. However, since the API has been designed to be silent, the module doesn’t output any error log stating that the input file is a non-video file and it cannot be processed.
|
||||
This is a much desired feature and the present version of CCExtractor extension module lacks this feature. I would be working on this feature post GSOC 2017 but if any user finds that this feature has not been added until they start contribution to CCExtractor’s extension module, then their work on this feature would be highly appreciated.
|
||||
For adding this feature to extension module, the extension module must be extended to process the return value from CCExtractor as done in the api_start function. When the sample (non-video) is processed via CCExtractor’s binary, then the processing is stopped by raising an ‘Invalid option to CCExtractor Library’ error. However, since the extension module has been designed to be silent, this error message is suppressed. Hence, the user should extend the test scripts to process the return value of api_start function in python extension module according to the constants defined in ccx_common_common.h
|
||||
|
||||
----
|
||||
Callback class mechanism
|
||||
|
||||
The present architecture uses a callback mechanism to pass the extracted caption lines from the caption frames of CE-608 captions to Python for further processing. In the callback mechanism, a callback function is supplied to CCExtractor in C via the my_pythonapi function which stores the callback function as a PyObject* in the global variable array. However, according to Python documentation on C-API, everything in Python is a PyObject; be it a function, a tuple or a class.
|
||||
So, the ideology is to replace the present callback function by a class which can have many methods that the user can use for different use cases.
|
||||
An example of such an implementation has been done here. The user needs to note that for accessing the Python class in C, some modifications need to be done to the py_callback function defined in ccextractor.c and a sample example for calling a class method named ‘callback’ could be found here.
|
||||
Also, an important point to be noted in this case is that the user needs to pass the callback function’s name to run function in C so that the corresponding callback method of the class passed via my_pythonapi could be called via C. As an example, the callback method’s name has been provided here.
|
||||
For understanding the exact implementation of this approach, I would recommend the user to understand C-API for Python as the documentation is quite extensive to every use case.
|
||||
|
||||
----
|
||||
Completion of comparing_text_font_grids function
|
||||
|
||||
The Python extension module for CCExtractor is able to pass lines of the caption frames for different grids of CE-608 captions. However, for generating the subtitle file from the caption grids, the text grid needs to be modified according to the color grid as well as font grid. In CCExtractor, this job is done at the function, get_decoder_line_encoded.
|
||||
For generation of subtitle files (.srt files) from Python, an equivalent version of get_decoder_line_encoded has been implemented in Python and has been defined as comparing_text_font_grids in python_srt_generator.py
|
||||
However, as the user can note that this function is not a complete implementation of get_decoder_line_encoded function, completion of this function’s definition is a matter of future work.
|
||||
|
||||
----
|
||||
Adding more wrapper functions
|
||||
|
||||
As described in the ‘Wrappers for the extension module’ section, more wrapper functions are needed to be declared in the wrapper.c file. For example, few wrappers have been defined. More wrapper functions can be defined in a similar manner.
|
||||
Extending the module to support other caption formats
|
||||
In this version, CCExtractor’s extension module supports processing of video samples having CE-608 standard captions in them and writing these captions to output subtitle (.srt) files.
|
||||
However, CCExtractor in itself has support for other caption standards like DVB, 708 etc. So, extension of module to extract of caption information from samples containing the caption information in these formats is a future task.
|
||||
The user should note that the information passed from CE-608 to Python is in raw form as lines which are then used to form the 608 grids. Similarly, the extension to other formats must consider passing the raw information of caption in respective format and then processing the information extracted by CCExtractor in Python.
|
||||
While extending, the architecture to be followed for ccx_encoders_python should be consistent to other encoders in the codebase to maintain uniformity. Thus for DVB samples, a function name pass_cc_bitmap_to_python and for 708 samples pass_cc_subtitle_to_python need to be declared in ccx_encoders_python.c.
|
||||
|
||||
====
|
||||
PyPI module
|
||||
(This section is for contributors who want to upload the package to PyPI)
|
||||
The PyPI module that has been uploaded has many things added to the CCExtractor code tree and all of this can be found here (branch - manifest_file).
|
||||
The contributor is advised to use the documentation at ‘An Introduction to Distutils’ and its subsequent parts to understand this section.
|
||||
The overall strategy or steps that have been followed to generate the distribution for being uploaded to PyPI is as follows:
|
||||
|
||||
----
|
||||
Adding files to distribution and generating the distribution
|
||||
|
||||
All the files that are needed to be included in the package distribution are to be added the MANIFEST file as done here. For understanding the syntax used in MANIFEST file the user can check this documentation.
|
||||
After the MANIFEST file has been written properly, the user can generate the distribution package by the command
|
||||
python setup.py sdist
|
||||
This command would generate the distribution on the basis of MANIFEST file and place in the dist/ directory as a .tar.gz file until specified otherwise by the user.
|
||||
One thing to mention about the MANIFEST file is that it can only include files/folders from the folder it is defined within. It cannot include directories/files from parent directory or any other child directory. However, in the MANIFEST file I used, I have added the symlink to src main src directory so that the source code can be added to the package distribution via the MANIFEST file.
|
||||
|
||||
----
|
||||
An analysis of the setup.py file used
|
||||
|
||||
The setup.py has been used to install the Python module on the user system. To understand what all the parameters mean in setup the user must refer to this documentation.
|
||||
The cmdclass defined at line is a very important part of the script as it internally makes call to the scripts included in package_build_scripts. A point to note is that this directory is used to include the scripts into the package distribution via the MANIFEST file.
|
||||
The scripts in package_build_scripts are the scripts which do the actual compilation of the source code to required python module and shared object. The user is advised to refer to build_library_package and build_api_package to understand how to compilation process takes place. The user may also refer to this documentation for understanding how the build scripts work.
|
||||
For any modifications made to the build scripts, viz, build_library and build_api corresponding modifications are to be made to the scripts included in package_build_scripts so that the compilation does not fail while installing the Python extension module.
|
||||
The ccextractor.i used in the package_build_scripts is an interface file used by SWIG to generate the wrapper codes. This is an essential part and should always be present with the distribution.
|
||||
@@ -1,20 +1,16 @@
|
||||
CCExtractor
|
||||
(check AUTHORS.TXT for history and developers)
|
||||
----------------------------------------------
|
||||
## CCExtractor
|
||||
check AUTHORS.TXT for history and developers
|
||||
|
||||
License
|
||||
-------
|
||||
## License
|
||||
GPL 2.0.
|
||||
|
||||
|
||||
Description
|
||||
-----------
|
||||
## Description
|
||||
Since the original port, the whole code has been rewritten (more than once,
|
||||
one might add) and support for most subtitle formats around the world has
|
||||
been added (teletext, DVB, CEA-708, ISDB...)
|
||||
|
||||
Basic Usage
|
||||
-----------
|
||||
## Basic Usage
|
||||
(please run ccextractor with no parameters for the complete manual -
|
||||
this is for your convenience, really).
|
||||
|
||||
@@ -31,8 +27,7 @@ trivial - you just need to pass the input file and (optionally) some
|
||||
details about the input and output files.
|
||||
|
||||
|
||||
Languages
|
||||
---------
|
||||
## Languages
|
||||
Usually English captions are transmitted in line 21 field 1 data,
|
||||
using channel 1, so the default values are correct so you don't
|
||||
need to do anything and you don't need to understand what it all
|
||||
@@ -50,20 +45,17 @@ So try adding these parameter combinations to your other parameters.
|
||||
|
||||
If there are Spanish subtitles, one of them should work.
|
||||
|
||||
McPoodle's page
|
||||
---------------
|
||||
## McPoodle's page
|
||||
http://www.theneitherworld.com/mcpoodle/SCC_TOOLS/DOCS/SCC_TOOLS.HTML
|
||||
|
||||
Essential CC related information and free (with source) tools.
|
||||
|
||||
Encoding
|
||||
--------
|
||||
## Encoding
|
||||
This version, in both its Linux and Windows builds generates by
|
||||
default Unicode files. You can use -latin1 and -utf8 if you prefer
|
||||
these encodings (usually it just depends on what your specific
|
||||
player likes).
|
||||
|
||||
Future work
|
||||
-----------
|
||||
## Future work
|
||||
- Please check www.ccextractor.org for news and future work.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#######################################################
|
||||
# Version 0.01
|
||||
# Version 0.02
|
||||
#
|
||||
# To enable required option please uncomment option
|
||||
#
|
||||
@@ -12,12 +12,15 @@
|
||||
# 0 = file
|
||||
# 1 = stdin
|
||||
# 2 = network
|
||||
# 3 = tcp
|
||||
|
||||
INPUT_SOURCE=0
|
||||
|
||||
# The Buffer Input tag
|
||||
# This tag takes number in its input.
|
||||
|
||||
# Is it ccx_bufferdata_type ?
|
||||
|
||||
#BUFFER_INPUT=0
|
||||
|
||||
# The Direct Rollup tag
|
||||
@@ -45,22 +48,28 @@ INPUT_SOURCE=0
|
||||
#NOTYPE_SETTING=
|
||||
|
||||
# The Codec Tag takes the preference of codec
|
||||
# tag CCX_CODEC_ANY is by default
|
||||
# tag CCX_CODEC_ANY by default
|
||||
# This tag takes number in its input and their meanings
|
||||
# are following
|
||||
# 0 = CCX_CODEC_ANY (default)
|
||||
# 1 = CCX_CODEC_TELETEXT
|
||||
# 2 = CCX_CODEC_DVB
|
||||
# 3 = CCX_CODEC_ISDB_CC
|
||||
# 4 = CCX_CODEC_ATSC_CC
|
||||
# 5 = CCX_CODEC_NONE
|
||||
|
||||
#CODEC=
|
||||
|
||||
# The NO Codec Tag uses codec specified
|
||||
# tag CCX_CODEC_NONE by default
|
||||
# This tag takes number in its input and their meanings
|
||||
# are following
|
||||
# 0 = CCX_CODEC_ANY
|
||||
# 1 = CCX_CODEC_TELETEXT
|
||||
# 2 = CCX_CODEC_DVB
|
||||
|
||||
#CODEC=
|
||||
|
||||
# The NO Codec Tag do not use codec specified
|
||||
# tag CCX_CODEC_NONE is by default
|
||||
# This tag takes number in its input and their meanings
|
||||
# are following
|
||||
# 1 = CCX_CODEC_TELETEXT
|
||||
# 2 = CCX_CODEC_DVB
|
||||
# 3 = CCX_CODEC_NONE
|
||||
# 3 = CCX_CODEC_ISDB_CC
|
||||
# 4 = CCX_CODEC_ATSC_CC
|
||||
# 5 = CCX_CODEC_NONE (default)
|
||||
|
||||
#NOCODEC=
|
||||
|
||||
@@ -68,15 +77,21 @@ INPUT_SOURCE=0
|
||||
# by default output format is srt
|
||||
# This tag takes number in its input and their meanings
|
||||
# are following
|
||||
# 0 = CCX_OF_RAW
|
||||
# 1 = CCX_OF_SRT (default)
|
||||
# 2 = CCX_OF_SAMI
|
||||
# 3 = CCX_OF_TRANSCRIPT
|
||||
# 4 = CCX_OF_RCWT
|
||||
# 5 = CCX_OF_NULL
|
||||
# 6 = CCX_OF_SMPTETT
|
||||
# 7 = CCX_OF_SPUPNG
|
||||
# 8 = CCX_OF_DVDRAW
|
||||
# 0 = CCX_OF_RAW
|
||||
# 1 = CCX_OF_SRT (default)
|
||||
# 2 = CCX_OF_SAMI
|
||||
# 3 = CCX_OF_TRANSCRIPT
|
||||
# 4 = CCX_OF_RCWT
|
||||
# 5 = CCX_OF_NULL
|
||||
# 6 = CCX_OF_SMPTETT
|
||||
# 7 = CCX_OF_SPUPNG
|
||||
# 8 = CCX_OF_DVDRAW
|
||||
# 9 = CCX_OF_WEBVTT
|
||||
# 10 = CCX_OF_SIMPLE_XML
|
||||
# 11 = CCX_OF_G608
|
||||
# 12 = CCX_OF_CURL
|
||||
# 13 = CCX_OF_SSA
|
||||
# 14 = CCX_OF_MCC
|
||||
|
||||
#OUTPUT_FORMAT=
|
||||
|
||||
|
||||
BIN
docs/img/Binaries.png
Normal file
|
After Width: | Height: | Size: 129 KiB |
BIN
docs/img/Building.png
Normal file
|
After Width: | Height: | Size: 78 KiB |
BIN
docs/img/ProjectSection.png
Normal file
|
After Width: | Height: | Size: 77 KiB |
BIN
docs/img/Properties.png
Normal file
|
After Width: | Height: | Size: 99 KiB |
BIN
docs/img/Warning.png
Normal file
|
After Width: | Height: | Size: 69 KiB |
BIN
docs/img/projectFiles.png
Normal file
|
After Width: | Height: | Size: 106 KiB |
@@ -35,5 +35,8 @@ cmake -DWITH_SHARING=ON ../src/
|
||||
If you want to build CCExtractor with HARDSUBX support
|
||||
cmake -DWITH_HARDSUBX=ON ../src/
|
||||
|
||||
If you want to build CCExtractor with rust disabled you need to pass
|
||||
cmake -DWITHOUT_RUST=ON ../src/
|
||||
|
||||
Hint for looking all the things you want to set from outside
|
||||
cmake -LAH ../src/
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
#!/bin/bash
|
||||
find /vagrant/Second\ phase\ evaluation/ -name '*.ts' -exec sh -c '
|
||||
for file do
|
||||
python ../../api/api_testing.py $file -quiet
|
||||
done
|
||||
' sh {} +
|
||||
2
linux/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
libccx_rust.a
|
||||
rust
|
||||
@@ -1,109 +1,114 @@
|
||||
AUTOMAKE_OPTIONS = foreign
|
||||
|
||||
ACLOCAL_AMFLAGS = -I m4/
|
||||
|
||||
bin_PROGRAMS = ccextractor
|
||||
ccextractor_SOURCES = \
|
||||
../src/ccextractor.c \
|
||||
../src/ccextractor.h \
|
||||
../src/gpacmp4/avc_ext.c \
|
||||
../src/gpacmp4/avilib.c \
|
||||
../src/gpacmp4/av_parsers.c \
|
||||
../src/gpacmp4/base_encoding.c \
|
||||
../src/gpacmp4/bitstream.c \
|
||||
../src/gpacmp4/box_code_3gpp.c \
|
||||
../src/gpacmp4/box_code_adobe.c \
|
||||
../src/gpacmp4/box_code_apple.c \
|
||||
../src/gpacmp4/box_code_base.c \
|
||||
../src/gpacmp4/box_code_drm.c \
|
||||
../src/gpacmp4/box_dump.c \
|
||||
../src/gpacmp4/box_code_meta.c \
|
||||
../src/gpacmp4/box_funcs.c \
|
||||
../src/gpacmp4/color.c \
|
||||
../src/gpacmp4/configfile.c \
|
||||
../src/gpacmp4/data_map.c \
|
||||
../src/gpacmp4/desc_private.c \
|
||||
../src/gpacmp4/descriptors.c \
|
||||
../src/gpacmp4/drm_sample.c \
|
||||
../src/gpacmp4/error.c \
|
||||
../src/gpacmp4/gpac_ogg.c \
|
||||
../src/gpacmp4/hint_track.c \
|
||||
../src/gpacmp4/hinting.c \
|
||||
../src/gpacmp4/ipmpx_code.c \
|
||||
../src/gpacmp4/ipmpx_parse.c \
|
||||
../src/gpacmp4/isom_intern.c \
|
||||
../src/gpacmp4/isom_read.c \
|
||||
../src/gpacmp4/isom_store.c \
|
||||
../src/gpacmp4/isom_write.c \
|
||||
../src/gpacmp4/list.c \
|
||||
../src/gpacmp4/math.c \
|
||||
../src/gpacmp4/media.c \
|
||||
../src/gpacmp4/media_odf.c \
|
||||
../src/gpacmp4/meta.c \
|
||||
../src/gpacmp4/movie_fragments.c \
|
||||
../src/gpacmp4/mp4.c \
|
||||
../src/gpacmp4/odf_code.c \
|
||||
../src/gpacmp4/odf_codec.c \
|
||||
../src/gpacmp4/odf_command.c \
|
||||
../src/gpacmp4/os_config_init.c \
|
||||
../src/gpacmp4/os_divers.c \
|
||||
../src/gpacmp4/os_file.c \
|
||||
../src/gpacmp4/qos.c \
|
||||
../src/gpacmp4/sample_descs.c \
|
||||
../src/gpacmp4/slc.c \
|
||||
../src/gpacmp4/stbl_read.c \
|
||||
../src/gpacmp4/stbl_write.c \
|
||||
../src/gpacmp4/track.c \
|
||||
../src/gpacmp4/tx3g.c \
|
||||
../src/gpacmp4/url.c \
|
||||
../src/gpacmp4/utf.c \
|
||||
../src/gpacmp4/gpac/avparse.h \
|
||||
../src/gpacmp4/gpac/base_coding.h \
|
||||
../src/gpacmp4/gpac/bitstream.h \
|
||||
../src/gpacmp4/gpac/color.h \
|
||||
../src/gpacmp4/gpac/config_file.h \
|
||||
../src/gpacmp4/gpac/configuration.h \
|
||||
../src/gpacmp4/gpac/constants.h \
|
||||
../src/gpacmp4/gpac/events_constants.h \
|
||||
../src/gpacmp4/gpac/ietf.h \
|
||||
../src/gpacmp4/gpac/isomedia.h \
|
||||
../src/gpacmp4/gpac/list.h \
|
||||
../src/gpacmp4/gpac/maths.h \
|
||||
../src/gpacmp4/gpac/media_tools.h \
|
||||
../src/gpacmp4/gpac/mpeg4_odf.h \
|
||||
../src/gpacmp4/gpac/network.h \
|
||||
../src/gpacmp4/gpac/revision.h \
|
||||
../src/gpacmp4/gpac/setup.h \
|
||||
../src/gpacmp4/gpac/tools.h \
|
||||
../src/gpacmp4/gpac/utf.h \
|
||||
../src/gpacmp4/gpac/version.h \
|
||||
../src/gpacmp4/gpac/internal/avilib.h \
|
||||
../src/gpacmp4/gpac/internal/isomedia_dev.h \
|
||||
../src/gpacmp4/gpac/internal/media_dev.h \
|
||||
../src/gpacmp4/gpac/internal/odf_dev.h \
|
||||
../src/gpacmp4/gpac/internal/odf_parse_common.h \
|
||||
../src/gpacmp4/gpac/internal/ogg.h \
|
||||
../src/libpng/pngstruct.h \
|
||||
../src/libpng/pngpriv.h \
|
||||
../src/libpng/pnginfo.h \
|
||||
../src/libpng/pnglibconf.h \
|
||||
../src/libpng/pngconf.h \
|
||||
../src/libpng/pngdebug.h \
|
||||
../src/libpng/png.h \
|
||||
../src/libpng/png.c \
|
||||
../src/libpng/pngerror.c \
|
||||
../src/libpng/pngget.c \
|
||||
../src/libpng/pngmem.c \
|
||||
../src/libpng/pngpread.c \
|
||||
../src/libpng/pngread.c \
|
||||
../src/libpng/pngrio.c \
|
||||
../src/libpng/pngrtran.c \
|
||||
../src/libpng/pngrutil.c \
|
||||
../src/libpng/pngset.c \
|
||||
../src/libpng/pngtrans.c \
|
||||
../src/libpng/pngwio.c \
|
||||
../src/libpng/pngwrite.c \
|
||||
../src/libpng/pngwtran.c \
|
||||
../src/libpng/pngwutil.c \
|
||||
../src/thirdparty/gpacmp4/avc_ext.c \
|
||||
../src/thirdparty/gpacmp4/avilib.c \
|
||||
../src/thirdparty/gpacmp4/av_parsers.c \
|
||||
../src/thirdparty/gpacmp4/base_encoding.c \
|
||||
../src/thirdparty/gpacmp4/bitstream.c \
|
||||
../src/thirdparty/gpacmp4/box_code_3gpp.c \
|
||||
../src/thirdparty/gpacmp4/box_code_adobe.c \
|
||||
../src/thirdparty/gpacmp4/box_code_apple.c \
|
||||
../src/thirdparty/gpacmp4/box_code_base.c \
|
||||
../src/thirdparty/gpacmp4/box_code_drm.c \
|
||||
../src/thirdparty/gpacmp4/box_dump.c \
|
||||
../src/thirdparty/gpacmp4/box_code_meta.c \
|
||||
../src/thirdparty/gpacmp4/box_funcs.c \
|
||||
../src/thirdparty/gpacmp4/color.c \
|
||||
../src/thirdparty/gpacmp4/configfile.c \
|
||||
../src/thirdparty/gpacmp4/data_map.c \
|
||||
../src/thirdparty/gpacmp4/desc_private.c \
|
||||
../src/thirdparty/gpacmp4/descriptors.c \
|
||||
../src/thirdparty/gpacmp4/drm_sample.c \
|
||||
../src/thirdparty/gpacmp4/error.c \
|
||||
../src/thirdparty/gpacmp4/gpac_ogg.c \
|
||||
../src/thirdparty/gpacmp4/hint_track.c \
|
||||
../src/thirdparty/gpacmp4/hinting.c \
|
||||
../src/thirdparty/gpacmp4/ipmpx_code.c \
|
||||
../src/thirdparty/gpacmp4/ipmpx_parse.c \
|
||||
../src/thirdparty/gpacmp4/isom_intern.c \
|
||||
../src/thirdparty/gpacmp4/isom_read.c \
|
||||
../src/thirdparty/gpacmp4/isom_store.c \
|
||||
../src/thirdparty/gpacmp4/isom_write.c \
|
||||
../src/thirdparty/gpacmp4/list.c \
|
||||
../src/thirdparty/gpacmp4/math.c \
|
||||
../src/thirdparty/gpacmp4/media.c \
|
||||
../src/thirdparty/gpacmp4/media_odf.c \
|
||||
../src/thirdparty/gpacmp4/meta.c \
|
||||
../src/thirdparty/gpacmp4/movie_fragments.c \
|
||||
../src/thirdparty/gpacmp4/odf_code.c \
|
||||
../src/thirdparty/gpacmp4/odf_codec.c \
|
||||
../src/thirdparty/gpacmp4/odf_command.c \
|
||||
../src/thirdparty/gpacmp4/os_config_init.c \
|
||||
../src/thirdparty/gpacmp4/os_divers.c \
|
||||
../src/thirdparty/gpacmp4/os_file.c \
|
||||
../src/thirdparty/gpacmp4/qos.c \
|
||||
../src/thirdparty/gpacmp4/sample_descs.c \
|
||||
../src/thirdparty/gpacmp4/slc.c \
|
||||
../src/thirdparty/gpacmp4/stbl_read.c \
|
||||
../src/thirdparty/gpacmp4/stbl_write.c \
|
||||
../src/thirdparty/gpacmp4/track.c \
|
||||
../src/thirdparty/gpacmp4/tx3g.c \
|
||||
../src/thirdparty/gpacmp4/url.c \
|
||||
../src/thirdparty/gpacmp4/utf.c \
|
||||
../src/thirdparty/gpacmp4/os_thread.c \
|
||||
../src/thirdparty/gpacmp4/module.c \
|
||||
../src/thirdparty/gpacmp4/os_module.c \
|
||||
../src/thirdparty/gpacmp4/xml_parser.c \
|
||||
../src/thirdparty/gpacmp4/constants.c \
|
||||
../src/thirdparty/gpacmp4/gpac/avparse.h \
|
||||
../src/thirdparty/gpacmp4/gpac/base_coding.h \
|
||||
../src/thirdparty/gpacmp4/gpac/bitstream.h \
|
||||
../src/thirdparty/gpacmp4/gpac/color.h \
|
||||
../src/thirdparty/gpacmp4/gpac/config_file.h \
|
||||
../src/thirdparty/gpacmp4/gpac/configuration.h \
|
||||
../src/thirdparty/gpacmp4/gpac/constants.h \
|
||||
../src/thirdparty/gpacmp4/gpac/events_constants.h \
|
||||
../src/thirdparty/gpacmp4/gpac/ietf.h \
|
||||
../src/thirdparty/gpacmp4/gpac/isomedia.h \
|
||||
../src/thirdparty/gpacmp4/gpac/list.h \
|
||||
../src/thirdparty/gpacmp4/gpac/maths.h \
|
||||
../src/thirdparty/gpacmp4/gpac/media_tools.h \
|
||||
../src/thirdparty/gpacmp4/gpac/mpeg4_odf.h \
|
||||
../src/thirdparty/gpacmp4/gpac/network.h \
|
||||
../src/thirdparty/gpacmp4/gpac/revision.h \
|
||||
../src/thirdparty/gpacmp4/gpac/setup.h \
|
||||
../src/thirdparty/gpacmp4/gpac/tools.h \
|
||||
../src/thirdparty/gpacmp4/gpac/utf.h \
|
||||
../src/thirdparty/gpacmp4/gpac/version.h \
|
||||
../src/thirdparty/gpacmp4/gpac/iso639.h \
|
||||
../src/thirdparty/gpacmp4/gpac/internal/avilib.h \
|
||||
../src/thirdparty/gpacmp4/gpac/internal/isomedia_dev.h \
|
||||
../src/thirdparty/gpacmp4/gpac/internal/media_dev.h \
|
||||
../src/thirdparty/gpacmp4/gpac/internal/odf_dev.h \
|
||||
../src/thirdparty/gpacmp4/gpac/internal/odf_parse_common.h \
|
||||
../src/thirdparty/gpacmp4/gpac/internal/ogg.h \
|
||||
../src/thirdparty/libpng/pngstruct.h \
|
||||
../src/thirdparty/libpng/pngpriv.h \
|
||||
../src/thirdparty/libpng/pnginfo.h \
|
||||
../src/thirdparty/libpng/pnglibconf.h \
|
||||
../src/thirdparty/libpng/pngconf.h \
|
||||
../src/thirdparty/libpng/pngdebug.h \
|
||||
../src/thirdparty/libpng/png.h \
|
||||
../src/thirdparty/libpng/png.c \
|
||||
../src/thirdparty/libpng/pngerror.c \
|
||||
../src/thirdparty/libpng/pngget.c \
|
||||
../src/thirdparty/libpng/pngmem.c \
|
||||
../src/thirdparty/libpng/pngpread.c \
|
||||
../src/thirdparty/libpng/pngread.c \
|
||||
../src/thirdparty/libpng/pngrio.c \
|
||||
../src/thirdparty/libpng/pngrtran.c \
|
||||
../src/thirdparty/libpng/pngrutil.c \
|
||||
../src/thirdparty/libpng/pngset.c \
|
||||
../src/thirdparty/libpng/pngtrans.c \
|
||||
../src/thirdparty/libpng/pngwio.c \
|
||||
../src/thirdparty/libpng/pngwrite.c \
|
||||
../src/thirdparty/libpng/pngwtran.c \
|
||||
../src/thirdparty/libpng/pngwutil.c \
|
||||
../src/lib_ccx/ccx_common_common.h \
|
||||
../src/lib_ccx/ccx_common_option.h \
|
||||
../src/lib_ccx/utility.h \
|
||||
@@ -155,8 +160,10 @@ ccextractor_SOURCES = \
|
||||
../src/lib_ccx/ccx_encoders_g608.c \
|
||||
../src/lib_ccx/ccx_encoders_helpers.c \
|
||||
../src/lib_ccx/ccx_encoders_helpers.h \
|
||||
../src/lib_ccx/ccx_encoders_python.c \
|
||||
../src/lib_ccx/ccx_encoders_mcc.c \
|
||||
../src/lib_ccx/ccx_encoders_mcc.h \
|
||||
../src/lib_ccx/ccx_encoders_sami.c \
|
||||
../src/lib_ccx/ccx_encoders_scc.c \
|
||||
../src/lib_ccx/ccx_encoders_smptett.c \
|
||||
../src/lib_ccx/ccx_encoders_splitbysentence.c \
|
||||
../src/lib_ccx/ccx_encoders_spupng.c \
|
||||
@@ -202,6 +209,7 @@ ccextractor_SOURCES = \
|
||||
../src/lib_ccx/list.h \
|
||||
../src/lib_ccx/matroska.c \
|
||||
../src/lib_ccx/matroska.h \
|
||||
../src/lib_ccx/mp4.c \
|
||||
../src/lib_ccx/myth.c \
|
||||
../src/lib_ccx/networking.c \
|
||||
../src/lib_ccx/networking.h \
|
||||
@@ -222,100 +230,123 @@ ccextractor_SOURCES = \
|
||||
../src/lib_ccx/ts_tables_epg.c \
|
||||
../src/lib_ccx/wtv_constants.h \
|
||||
../src/lib_ccx/wtv_functions.c \
|
||||
../src/zlib/adler32.c \
|
||||
../src/zlib/compress.c \
|
||||
../src/zlib/crc32.c \
|
||||
../src/zlib/crc32.h \
|
||||
../src/zlib/deflate.c \
|
||||
../src/zlib/deflate.h \
|
||||
../src/zlib/gzclose.c \
|
||||
../src/zlib/gzguts.h \
|
||||
../src/zlib/gzlib.c \
|
||||
../src/zlib/gzread.c \
|
||||
../src/zlib/gzwrite.c \
|
||||
../src/zlib/infback.c \
|
||||
../src/zlib/inffast.c \
|
||||
../src/zlib/inffast.h \
|
||||
../src/zlib/inffixed.h \
|
||||
../src/zlib/inflate.c \
|
||||
../src/zlib/inflate.h \
|
||||
../src/zlib/inftrees.c \
|
||||
../src/zlib/inftrees.h \
|
||||
../src/zlib/trees.c \
|
||||
../src/zlib/trees.h \
|
||||
../src/zlib/uncompr.c \
|
||||
../src/zlib/zconf.h \
|
||||
../src/zlib/zlib.h \
|
||||
../src/zlib/zutil.c \
|
||||
../src/zlib/zutil.h \
|
||||
../src/utf8proc/utf8proc.c \
|
||||
../src/utf8proc/utf8proc.h \
|
||||
../src/lib_hash/sha2.c \
|
||||
../src/lib_hash/sha2.h \
|
||||
../src/protobuf-c/protobuf-c.c \
|
||||
../src/protobuf-c/protobuf-c.h \
|
||||
../src/zvbi/bcd.h \
|
||||
../src/zvbi/bit_slicer.c \
|
||||
../src/zvbi/bit_slicer.h \
|
||||
../src/zvbi/decoder.c \
|
||||
../src/zvbi/macros.h \
|
||||
../src/zvbi/misc.h \
|
||||
../src/zvbi/raw_decoder.c \
|
||||
../src/zvbi/raw_decoder.h \
|
||||
../src/zvbi/sampling_par.c \
|
||||
../src/zvbi/sampling_par.h \
|
||||
../src/zvbi/sliced.h \
|
||||
../src/zvbi/zvbi_decoder.h \
|
||||
../src/wrappers/wrapper.c \
|
||||
../src/wrappers/wrapper.h \
|
||||
../src/freetype/autofit/autofit.c \
|
||||
../src/freetype/base/ftbase.c \
|
||||
../src/freetype/base/ftbbox.c \
|
||||
../src/freetype/base/ftbdf.c \
|
||||
../src/freetype/base/ftbitmap.c \
|
||||
../src/freetype/base/ftcid.c \
|
||||
../src/freetype/base/ftfntfmt.c \
|
||||
../src/freetype/base/ftfstype.c \
|
||||
../src/freetype/base/ftgasp.c \
|
||||
../src/freetype/base/ftglyph.c \
|
||||
../src/freetype/base/ftgxval.c \
|
||||
../src/freetype/base/ftinit.c \
|
||||
../src/freetype/base/ftlcdfil.c \
|
||||
../src/freetype/base/ftmm.c \
|
||||
../src/freetype/base/ftotval.c \
|
||||
../src/freetype/base/ftpatent.c \
|
||||
../src/freetype/base/ftpfr.c \
|
||||
../src/freetype/base/ftstroke.c \
|
||||
../src/freetype/base/ftsynth.c \
|
||||
../src/freetype/base/ftsystem.c \
|
||||
../src/freetype/base/fttype1.c \
|
||||
../src/freetype/base/ftwinfnt.c \
|
||||
../src/freetype/bdf/bdf.c \
|
||||
../src/freetype/bzip2/ftbzip2.c \
|
||||
../src/freetype/cache/ftcache.c \
|
||||
../src/freetype/cff/cff.c \
|
||||
../src/freetype/cid/type1cid.c \
|
||||
../src/freetype/gzip/ftgzip.c \
|
||||
../src/freetype/lzw/ftlzw.c \
|
||||
../src/freetype/pcf/pcf.c \
|
||||
../src/freetype/pfr/pfr.c \
|
||||
../src/freetype/psaux/psaux.c \
|
||||
../src/freetype/pshinter/pshinter.c \
|
||||
../src/freetype/psnames/psnames.c \
|
||||
../src/freetype/raster/raster.c \
|
||||
../src/freetype/sfnt/sfnt.c \
|
||||
../src/freetype/smooth/smooth.c \
|
||||
../src/freetype/truetype/truetype.c \
|
||||
../src/freetype/type1/type1.c \
|
||||
../src/freetype/type42/type42.c \
|
||||
../src/freetype/winfonts/winfnt.c
|
||||
../src/thirdparty/zlib/adler32.c \
|
||||
../src/thirdparty/zlib/compress.c \
|
||||
../src/thirdparty/zlib/crc32.c \
|
||||
../src/thirdparty/zlib/crc32.h \
|
||||
../src/thirdparty/zlib/deflate.c \
|
||||
../src/thirdparty/zlib/deflate.h \
|
||||
../src/thirdparty/zlib/gzclose.c \
|
||||
../src/thirdparty/zlib/gzguts.h \
|
||||
../src/thirdparty/zlib/gzlib.c \
|
||||
../src/thirdparty/zlib/gzread.c \
|
||||
../src/thirdparty/zlib/gzwrite.c \
|
||||
../src/thirdparty/zlib/infback.c \
|
||||
../src/thirdparty/zlib/inffast.c \
|
||||
../src/thirdparty/zlib/inffast.h \
|
||||
../src/thirdparty/zlib/inffixed.h \
|
||||
../src/thirdparty/zlib/inflate.c \
|
||||
../src/thirdparty/zlib/inflate.h \
|
||||
../src/thirdparty/zlib/inftrees.c \
|
||||
../src/thirdparty/zlib/inftrees.h \
|
||||
../src/thirdparty/zlib/trees.c \
|
||||
../src/thirdparty/zlib/trees.h \
|
||||
../src/thirdparty/zlib/uncompr.c \
|
||||
../src/thirdparty/zlib/zconf.h \
|
||||
../src/thirdparty/zlib/zlib.h \
|
||||
../src/thirdparty/zlib/zutil.c \
|
||||
../src/thirdparty/zlib/zutil.h \
|
||||
../src/thirdparty/utf8proc/utf8proc.c \
|
||||
../src/thirdparty/utf8proc/utf8proc.h \
|
||||
../src/thirdparty/lib_hash/sha2.c \
|
||||
../src/thirdparty/lib_hash/sha2.h \
|
||||
../src/thirdparty/protobuf-c/protobuf-c.c \
|
||||
../src/thirdparty/protobuf-c/protobuf-c.h \
|
||||
../src/lib_ccx/zvbi/bcd.h \
|
||||
../src/lib_ccx/zvbi/bit_slicer.c \
|
||||
../src/lib_ccx/zvbi/bit_slicer.h \
|
||||
../src/lib_ccx/zvbi/decoder.c \
|
||||
../src/lib_ccx/zvbi/macros.h \
|
||||
../src/lib_ccx/zvbi/misc.h \
|
||||
../src/lib_ccx/zvbi/raw_decoder.c \
|
||||
../src/lib_ccx/zvbi/raw_decoder.h \
|
||||
../src/lib_ccx/zvbi/sampling_par.c \
|
||||
../src/lib_ccx/zvbi/sampling_par.h \
|
||||
../src/lib_ccx/zvbi/sliced.h \
|
||||
../src/lib_ccx/zvbi/zvbi_decoder.h \
|
||||
../src/freetype/* \
|
||||
../src/thirdparty/freetype/autofit/autofit.c \
|
||||
../src/thirdparty/freetype/base/ftbase.c \
|
||||
../src/thirdparty/freetype/base/ftbbox.c \
|
||||
../src/thirdparty/freetype/base/ftbdf.c \
|
||||
../src/thirdparty/freetype/base/ftbitmap.c \
|
||||
../src/thirdparty/freetype/base/ftcid.c \
|
||||
../src/thirdparty/freetype/base/ftfntfmt.c \
|
||||
../src/thirdparty/freetype/base/ftfstype.c \
|
||||
../src/thirdparty/freetype/base/ftgasp.c \
|
||||
../src/thirdparty/freetype/base/ftglyph.c \
|
||||
../src/thirdparty/freetype/base/ftgxval.c \
|
||||
../src/thirdparty/freetype/base/ftinit.c \
|
||||
../src/thirdparty/freetype/base/ftlcdfil.c \
|
||||
../src/thirdparty/freetype/base/ftmm.c \
|
||||
../src/thirdparty/freetype/base/ftotval.c \
|
||||
../src/thirdparty/freetype/base/ftpatent.c \
|
||||
../src/thirdparty/freetype/base/ftpfr.c \
|
||||
../src/thirdparty/freetype/base/ftstroke.c \
|
||||
../src/thirdparty/freetype/base/ftsynth.c \
|
||||
../src/thirdparty/freetype/base/ftsystem.c \
|
||||
../src/thirdparty/freetype/base/fttype1.c \
|
||||
../src/thirdparty/freetype/base/ftwinfnt.c \
|
||||
../src/thirdparty/freetype/bdf/bdf.c \
|
||||
../src/thirdparty/freetype/bzip2/ftbzip2.c \
|
||||
../src/thirdparty/freetype/cache/ftcache.c \
|
||||
../src/thirdparty/freetype/cff/cff.c \
|
||||
../src/thirdparty/freetype/cid/type1cid.c \
|
||||
../src/thirdparty/freetype/gzip/ftgzip.c \
|
||||
../src/thirdparty/freetype/include/ft2build.h \
|
||||
../src/thirdparty/freetype/lzw/ftlzw.c \
|
||||
../src/thirdparty/freetype/pcf/pcf.c \
|
||||
../src/thirdparty/freetype/pfr/pfr.c \
|
||||
../src/thirdparty/freetype/psaux/psaux.c \
|
||||
../src/thirdparty/freetype/pshinter/pshinter.c \
|
||||
../src/thirdparty/freetype/psnames/psnames.c \
|
||||
../src/thirdparty/freetype/raster/raster.c \
|
||||
../src/thirdparty/freetype/sfnt/sfnt.c \
|
||||
../src/thirdparty/freetype/smooth/smooth.c \
|
||||
../src/thirdparty/freetype/truetype/truetype.c \
|
||||
../src/thirdparty/freetype/type1/type1.c \
|
||||
../src/thirdparty/freetype/type42/type42.c \
|
||||
../src/thirdparty/freetype/winfonts/winfnt.c
|
||||
|
||||
ccextractor_CFLAGS = -std=gnu99 -Wno-write-strings -D_FILE_OFFSET_BITS=64 -DVERSION_FILE_PRESENT -DFT2_BUILD_LIBRARY -DGPAC_DISABLE_VTT -DGPAC_DISABLE_OD_DUMP
|
||||
if SYS_IS_APPLE_SILICON
|
||||
ccextractor_SOURCES += ../src/thirdparty/libpng/arm/arm_init.c \
|
||||
../src/thirdparty/libpng/arm/filter_neon_intrinsics.c \
|
||||
../src/thirdparty/libpng/arm/palette_neon_intrinsics.c
|
||||
endif
|
||||
|
||||
ccextractor_CPPFLAGS =-I../src/lib_ccx/ -I../src/gpacmp4/ -I../src/libpng/ -I../src/zlib/ -I../src/zvbi/ -I../src/lib_hash/ -I../src/protobuf-c/ -I../src/utf8proc/ -I../src/ -I../src/freetype/include/
|
||||
ccextractor_CFLAGS = -std=gnu99 -Wno-write-strings -Wno-pointer-sign -D_FILE_OFFSET_BITS=64 -DVERSION_FILE_PRESENT -DFT2_BUILD_LIBRARY -DGPAC_DISABLE_VTT -DGPAC_DISABLE_OD_DUMP -DGPAC_DISABLE_REMOTERY -DNO_GZIP -DGPAC_HAVE_CONFIG_H
|
||||
|
||||
ccextractor_CPPFLAGS =-I../src/lib_ccx/ -I../src/thirdparty/gpacmp4/ -I../src/thirdparty/libpng/ -I../src/thirdparty/zlib/ -I../src/lib_ccx/zvbi/ -I../src/thirdparty/lib_hash/ -I../src/thirdparty/protobuf-c/ -I../src/thirdparty -I../src/ -I../src/thirdparty/freetype/include/
|
||||
|
||||
|
||||
ccextractor_LDADD=-lm
|
||||
ccextractor_LDADD=-lm -lpthread -ldl
|
||||
|
||||
if WITH_RUST
|
||||
ccextractor_LDADD += ./rust/@RUST_TARGET_SUBDIR@/libccx_rust.a
|
||||
else
|
||||
ccextractor_CFLAGS += -DDISABLE_RUST
|
||||
ccextractor_CPPFLAGS += -DDISABLE_RUST
|
||||
endif
|
||||
|
||||
if DEBUG_RELEASE
|
||||
CARGO_RELEASE_ARGS=
|
||||
else
|
||||
CARGO_RELEASE_ARGS=--release
|
||||
endif
|
||||
|
||||
./rust/@RUST_TARGET_SUBDIR@/libccx_rust.a:
|
||||
cd ../src/rust && \
|
||||
CARGO_TARGET_DIR=../../linux/rust $(CARGO) build $(CARGO_RELEASE_ARGS);
|
||||
|
||||
if SYS_IS_LINUX
|
||||
ccextractor_CFLAGS += -O3 -s -DGPAC_CONFIG_LINUX
|
||||
@@ -323,7 +354,11 @@ endif
|
||||
|
||||
if SYS_IS_MAC
|
||||
ccextractor_CFLAGS += -DPAC_CONFIG_DARWIN -Dfopen64=fopen -Dopen64=open -Dlseek64=lseek
|
||||
ccextractor_LDADD += -liconv -lz
|
||||
ccextractor_LDADD += -liconv -lz
|
||||
endif
|
||||
|
||||
if SYS_IS_64_BIT
|
||||
ccextractor_CFLAGS += -DGPAC_64_BITS
|
||||
endif
|
||||
|
||||
if HARDSUBX_IS_ENABLED
|
||||
@@ -363,7 +398,7 @@ ccextractor_LDADD += $(TESS_LIB)
|
||||
ccextractor_LDADD += $(LEPT_LIB)
|
||||
endif
|
||||
|
||||
EXTRA_DIST = ../src/gpacmp4/gpac/sync_layer.h ../src/lib_ccx/ccfont2.xbm ../src/utf8proc/utf8proc_data.c fonts/ icon/
|
||||
EXTRA_DIST = ../src/thirdparty/gpacmp4/gpac/sync_layer.h ../src/lib_ccx/ccfont2.xbm ../src/thirdparty/utf8proc/utf8proc_data.c fonts/ icon/
|
||||
|
||||
#For GUI
|
||||
if BUILD_WITH_GUI
|
||||
@@ -416,7 +451,7 @@ endif
|
||||
|
||||
if HARDSUBX_IS_ENABLED
|
||||
if OCR_IS_ENABLED
|
||||
ccextractorGUI_CFLAGS += -DENABLE_OCR
|
||||
ccextractorGUI_CFLAGS += -DENABLE_OCR
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#!/bin/bash
|
||||
#!/usr/bin/env bash
|
||||
|
||||
./pre-build.sh
|
||||
autoreconf -i
|
||||
|
||||
143
linux/build
@@ -1,63 +1,94 @@
|
||||
#!/bin/bash
|
||||
BLD_FLAGS="-std=gnu99 -Wno-write-strings -DGPAC_CONFIG_LINUX -D_FILE_OFFSET_BITS=64 -DVERSION_FILE_PRESENT -DENABLE_OCR -DFT2_BUILD_LIBRARY -DGPAC_DISABLE_VTT -DGPAC_DISABLE_OD_DUMP"
|
||||
BLD_INCLUDE="-I../src -I /usr/include/leptonica/ -I /usr/include/tesseract/ -I../src/lib_ccx/ -I../src/gpacmp4/ -I../src/libpng/ -I../src/zlib/ -I../src/zvbi -I../src/lib_hash -I../src/protobuf-c -I../src/utf8proc -I../src/freetype/include"
|
||||
SRC_LIBPNG="$(find ../src/libpng/ -name '*.c')"
|
||||
SRC_ZLIB="$(find ../src/zlib/ -name '*.c')"
|
||||
SRC_ZVBI="$(find ../src/zvbi/ -name '*.c')"
|
||||
#!/usr/bin/env bash
|
||||
BLD_FLAGS="$BLD_FLAGS -std=gnu99 -Wno-write-strings -Wno-pointer-sign -DGPAC_CONFIG_LINUX -D_FILE_OFFSET_BITS=64 -DVERSION_FILE_PRESENT -DENABLE_OCR -DFT2_BUILD_LIBRARY -DGPAC_DISABLE_VTT -DGPAC_DISABLE_OD_DUMP -DGPAC_DISABLE_REMOTERY -DNO_GZIP -DGPAC_HAVE_CONFIG_H"
|
||||
bit_os=$(getconf LONG_BIT)
|
||||
if [ "$bit_os"=="64" ]
|
||||
then
|
||||
BLD_FLAGS="$BLD_FLAGS -DGPAC_64_BITS"
|
||||
fi
|
||||
BLD_INCLUDE="-I../src -I /usr/include/leptonica/ -I /usr/include/tesseract/ -I../src/lib_ccx/ -I../src/thirdparty/gpacmp4/ -I../src/thirdparty/libpng -I../src/thirdparty/zlib -I../src/lib_ccx/zvbi -I../src/thirdparty/lib_hash -I../src/thirdparty/protobuf-c -I../src/thirdparty -I../src/thirdparty/freetype/include"
|
||||
SRC_LIBPNG="$(find ../src/thirdparty/libpng/ -name '*.c')"
|
||||
SRC_ZLIB="$(find ../src/thirdparty/zlib/ -name '*.c')"
|
||||
SRC_CCX="$(find ../src/lib_ccx/ -name '*.c')"
|
||||
SRC_GPAC="$(find ../src/gpacmp4/ -name '*.c')"
|
||||
SRC_HASH="$(find ../src/lib_hash/ -name '*.c')"
|
||||
SRC_PROTOBUF="$(find ../src/protobuf-c/ -name '*.c')"
|
||||
SRC_UTF8PROC="../src/utf8proc/utf8proc.c"
|
||||
SRC_FREETYPE="../src/freetype/autofit/autofit.c
|
||||
../src/freetype/base/ftbase.c
|
||||
../src/freetype/base/ftbbox.c
|
||||
../src/freetype/base/ftbdf.c
|
||||
../src/freetype/base/ftbitmap.c
|
||||
../src/freetype/base/ftcid.c
|
||||
../src/freetype/base/ftfntfmt.c
|
||||
../src/freetype/base/ftfstype.c
|
||||
../src/freetype/base/ftgasp.c
|
||||
../src/freetype/base/ftglyph.c
|
||||
../src/freetype/base/ftgxval.c
|
||||
../src/freetype/base/ftinit.c
|
||||
../src/freetype/base/ftlcdfil.c
|
||||
../src/freetype/base/ftmm.c
|
||||
../src/freetype/base/ftotval.c
|
||||
../src/freetype/base/ftpatent.c
|
||||
../src/freetype/base/ftpfr.c
|
||||
../src/freetype/base/ftstroke.c
|
||||
../src/freetype/base/ftsynth.c
|
||||
../src/freetype/base/ftsystem.c
|
||||
../src/freetype/base/fttype1.c
|
||||
../src/freetype/base/ftwinfnt.c
|
||||
../src/freetype/bdf/bdf.c
|
||||
../src/freetype/bzip2/ftbzip2.c
|
||||
../src/freetype/cache/ftcache.c
|
||||
../src/freetype/cff/cff.c
|
||||
../src/freetype/cid/type1cid.c
|
||||
../src/freetype/gzip/ftgzip.c
|
||||
../src/freetype/lzw/ftlzw.c
|
||||
../src/freetype/pcf/pcf.c
|
||||
../src/freetype/pfr/pfr.c
|
||||
../src/freetype/psaux/psaux.c
|
||||
../src/freetype/pshinter/pshinter.c
|
||||
../src/freetype/psnames/psnames.c
|
||||
../src/freetype/raster/raster.c
|
||||
../src/freetype/sfnt/sfnt.c
|
||||
../src/freetype/smooth/smooth.c
|
||||
../src/freetype/truetype/truetype.c
|
||||
../src/freetype/type1/type1.c
|
||||
../src/freetype/type42/type42.c
|
||||
../src/freetype/winfonts/winfnt.c"
|
||||
API_WRAPPERS="$(find ../src/wrappers/ -name '*.c')"
|
||||
BLD_SOURCES="../src/ccextractor.c $SRC_CCX $SRC_GPAC $SRC_ZLIB $SRC_ZVBI $SRC_LIBPNG $SRC_HASH $SRC_PROTOBUF $SRC_UTF8PROC $API_WRAPPERS $SRC_FREETYPE"
|
||||
BLD_LINKER="-lm -zmuldefs -l tesseract -l lept"
|
||||
SRC_GPAC="$(find ../src/thirdparty/gpacmp4/ -name '*.c')"
|
||||
SRC_HASH="$(find ../src/thirdparty/lib_hash/ -name '*.c')"
|
||||
SRC_PROTOBUF="$(find ../src/thirdparty/protobuf-c/ -name '*.c')"
|
||||
SRC_UTF8PROC="../src/thirdparty/utf8proc/utf8proc.c"
|
||||
SRC_FREETYPE="../src/thirdparty/freetype/autofit/autofit.c
|
||||
../src/thirdparty/freetype/base/ftbase.c
|
||||
../src/thirdparty/freetype/base/ftbbox.c
|
||||
../src/thirdparty/freetype/base/ftbdf.c
|
||||
../src/thirdparty/freetype/base/ftbitmap.c
|
||||
../src/thirdparty/freetype/base/ftcid.c
|
||||
../src/thirdparty/freetype/base/ftfntfmt.c
|
||||
../src/thirdparty/freetype/base/ftfstype.c
|
||||
../src/thirdparty/freetype/base/ftgasp.c
|
||||
../src/thirdparty/freetype/base/ftglyph.c
|
||||
../src/thirdparty/freetype/base/ftgxval.c
|
||||
../src/thirdparty/freetype/base/ftinit.c
|
||||
../src/thirdparty/freetype/base/ftlcdfil.c
|
||||
../src/thirdparty/freetype/base/ftmm.c
|
||||
../src/thirdparty/freetype/base/ftotval.c
|
||||
../src/thirdparty/freetype/base/ftpatent.c
|
||||
../src/thirdparty/freetype/base/ftpfr.c
|
||||
../src/thirdparty/freetype/base/ftstroke.c
|
||||
../src/thirdparty/freetype/base/ftsynth.c
|
||||
../src/thirdparty/freetype/base/ftsystem.c
|
||||
../src/thirdparty/freetype/base/fttype1.c
|
||||
../src/thirdparty/freetype/base/ftwinfnt.c
|
||||
../src/thirdparty/freetype/bdf/bdf.c
|
||||
../src/thirdparty/freetype/bzip2/ftbzip2.c
|
||||
../src/thirdparty/freetype/cache/ftcache.c
|
||||
../src/thirdparty/freetype/cff/cff.c
|
||||
../src/thirdparty/freetype/cid/type1cid.c
|
||||
../src/thirdparty/freetype/gzip/ftgzip.c
|
||||
../src/thirdparty/freetype/lzw/ftlzw.c
|
||||
../src/thirdparty/freetype/pcf/pcf.c
|
||||
../src/thirdparty/freetype/pfr/pfr.c
|
||||
../src/thirdparty/freetype/psaux/psaux.c
|
||||
../src/thirdparty/freetype/pshinter/pshinter.c
|
||||
../src/thirdparty/freetype/psnames/psnames.c
|
||||
../src/thirdparty/freetype/raster/raster.c
|
||||
../src/thirdparty/freetype/sfnt/sfnt.c
|
||||
../src/thirdparty/freetype/smooth/smooth.c
|
||||
../src/thirdparty/freetype/truetype/truetype.c
|
||||
../src/thirdparty/freetype/type1/type1.c
|
||||
../src/thirdparty/freetype/type42/type42.c
|
||||
../src/thirdparty/freetype/winfonts/winfnt.c"
|
||||
BLD_SOURCES="../src/ccextractor.c $SRC_CCX $SRC_GPAC $SRC_ZLIB $SRC_LIBPNG $SRC_HASH $SRC_PROTOBUF $SRC_UTF8PROC $SRC_FREETYPE"
|
||||
BLD_LINKER="$BLD_LINKER -lm -zmuldefs -l tesseract -l lept -lpthread -ldl"
|
||||
|
||||
echo "Running pre-build script..."
|
||||
./pre-build.sh
|
||||
echo "Trying to compile..."
|
||||
|
||||
if [ "$1" = "-without-rust" ]; then
|
||||
echo "Building without rust files..."
|
||||
BLD_FLAGS="$BLD_FLAGS -DDISABLE_RUST"
|
||||
else
|
||||
BLD_LINKER="$BLD_LINKER ./libccx_rust.a"
|
||||
echo "Checking for cargo..."
|
||||
if ! [ -x "$(command -v cargo)" ]; then
|
||||
echo 'Error: cargo is not installed.' >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
rustc_version="$(rustc --version)"
|
||||
semver=( ${rustc_version//./ } )
|
||||
version="${semver[1]}.${semver[2]}.${semver[3]}"
|
||||
MSRV="1.54.0"
|
||||
if [ "$(printf '%s\n' "$MSRV" "$version" | sort -V | head -n1)" = "$MSRV" ]; then
|
||||
echo "rustc >= MSRV(${MSRV})"
|
||||
else
|
||||
echo "Minimum supported rust version(MSRV) is ${MSRV}, please upgrade rust"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Building rust files..."
|
||||
(cd ../src/rust && CARGO_TARGET_DIR=../../linux/rust cargo build) || { echo "Failed. " ; exit 1; }
|
||||
cp rust/debug/libccx_rust.a ./libccx_rust.a
|
||||
fi
|
||||
|
||||
echo "Building ccextractor"
|
||||
out=$((LC_ALL=C gcc $BLD_FLAGS $BLD_INCLUDE -o ccextractor $BLD_SOURCES $BLD_LINKER)2>&1)
|
||||
res=$?
|
||||
if [[ $out == *"gcc: command not found"* ]]
|
||||
@@ -72,7 +103,7 @@ then
|
||||
fi
|
||||
if [[ $out == *"capi.h: No such file or directory"* ]]
|
||||
then
|
||||
echo "Error: please install tesseract development library (tesseract-ocr-dev for Debian/Ubuntu)";
|
||||
echo "Error: please install tesseract development library (libtesseract-dev for Debian/Ubuntu)";
|
||||
exit 3
|
||||
fi
|
||||
if [[ $out == *"allheaders.h: No such file or directory"* ]]
|
||||
@@ -91,4 +122,4 @@ if [[ "$out" != "" ]] ; then
|
||||
echo "Compilation successful, compiler message shown in previous lines"
|
||||
else
|
||||
echo "Compilation successful, no compiler messages."
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#!/bin/sh -ex
|
||||
#!/usr/bin/env -S sh -ex
|
||||
|
||||
####################################################################
|
||||
# setup by tracey apr 2012
|
||||
@@ -83,18 +83,15 @@ cd -;
|
||||
# ccextractor -- build static
|
||||
git clone https://github.com/CCExtractor/ccextractor;
|
||||
cd ccextractor/linux/;
|
||||
# wget https://sourceforge.net/projects/ccextractor/files/ccextractor/0.82/ccextractor.src.0.82.zip;
|
||||
# unzip ccextractor*.zip;
|
||||
# cd ccextractor.*/linux/;
|
||||
perl -i -pe 's/O3 /O3 -static /' Makefile;
|
||||
# quick patch:
|
||||
perl -i -pe 's/(strchr|strstr)\(/$1((char *)/' ../src/gpacmp4/url.c ../src/gpacmp4/error.c;
|
||||
perl -i -pe 's/(strchr|strstr)\(/$1((char *)/' ../src/thirdparty/gpacmp4/url.c ../src/thirdparty/gpacmp4/error.c;
|
||||
set +e; # this _will_ FAIL at the end..
|
||||
make ENABLE_OCR=yes;
|
||||
set -e;
|
||||
# I confess hand-compiling (cherrypicking which .a to use when there are 2, etc.) is fragile...
|
||||
# But it was the _only_ way I could get a fully static build after hours of thrashing...
|
||||
gcc -Wno-write-strings -D_FILE_OFFSET_BITS=64 -DVERSION_FILE_PRESENT -O3 -std=gnu99 -s -DGPAC_CONFIG_LINUX -DENABLE_OCR -DPNG_NO_CONFIG_H -I/usr/local/include/tesseract -I/usr/local/include/leptonica objs/*.o -o ccextractor \
|
||||
gcc -Wno-write-strings -Wno-pointer-sign -D_FILE_OFFSET_BITS=64 -DVERSION_FILE_PRESENT -O3 -std=gnu99 -s -DGPAC_CONFIG_LINUX -DENABLE_OCR -DPNG_NO_CONFIG_H -I/usr/local/include/tesseract -I/usr/local/include/leptonica objs/*.o -o ccextractor \
|
||||
--static -lm \
|
||||
/usr/local/lib/libtesseract.a \
|
||||
/usr/local/lib/liblept.a \
|
||||
|
||||
@@ -1,59 +1,4 @@
|
||||
#!/bin/bash
|
||||
BLD_FLAGS="-g -std=gnu99 -Wno-write-strings -DGPAC_CONFIG_LINUX -D_FILE_OFFSET_BITS=64 -DVERSION_FILE_PRESENT -DENABLE_OCR -DENABLE_HARDSUBX -DFT2_BUILD_LIBRARY -DGPAC_DISABLE_VTT -DGPAC_DISABLE_OD_DUMP"
|
||||
BLD_INCLUDE="-I../src -I /usr/local/include -I /usr/include/leptonica/ -I /usr/include/tesseract/ -I../src/lib_ccx/ -I../src/gpacmp4/ -I../src/libpng/ -I../src/zlib/ -I../src/zvbi -I../src/lib_hash -I../src/protobuf-c -I../src/freetype/include"
|
||||
SRC_LIBPNG="$(find ../src/libpng/ -name '*.c')"
|
||||
SRC_ZLIB="$(find ../src/zlib/ -name '*.c')"
|
||||
SRC_ZVBI="$(find ../src/zvbi/ -name '*.c')"
|
||||
SRC_CCX="$(find ../src/lib_ccx/ -name '*.c')"
|
||||
SRC_GPAC="$(find ../src/gpacmp4/ -name '*.c')"
|
||||
SRC_HASH="$(find ../src/lib_hash/ -name '*.c')"
|
||||
SRC_UTF8="../src/utf8proc/utf8proc.c"
|
||||
SRC_FREETYPE="../src/freetype/autofit/autofit.c
|
||||
../src/freetype/base/ftbase.c
|
||||
../src/freetype/base/ftbbox.c
|
||||
../src/freetype/base/ftbdf.c
|
||||
../src/freetype/base/ftbitmap.c
|
||||
../src/freetype/base/ftcid.c
|
||||
../src/freetype/base/ftfntfmt.c
|
||||
../src/freetype/base/ftfstype.c
|
||||
../src/freetype/base/ftgasp.c
|
||||
../src/freetype/base/ftglyph.c
|
||||
../src/freetype/base/ftgxval.c
|
||||
../src/freetype/base/ftinit.c
|
||||
../src/freetype/base/ftlcdfil.c
|
||||
../src/freetype/base/ftmm.c
|
||||
../src/freetype/base/ftotval.c
|
||||
../src/freetype/base/ftpatent.c
|
||||
../src/freetype/base/ftpfr.c
|
||||
../src/freetype/base/ftstroke.c
|
||||
../src/freetype/base/ftsynth.c
|
||||
../src/freetype/base/ftsystem.c
|
||||
../src/freetype/base/fttype1.c
|
||||
../src/freetype/base/ftwinfnt.c
|
||||
../src/freetype/bdf/bdf.c
|
||||
../src/freetype/bzip2/ftbzip2.c
|
||||
../src/freetype/cache/ftcache.c
|
||||
../src/freetype/cff/cff.c
|
||||
../src/freetype/cid/type1cid.c
|
||||
../src/freetype/gzip/ftgzip.c
|
||||
../src/freetype/lzw/ftlzw.c
|
||||
../src/freetype/pcf/pcf.c
|
||||
../src/freetype/pfr/pfr.c
|
||||
../src/freetype/psaux/psaux.c
|
||||
../src/freetype/pshinter/pshinter.c
|
||||
../src/freetype/psnames/psnames.c
|
||||
../src/freetype/raster/raster.c
|
||||
../src/freetype/sfnt/sfnt.c
|
||||
../src/freetype/smooth/smooth.c
|
||||
../src/freetype/truetype/truetype.c
|
||||
../src/freetype/type1/type1.c
|
||||
../src/freetype/type42/type42.c
|
||||
../src/freetype/winfonts/winfnt.c"
|
||||
API_WRAPPERS="$(find ../src/wrappers/ -name '*.c')"
|
||||
SRC_PROTOBUF="$(find ../src/protobuf-c/ -name '*.c')"
|
||||
protobuf-c
|
||||
BLD_SOURCES="../src/ccextractor.c $SRC_CCX $SRC_GPAC $SRC_ZLIB $SRC_ZVBI $SRC_LIBPNG $SRC_HASH $SRC_UTF8 $SRC_PROTOBUF $API_WRAPPERS $SRC_FREETYPE"
|
||||
BLD_LINKER="-lm -zmuldefs -l tesseract -l lept -L/usr/local/lib -lswscale -lavutil -pthread -lavformat -lavcodec -lxcb-shm -lxcb -lX11 -llzma -lz -lswresample"
|
||||
|
||||
./pre-build.sh
|
||||
gcc $BLD_FLAGS $BLD_INCLUDE -o ccextractor $BLD_SOURCES $BLD_LINKER
|
||||
#!/usr/bin/env bash
|
||||
export BLD_FLAGS="-DENABLE_HARDSUBX"
|
||||
export BLD_LINKER="-lswscale -lavutil -pthread -lavformat -lavcodec -lxcb-shm -lxcb -lX11 -llzma -lswresample"
|
||||
./build
|
||||
|
||||
@@ -1,63 +1,3 @@
|
||||
#!/bin/bash
|
||||
BLD_FLAGS="-g -std=gnu99 -Wno-write-strings -Wno-unused-result -DGPAC_CONFIG_LINUX -D_FILE_OFFSET_BITS=64 -DVERSION_FILE_PRESENT -DENABLE_OCR -DFT2_BUILD_LIBRARY -DGPAC_DISABLE_VTT -DGPAC_DISABLE_OD_DUMP"
|
||||
BLD_INCLUDE="-I../src -I /usr/local/include/leptonica/ -I /usr/local/include/tesseract/ -I /usr/include/leptonica/ -I /usr/include/tesseract/ -I../src/lib_ccx/ -I../src/gpacmp4/ -I../src/libpng/ -I../src/zlib/ -I../src/zvbi -I../src/lib_hash -I../src/protobuf-c -I../src/utf8proc -I../src/freetype/include"
|
||||
SRC_LIBPNG="$(find ../src/libpng/ -name '*.c')"
|
||||
SRC_ZLIB="$(find ../src/zlib/ -name '*.c')"
|
||||
SRC_ZVBI="$(find ../src/zvbi/ -name '*.c')"
|
||||
SRC_CCX="$(find ../src/lib_ccx/ -name '*.c')"
|
||||
SRC_GPAC="$(find ../src/gpacmp4/ -name '*.c')"
|
||||
SRC_HASH="$(find ../src/lib_hash/ -name '*.c')"
|
||||
SRC_PROTOBUF="$(find ../src/protobuf-c/ -name '*.c')"
|
||||
SRC_UTF8PROC="../src/utf8proc/utf8proc.c"
|
||||
SRC_FREETYPE="../src/freetype/autofit/autofit.c
|
||||
../src/freetype/base/ftbase.c
|
||||
../src/freetype/base/ftbbox.c
|
||||
../src/freetype/base/ftbdf.c
|
||||
../src/freetype/base/ftbitmap.c
|
||||
../src/freetype/base/ftcid.c
|
||||
../src/freetype/base/ftfntfmt.c
|
||||
../src/freetype/base/ftfstype.c
|
||||
../src/freetype/base/ftgasp.c
|
||||
../src/freetype/base/ftglyph.c
|
||||
../src/freetype/base/ftgxval.c
|
||||
../src/freetype/base/ftinit.c
|
||||
../src/freetype/base/ftlcdfil.c
|
||||
../src/freetype/base/ftmm.c
|
||||
../src/freetype/base/ftotval.c
|
||||
../src/freetype/base/ftpatent.c
|
||||
../src/freetype/base/ftpfr.c
|
||||
../src/freetype/base/ftstroke.c
|
||||
../src/freetype/base/ftsynth.c
|
||||
../src/freetype/base/ftsystem.c
|
||||
../src/freetype/base/fttype1.c
|
||||
../src/freetype/base/ftwinfnt.c
|
||||
../src/freetype/bdf/bdf.c
|
||||
../src/freetype/bzip2/ftbzip2.c
|
||||
../src/freetype/cache/ftcache.c
|
||||
../src/freetype/cff/cff.c
|
||||
../src/freetype/cid/type1cid.c
|
||||
../src/freetype/gzip/ftgzip.c
|
||||
../src/freetype/lzw/ftlzw.c
|
||||
../src/freetype/pcf/pcf.c
|
||||
../src/freetype/pfr/pfr.c
|
||||
../src/freetype/psaux/psaux.c
|
||||
../src/freetype/pshinter/pshinter.c
|
||||
../src/freetype/psnames/psnames.c
|
||||
../src/freetype/raster/raster.c
|
||||
../src/freetype/sfnt/sfnt.c
|
||||
../src/freetype/smooth/smooth.c
|
||||
../src/freetype/truetype/truetype.c
|
||||
../src/freetype/type1/type1.c
|
||||
../src/freetype/type42/type42.c
|
||||
../src/freetype/winfonts/winfnt.c"
|
||||
API_WRAPPERS="$(find ../src/wrappers/ -name '*.c')"
|
||||
BLD_SOURCES="../src/ccextractor.c $SRC_CCX $SRC_GPAC $SRC_ZLIB $SRC_ZVBI $SRC_LIBPNG $SRC_HASH $SRC_PROTOBUF $SRC_UTF8PROC $API_WRAPPERS $SRC_FREETYPE"
|
||||
BLD_LINKER="-lm -zmuldefs -l tesseract -l lept"
|
||||
#BLD_DEBUG="-g -O1 -fsanitize=address -fno-omit-frame-pointer"
|
||||
BLD_DEBUG=""
|
||||
|
||||
echo "Running pre-build script..."
|
||||
./pre-build.sh
|
||||
echo "Trying to compile..."
|
||||
|
||||
gcc $BLD_DEBUG $BLD_FLAGS $BLD_INCLUDE -o ccextractor $BLD_SOURCES $BLD_LINKER
|
||||
#!/usr/bin/env bash
|
||||
export BLD_FLAGS="-g"
|
||||
./build
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#!/bin/bash
|
||||
#!/usr/bin/env bash
|
||||
|
||||
make distclean > /dev/null 2>&1 || true
|
||||
rm -rf Makefile configure *.in config.status config.log aclocal.m4 build-conf autom4te.cache
|
||||
|
||||
@@ -2,11 +2,11 @@
|
||||
# Process this file with autoconf to produce a configure script.
|
||||
|
||||
AC_PREREQ([2.69])
|
||||
AC_INIT([CCExtractor], [0.87], [carlos@ccextractor.org])
|
||||
AC_INIT([CCExtractor], [0.94], [carlos@ccextractor.org])
|
||||
AC_CONFIG_AUX_DIR([build-conf])
|
||||
AC_CONFIG_SRCDIR([../src/ccextractor.c])
|
||||
AM_INIT_AUTOMAKE([foreign subdir-objects])
|
||||
|
||||
AC_CONFIG_MACRO_DIRS([m4])
|
||||
|
||||
# Checks for programs.
|
||||
AC_PROG_CC
|
||||
@@ -91,6 +91,50 @@ AC_HELP_STRING([--with-gui], [Builds CCExtractor with GUI (requires GLFW and GLE
|
||||
[PKG_CHECK_MODULES([glfw3], [glfw3]) && PKG_CHECK_MODULES([glew], [glew])],
|
||||
[with_gui=no])
|
||||
|
||||
#Add argument for rust
|
||||
AC_ARG_WITH([rust],
|
||||
AC_HELP_STRING([--with-rust], [Builds CCExtractor with rust library]),
|
||||
[with_rust=$withval],
|
||||
[with_rust=yes])
|
||||
|
||||
AC_MSG_CHECKING(whether to build with rust library)
|
||||
if test "x$with_rust" = "xyes" ; then
|
||||
AC_MSG_RESULT(yes)
|
||||
|
||||
#Check if cargo and rust is installed
|
||||
AC_PATH_PROG([CARGO], [cargo], [notfound])
|
||||
AS_IF([test "$CARGO" = "notfound"], [AC_MSG_ERROR([cargo is required])])
|
||||
|
||||
AC_PATH_PROG([RUSTC], [rustc], [notfound])
|
||||
AS_IF([test "$RUSTC" = "notfound"], [AC_MSG_ERROR([rustc is required])])
|
||||
|
||||
rustc_version=$(rustc --version)
|
||||
MSRV="1.54.0"
|
||||
AX_COMPARE_VERSION($rustc_version, [ge], [$MSRV],
|
||||
[AC_MSG_RESULT(rustc >= $MSRV)],
|
||||
[AC_MSG_ERROR([Minimum supported rust version(MSRV) is $MSRV, please upgrade rust])])
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
fi
|
||||
AM_CONDITIONAL([WITH_RUST], [test "x$with_rust" = "xyes"])
|
||||
|
||||
AC_ARG_ENABLE(debug,
|
||||
AC_HELP_STRING([--enable-debug],
|
||||
[Build Rust code with debugging information [default=no]]),
|
||||
[debug_release=$enableval],
|
||||
[debug_release=no])
|
||||
|
||||
AC_MSG_CHECKING(whether to build Rust code with debugging information)
|
||||
if test "x$debug_release" = "xyes" ; then
|
||||
AC_MSG_RESULT(yes)
|
||||
RUST_TARGET_SUBDIR=debug
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
RUST_TARGET_SUBDIR=release
|
||||
fi
|
||||
AM_CONDITIONAL([DEBUG_RELEASE], [test "x$debug_release" = "xyes"])
|
||||
|
||||
AC_SUBST([RUST_TARGET_SUBDIR])
|
||||
|
||||
#Checks and prompts if libraries found/not found to avoild failure while building
|
||||
AS_IF([ test x$hardsubx = xtrue && test $HAS_AVCODEC -gt 0 ], [AC_MSG_NOTICE(avcodec library found)])
|
||||
@@ -114,7 +158,9 @@ AM_CONDITIONAL(TESSERACT_PRESENT, [ test ! -z `pkg-config --libs-only-l --silen
|
||||
AM_CONDITIONAL(TESSERACT_PRESENT_RPI, [ test -d "/usr/include/tesseract" && test `ls -A /usr/include/tesseract | wc -l` -gt 0 ])
|
||||
AM_CONDITIONAL(SYS_IS_LINUX, [ test `uname -s` = "Linux"])
|
||||
AM_CONDITIONAL(SYS_IS_MAC, [ test `uname -s` = "Darwin"])
|
||||
AM_CONDITIONAL(SYS_IS_APPLE_SILICON, [ test `uname -a | awk '{print $NF}'` = "arm64" ])
|
||||
AM_CONDITIONAL(BUILD_WITH_GUI, [test "x$with_gui" = "xyes"])
|
||||
AM_CONDITIONAL(SYS_IS_64_BIT,[test `getconf LONG_BIT` = "64"])
|
||||
|
||||
AC_CONFIG_FILES([Makefile])
|
||||
AC_OUTPUT
|
||||
|
||||
177
linux/m4/ax_compare_version.m4
Normal file
@@ -0,0 +1,177 @@
|
||||
# ===========================================================================
|
||||
# https://www.gnu.org/software/autoconf-archive/ax_compare_version.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_COMPARE_VERSION(VERSION_A, OP, VERSION_B, [ACTION-IF-TRUE], [ACTION-IF-FALSE])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# This macro compares two version strings. Due to the various number of
|
||||
# minor-version numbers that can exist, and the fact that string
|
||||
# comparisons are not compatible with numeric comparisons, this is not
|
||||
# necessarily trivial to do in a autoconf script. This macro makes doing
|
||||
# these comparisons easy.
|
||||
#
|
||||
# The six basic comparisons are available, as well as checking equality
|
||||
# limited to a certain number of minor-version levels.
|
||||
#
|
||||
# The operator OP determines what type of comparison to do, and can be one
|
||||
# of:
|
||||
#
|
||||
# eq - equal (test A == B)
|
||||
# ne - not equal (test A != B)
|
||||
# le - less than or equal (test A <= B)
|
||||
# ge - greater than or equal (test A >= B)
|
||||
# lt - less than (test A < B)
|
||||
# gt - greater than (test A > B)
|
||||
#
|
||||
# Additionally, the eq and ne operator can have a number after it to limit
|
||||
# the test to that number of minor versions.
|
||||
#
|
||||
# eq0 - equal up to the length of the shorter version
|
||||
# ne0 - not equal up to the length of the shorter version
|
||||
# eqN - equal up to N sub-version levels
|
||||
# neN - not equal up to N sub-version levels
|
||||
#
|
||||
# When the condition is true, shell commands ACTION-IF-TRUE are run,
|
||||
# otherwise shell commands ACTION-IF-FALSE are run. The environment
|
||||
# variable 'ax_compare_version' is always set to either 'true' or 'false'
|
||||
# as well.
|
||||
#
|
||||
# Examples:
|
||||
#
|
||||
# AX_COMPARE_VERSION([3.15.7],[lt],[3.15.8])
|
||||
# AX_COMPARE_VERSION([3.15],[lt],[3.15.8])
|
||||
#
|
||||
# would both be true.
|
||||
#
|
||||
# AX_COMPARE_VERSION([3.15.7],[eq],[3.15.8])
|
||||
# AX_COMPARE_VERSION([3.15],[gt],[3.15.8])
|
||||
#
|
||||
# would both be false.
|
||||
#
|
||||
# AX_COMPARE_VERSION([3.15.7],[eq2],[3.15.8])
|
||||
#
|
||||
# would be true because it is only comparing two minor versions.
|
||||
#
|
||||
# AX_COMPARE_VERSION([3.15.7],[eq0],[3.15])
|
||||
#
|
||||
# would be true because it is only comparing the lesser number of minor
|
||||
# versions of the two values.
|
||||
#
|
||||
# Note: The characters that separate the version numbers do not matter. An
|
||||
# empty string is the same as version 0. OP is evaluated by autoconf, not
|
||||
# configure, so must be a string, not a variable.
|
||||
#
|
||||
# The author would like to acknowledge Guido Draheim whose advice about
|
||||
# the m4_case and m4_ifvaln functions make this macro only include the
|
||||
# portions necessary to perform the specific comparison specified by the
|
||||
# OP argument in the final configure script.
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2008 Tim Toolan <toolan@ele.uri.edu>
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice
|
||||
# and this notice are preserved. This file is offered as-is, without any
|
||||
# warranty.
|
||||
|
||||
#serial 13
|
||||
|
||||
dnl #########################################################################
|
||||
AC_DEFUN([AX_COMPARE_VERSION], [
|
||||
AC_REQUIRE([AC_PROG_AWK])
|
||||
|
||||
# Used to indicate true or false condition
|
||||
ax_compare_version=false
|
||||
|
||||
# Convert the two version strings to be compared into a format that
|
||||
# allows a simple string comparison. The end result is that a version
|
||||
# string of the form 1.12.5-r617 will be converted to the form
|
||||
# 0001001200050617. In other words, each number is zero padded to four
|
||||
# digits, and non digits are removed.
|
||||
AS_VAR_PUSHDEF([A],[ax_compare_version_A])
|
||||
A=`echo "$1" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \
|
||||
-e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \
|
||||
-e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \
|
||||
-e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \
|
||||
-e 's/[[^0-9]]//g'`
|
||||
|
||||
AS_VAR_PUSHDEF([B],[ax_compare_version_B])
|
||||
B=`echo "$3" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \
|
||||
-e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \
|
||||
-e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \
|
||||
-e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \
|
||||
-e 's/[[^0-9]]//g'`
|
||||
|
||||
dnl # In the case of le, ge, lt, and gt, the strings are sorted as necessary
|
||||
dnl # then the first line is used to determine if the condition is true.
|
||||
dnl # The sed right after the echo is to remove any indented white space.
|
||||
m4_case(m4_tolower($2),
|
||||
[lt],[
|
||||
ax_compare_version=`echo "x$A
|
||||
x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/false/;s/x${B}/true/;1q"`
|
||||
],
|
||||
[gt],[
|
||||
ax_compare_version=`echo "x$A
|
||||
x$B" | sed 's/^ *//' | sort | sed "s/x${A}/false/;s/x${B}/true/;1q"`
|
||||
],
|
||||
[le],[
|
||||
ax_compare_version=`echo "x$A
|
||||
x$B" | sed 's/^ *//' | sort | sed "s/x${A}/true/;s/x${B}/false/;1q"`
|
||||
],
|
||||
[ge],[
|
||||
ax_compare_version=`echo "x$A
|
||||
x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/true/;s/x${B}/false/;1q"`
|
||||
],[
|
||||
dnl Split the operator from the subversion count if present.
|
||||
m4_bmatch(m4_substr($2,2),
|
||||
[0],[
|
||||
# A count of zero means use the length of the shorter version.
|
||||
# Determine the number of characters in A and B.
|
||||
ax_compare_version_len_A=`echo "$A" | $AWK '{print(length)}'`
|
||||
ax_compare_version_len_B=`echo "$B" | $AWK '{print(length)}'`
|
||||
|
||||
# Set A to no more than B's length and B to no more than A's length.
|
||||
A=`echo "$A" | sed "s/\(.\{$ax_compare_version_len_B\}\).*/\1/"`
|
||||
B=`echo "$B" | sed "s/\(.\{$ax_compare_version_len_A\}\).*/\1/"`
|
||||
],
|
||||
[[0-9]+],[
|
||||
# A count greater than zero means use only that many subversions
|
||||
A=`echo "$A" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"`
|
||||
B=`echo "$B" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"`
|
||||
],
|
||||
[.+],[
|
||||
AC_WARNING(
|
||||
[invalid OP numeric parameter: $2])
|
||||
],[])
|
||||
|
||||
# Pad zeros at end of numbers to make same length.
|
||||
ax_compare_version_tmp_A="$A`echo $B | sed 's/./0/g'`"
|
||||
B="$B`echo $A | sed 's/./0/g'`"
|
||||
A="$ax_compare_version_tmp_A"
|
||||
|
||||
# Check for equality or inequality as necessary.
|
||||
m4_case(m4_tolower(m4_substr($2,0,2)),
|
||||
[eq],[
|
||||
test "x$A" = "x$B" && ax_compare_version=true
|
||||
],
|
||||
[ne],[
|
||||
test "x$A" != "x$B" && ax_compare_version=true
|
||||
],[
|
||||
AC_WARNING([invalid OP parameter: $2])
|
||||
])
|
||||
])
|
||||
|
||||
AS_VAR_POPDEF([A])dnl
|
||||
AS_VAR_POPDEF([B])dnl
|
||||
|
||||
dnl # Execute ACTION-IF-TRUE / ACTION-IF-FALSE.
|
||||
if test "$ax_compare_version" = "true" ; then
|
||||
m4_ifvaln([$4],[$4],[:])dnl
|
||||
m4_ifvaln([$5],[else $5])dnl
|
||||
fi
|
||||
]) dnl AX_COMPARE_VERSION
|
||||
@@ -1,13 +1,12 @@
|
||||
#!/bin/bash
|
||||
SRC_LIBPNG="$(find ../src/libpng/ -name '*.c')"
|
||||
SRC_ZLIB="$(find ../src/zlib/ -name '*.c')"
|
||||
SRC_ZVBI="$(find ../src/zvbi/ -name '*.c')"
|
||||
#!/usr/bin/env bash
|
||||
SRC_LIBPNG="$(find ../src/thirdparty/libpng/ -name '*.c')"
|
||||
SRC_ZLIB="$(find ../sr/thirdpartyc/zlib/ -name '*.c')"
|
||||
SRC_ZVBI="$(find ../sr/thirdpartyc/zvbi/ -name '*.c')"
|
||||
SRC_CCX="$(find ../src/lib_ccx/ -name '*.c')"
|
||||
SRC_GPAC="$(find ../src/gpacmp4/ -name '*.c')"
|
||||
SRC_HASH="$(find ../src/lib_hash/ -name '*.c')"
|
||||
SRC_PROTOBUF="$(find ../src/protobuf-c/ -name '*.c')"
|
||||
SRC_GPAC="$(find ../sr/thirdpartyc/gpacmp4/ -name '*.c')"
|
||||
SRC_HASH="$(find ../sr/thirdpartyc/lib_hash/ -name '*.c')"
|
||||
SRC_PROTOBUF="$(find ../src/thirdparty/protobuf-c/ -name '*.c')"
|
||||
SRC_UTF8PROC="../src/utf8proc/utf8proc.c"
|
||||
API_WRAPPERS="$(find ../src/wrappers/ -name '*.c')"
|
||||
BLD_SOURCES="../src/ccextractor.c ../src/ccextractorapi_wrap.c $SRC_CCX $SRC_GPAC $SRC_ZLIB $SRC_ZVBI $SRC_LIBPNG $SRC_HASH $SRC_PROTOBUF $SRC_UTF8PROC $API_WRAPPERS"
|
||||
BLD_SOURCES="../src/ccextractor.c ../src/ccextractorapi_wrap.c $SRC_CCX $SRC_GPAC $SRC_ZLIB $SRC_ZVBI $SRC_LIBPNG $SRC_HASH $SRC_PROTOBUF $SRC_UTF8PROC"
|
||||
|
||||
python setup.py $BLD_SOURCES
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#!/bin/bash
|
||||
#!/usr/bin/env bash
|
||||
echo "Obtaining Git commit"
|
||||
commit=(`git rev-parse HEAD 2>/dev/null`)
|
||||
if [ -z "$commit" ]; then
|
||||
|
||||
426
mac/Makefile.am
@@ -1,109 +1,114 @@
|
||||
AUTOMAKE_OPTIONS = foreign
|
||||
|
||||
ACLOCAL_AMFLAGS = -I m4/
|
||||
|
||||
bin_PROGRAMS = ccextractor
|
||||
ccextractor_SOURCES = \
|
||||
../src/ccextractor.c \
|
||||
../src/ccextractor.h \
|
||||
../src/gpacmp4/avc_ext.c \
|
||||
../src/gpacmp4/avilib.c \
|
||||
../src/gpacmp4/av_parsers.c \
|
||||
../src/gpacmp4/base_encoding.c \
|
||||
../src/gpacmp4/bitstream.c \
|
||||
../src/gpacmp4/box_code_3gpp.c \
|
||||
../src/gpacmp4/box_code_adobe.c \
|
||||
../src/gpacmp4/box_code_apple.c \
|
||||
../src/gpacmp4/box_code_base.c \
|
||||
../src/gpacmp4/box_code_drm.c \
|
||||
../src/gpacmp4/box_dump.c \
|
||||
../src/gpacmp4/box_code_meta.c \
|
||||
../src/gpacmp4/box_funcs.c \
|
||||
../src/gpacmp4/color.c \
|
||||
../src/gpacmp4/configfile.c \
|
||||
../src/gpacmp4/data_map.c \
|
||||
../src/gpacmp4/desc_private.c \
|
||||
../src/gpacmp4/descriptors.c \
|
||||
../src/gpacmp4/drm_sample.c \
|
||||
../src/gpacmp4/error.c \
|
||||
../src/gpacmp4/gpac_ogg.c \
|
||||
../src/gpacmp4/hint_track.c \
|
||||
../src/gpacmp4/hinting.c \
|
||||
../src/gpacmp4/ipmpx_code.c \
|
||||
../src/gpacmp4/ipmpx_parse.c \
|
||||
../src/gpacmp4/isom_intern.c \
|
||||
../src/gpacmp4/isom_read.c \
|
||||
../src/gpacmp4/isom_store.c \
|
||||
../src/gpacmp4/isom_write.c \
|
||||
../src/gpacmp4/list.c \
|
||||
../src/gpacmp4/math.c \
|
||||
../src/gpacmp4/media.c \
|
||||
../src/gpacmp4/media_odf.c \
|
||||
../src/gpacmp4/meta.c \
|
||||
../src/gpacmp4/movie_fragments.c \
|
||||
../src/gpacmp4/mp4.c \
|
||||
../src/gpacmp4/odf_code.c \
|
||||
../src/gpacmp4/odf_codec.c \
|
||||
../src/gpacmp4/odf_command.c \
|
||||
../src/gpacmp4/os_config_init.c \
|
||||
../src/gpacmp4/os_divers.c \
|
||||
../src/gpacmp4/os_file.c \
|
||||
../src/gpacmp4/qos.c \
|
||||
../src/gpacmp4/sample_descs.c \
|
||||
../src/gpacmp4/slc.c \
|
||||
../src/gpacmp4/stbl_read.c \
|
||||
../src/gpacmp4/stbl_write.c \
|
||||
../src/gpacmp4/track.c \
|
||||
../src/gpacmp4/tx3g.c \
|
||||
../src/gpacmp4/url.c \
|
||||
../src/gpacmp4/utf.c \
|
||||
../src/gpacmp4/gpac/avparse.h \
|
||||
../src/gpacmp4/gpac/base_coding.h \
|
||||
../src/gpacmp4/gpac/bitstream.h \
|
||||
../src/gpacmp4/gpac/color.h \
|
||||
../src/gpacmp4/gpac/config_file.h \
|
||||
../src/gpacmp4/gpac/configuration.h \
|
||||
../src/gpacmp4/gpac/constants.h \
|
||||
../src/gpacmp4/gpac/events_constants.h \
|
||||
../src/gpacmp4/gpac/ietf.h \
|
||||
../src/gpacmp4/gpac/isomedia.h \
|
||||
../src/gpacmp4/gpac/list.h \
|
||||
../src/gpacmp4/gpac/maths.h \
|
||||
../src/gpacmp4/gpac/media_tools.h \
|
||||
../src/gpacmp4/gpac/mpeg4_odf.h \
|
||||
../src/gpacmp4/gpac/network.h \
|
||||
../src/gpacmp4/gpac/revision.h \
|
||||
../src/gpacmp4/gpac/setup.h \
|
||||
../src/gpacmp4/gpac/tools.h \
|
||||
../src/gpacmp4/gpac/utf.h \
|
||||
../src/gpacmp4/gpac/version.h \
|
||||
../src/gpacmp4/gpac/internal/avilib.h \
|
||||
../src/gpacmp4/gpac/internal/isomedia_dev.h \
|
||||
../src/gpacmp4/gpac/internal/media_dev.h \
|
||||
../src/gpacmp4/gpac/internal/odf_dev.h \
|
||||
../src/gpacmp4/gpac/internal/odf_parse_common.h \
|
||||
../src/gpacmp4/gpac/internal/ogg.h \
|
||||
../src/libpng/pngstruct.h \
|
||||
../src/libpng/pngpriv.h \
|
||||
../src/libpng/pnginfo.h \
|
||||
../src/libpng/pnglibconf.h \
|
||||
../src/libpng/pngconf.h \
|
||||
../src/libpng/pngdebug.h \
|
||||
../src/libpng/png.h \
|
||||
../src/libpng/png.c \
|
||||
../src/libpng/pngerror.c \
|
||||
../src/libpng/pngget.c \
|
||||
../src/libpng/pngmem.c \
|
||||
../src/libpng/pngpread.c \
|
||||
../src/libpng/pngread.c \
|
||||
../src/libpng/pngrio.c \
|
||||
../src/libpng/pngrtran.c \
|
||||
../src/libpng/pngrutil.c \
|
||||
../src/libpng/pngset.c \
|
||||
../src/libpng/pngtrans.c \
|
||||
../src/libpng/pngwio.c \
|
||||
../src/libpng/pngwrite.c \
|
||||
../src/libpng/pngwtran.c \
|
||||
../src/libpng/pngwutil.c \
|
||||
../src/thirdparty/gpacmp4/avc_ext.c \
|
||||
../src/thirdparty/gpacmp4/avilib.c \
|
||||
../src/thirdparty/gpacmp4/av_parsers.c \
|
||||
../src/thirdparty/gpacmp4/base_encoding.c \
|
||||
../src/thirdparty/gpacmp4/bitstream.c \
|
||||
../src/thirdparty/gpacmp4/box_code_3gpp.c \
|
||||
../src/thirdparty/gpacmp4/box_code_adobe.c \
|
||||
../src/thirdparty/gpacmp4/box_code_apple.c \
|
||||
../src/thirdparty/gpacmp4/box_code_base.c \
|
||||
../src/thirdparty/gpacmp4/box_code_drm.c \
|
||||
../src/thirdparty/gpacmp4/box_dump.c \
|
||||
../src/thirdparty/gpacmp4/box_code_meta.c \
|
||||
../src/thirdparty/gpacmp4/box_funcs.c \
|
||||
../src/thirdparty/gpacmp4/color.c \
|
||||
../src/thirdparty/gpacmp4/configfile.c \
|
||||
../src/thirdparty/gpacmp4/data_map.c \
|
||||
../src/thirdparty/gpacmp4/desc_private.c \
|
||||
../src/thirdparty/gpacmp4/descriptors.c \
|
||||
../src/thirdparty/gpacmp4/drm_sample.c \
|
||||
../src/thirdparty/gpacmp4/error.c \
|
||||
../src/thirdparty/gpacmp4/gpac_ogg.c \
|
||||
../src/thirdparty/gpacmp4/hint_track.c \
|
||||
../src/thirdparty/gpacmp4/hinting.c \
|
||||
../src/thirdparty/gpacmp4/ipmpx_code.c \
|
||||
../src/thirdparty/gpacmp4/ipmpx_parse.c \
|
||||
../src/thirdparty/gpacmp4/isom_intern.c \
|
||||
../src/thirdparty/gpacmp4/isom_read.c \
|
||||
../src/thirdparty/gpacmp4/isom_store.c \
|
||||
../src/thirdparty/gpacmp4/isom_write.c \
|
||||
../src/thirdparty/gpacmp4/list.c \
|
||||
../src/thirdparty/gpacmp4/math.c \
|
||||
../src/thirdparty/gpacmp4/media.c \
|
||||
../src/thirdparty/gpacmp4/media_odf.c \
|
||||
../src/thirdparty/gpacmp4/meta.c \
|
||||
../src/thirdparty/gpacmp4/movie_fragments.c \
|
||||
../src/thirdparty/gpacmp4/odf_code.c \
|
||||
../src/thirdparty/gpacmp4/odf_codec.c \
|
||||
../src/thirdparty/gpacmp4/odf_command.c \
|
||||
../src/thirdparty/gpacmp4/os_config_init.c \
|
||||
../src/thirdparty/gpacmp4/os_divers.c \
|
||||
../src/thirdparty/gpacmp4/os_file.c \
|
||||
../src/thirdparty/gpacmp4/qos.c \
|
||||
../src/thirdparty/gpacmp4/sample_descs.c \
|
||||
../src/thirdparty/gpacmp4/slc.c \
|
||||
../src/thirdparty/gpacmp4/stbl_read.c \
|
||||
../src/thirdparty/gpacmp4/stbl_write.c \
|
||||
../src/thirdparty/gpacmp4/track.c \
|
||||
../src/thirdparty/gpacmp4/tx3g.c \
|
||||
../src/thirdparty/gpacmp4/url.c \
|
||||
../src/thirdparty/gpacmp4/utf.c \
|
||||
../src/thirdparty/gpacmp4/os_thread.c \
|
||||
../src/thirdparty/gpacmp4/module.c \
|
||||
../src/thirdparty/gpacmp4/os_module.c \
|
||||
../src/thirdparty/gpacmp4/xml_parser.c \
|
||||
../src/thirdparty/gpacmp4/constants.c \
|
||||
../src/thirdparty/gpacmp4/gpac/avparse.h \
|
||||
../src/thirdparty/gpacmp4/gpac/base_coding.h \
|
||||
../src/thirdparty/gpacmp4/gpac/bitstream.h \
|
||||
../src/thirdparty/gpacmp4/gpac/color.h \
|
||||
../src/thirdparty/gpacmp4/gpac/config_file.h \
|
||||
../src/thirdparty/gpacmp4/gpac/configuration.h \
|
||||
../src/thirdparty/gpacmp4/gpac/constants.h \
|
||||
../src/thirdparty/gpacmp4/gpac/events_constants.h \
|
||||
../src/thirdparty/gpacmp4/gpac/ietf.h \
|
||||
../src/thirdparty/gpacmp4/gpac/isomedia.h \
|
||||
../src/thirdparty/gpacmp4/gpac/list.h \
|
||||
../src/thirdparty/gpacmp4/gpac/maths.h \
|
||||
../src/thirdparty/gpacmp4/gpac/media_tools.h \
|
||||
../src/thirdparty/gpacmp4/gpac/mpeg4_odf.h \
|
||||
../src/thirdparty/gpacmp4/gpac/network.h \
|
||||
../src/thirdparty/gpacmp4/gpac/revision.h \
|
||||
../src/thirdparty/gpacmp4/gpac/setup.h \
|
||||
../src/thirdparty/gpacmp4/gpac/tools.h \
|
||||
../src/thirdparty/gpacmp4/gpac/utf.h \
|
||||
../src/thirdparty/gpacmp4/gpac/version.h \
|
||||
../src/thirdparty/gpacmp4/gpac/iso639.h \
|
||||
../src/thirdparty/gpacmp4/gpac/internal/avilib.h \
|
||||
../src/thirdparty/gpacmp4/gpac/internal/isomedia_dev.h \
|
||||
../src/thirdparty/gpacmp4/gpac/internal/media_dev.h \
|
||||
../src/thirdparty/gpacmp4/gpac/internal/odf_dev.h \
|
||||
../src/thirdparty/gpacmp4/gpac/internal/odf_parse_common.h \
|
||||
../src/thirdparty/gpacmp4/gpac/internal/ogg.h \
|
||||
../src/thirdparty/libpng/pngstruct.h \
|
||||
../src/thirdparty/libpng/pngpriv.h \
|
||||
../src/thirdparty/libpng/pnginfo.h \
|
||||
../src/thirdparty/libpng/pnglibconf.h \
|
||||
../src/thirdparty/libpng/pngconf.h \
|
||||
../src/thirdparty/libpng/pngdebug.h \
|
||||
../src/thirdparty/libpng/png.h \
|
||||
../src/thirdparty/libpng/png.c \
|
||||
../src/thirdparty/libpng/pngerror.c \
|
||||
../src/thirdparty/libpng/pngget.c \
|
||||
../src/thirdparty/libpng/pngmem.c \
|
||||
../src/thirdparty/libpng/pngpread.c \
|
||||
../src/thirdparty/libpng/pngread.c \
|
||||
../src/thirdparty/libpng/pngrio.c \
|
||||
../src/thirdparty/libpng/pngrtran.c \
|
||||
../src/thirdparty/libpng/pngrutil.c \
|
||||
../src/thirdparty/libpng/pngset.c \
|
||||
../src/thirdparty/libpng/pngtrans.c \
|
||||
../src/thirdparty/libpng/pngwio.c \
|
||||
../src/thirdparty/libpng/pngwrite.c \
|
||||
../src/thirdparty/libpng/pngwtran.c \
|
||||
../src/thirdparty/libpng/pngwutil.c \
|
||||
../src/lib_ccx/ccx_common_common.h \
|
||||
../src/lib_ccx/ccx_common_option.h \
|
||||
../src/lib_ccx/utility.h \
|
||||
@@ -155,8 +160,10 @@ ccextractor_SOURCES = \
|
||||
../src/lib_ccx/ccx_encoders_g608.c \
|
||||
../src/lib_ccx/ccx_encoders_helpers.c \
|
||||
../src/lib_ccx/ccx_encoders_helpers.h \
|
||||
../src/lib_ccx/ccx_encoders_python.c \
|
||||
../src/lib_ccx/ccx_encoders_mcc.c \
|
||||
../src/lib_ccx/ccx_encoders_mcc.h \
|
||||
../src/lib_ccx/ccx_encoders_sami.c \
|
||||
../src/lib_ccx/ccx_encoders_scc.c \
|
||||
../src/lib_ccx/ccx_encoders_smptett.c \
|
||||
../src/lib_ccx/ccx_encoders_splitbysentence.c \
|
||||
../src/lib_ccx/ccx_encoders_spupng.c \
|
||||
@@ -202,6 +209,7 @@ ccextractor_SOURCES = \
|
||||
../src/lib_ccx/list.h \
|
||||
../src/lib_ccx/matroska.c \
|
||||
../src/lib_ccx/matroska.h \
|
||||
../src/lib_ccx/mp4.c \
|
||||
../src/lib_ccx/myth.c \
|
||||
../src/lib_ccx/networking.c \
|
||||
../src/lib_ccx/networking.h \
|
||||
@@ -222,101 +230,123 @@ ccextractor_SOURCES = \
|
||||
../src/lib_ccx/ts_tables_epg.c \
|
||||
../src/lib_ccx/wtv_constants.h \
|
||||
../src/lib_ccx/wtv_functions.c \
|
||||
../src/zlib/adler32.c \
|
||||
../src/zlib/compress.c \
|
||||
../src/zlib/crc32.c \
|
||||
../src/zlib/crc32.h \
|
||||
../src/zlib/deflate.c \
|
||||
../src/zlib/deflate.h \
|
||||
../src/zlib/gzclose.c \
|
||||
../src/zlib/gzguts.h \
|
||||
../src/zlib/gzlib.c \
|
||||
../src/zlib/gzread.c \
|
||||
../src/zlib/gzwrite.c \
|
||||
../src/zlib/infback.c \
|
||||
../src/zlib/inffast.c \
|
||||
../src/zlib/inffast.h \
|
||||
../src/zlib/inffixed.h \
|
||||
../src/zlib/inflate.c \
|
||||
../src/zlib/inflate.h \
|
||||
../src/zlib/inftrees.c \
|
||||
../src/zlib/inftrees.h \
|
||||
../src/zlib/trees.c \
|
||||
../src/zlib/trees.h \
|
||||
../src/zlib/uncompr.c \
|
||||
../src/zlib/zconf.h \
|
||||
../src/zlib/zlib.h \
|
||||
../src/zlib/zutil.c \
|
||||
../src/zlib/zutil.h \
|
||||
../src/utf8proc/utf8proc.c \
|
||||
../src/utf8proc/utf8proc.h \
|
||||
../src/lib_hash/sha2.c \
|
||||
../src/lib_hash/sha2.h \
|
||||
../src/protobuf-c/protobuf-c.c \
|
||||
../src/protobuf-c/protobuf-c.h \
|
||||
../src/zvbi/bcd.h \
|
||||
../src/zvbi/bit_slicer.c \
|
||||
../src/zvbi/bit_slicer.h \
|
||||
../src/zvbi/decoder.c \
|
||||
../src/zvbi/macros.h \
|
||||
../src/zvbi/misc.h \
|
||||
../src/zvbi/raw_decoder.c \
|
||||
../src/zvbi/raw_decoder.h \
|
||||
../src/zvbi/sampling_par.c \
|
||||
../src/zvbi/sampling_par.h \
|
||||
../src/zvbi/sliced.h \
|
||||
../src/zvbi/zvbi_decoder.h \
|
||||
../src/wrappers/wrapper.c \
|
||||
../src/wrappers/wrapper.h \
|
||||
../src/freetype/autofit/autofit.c \
|
||||
../src/freetype/base/ftbase.c \
|
||||
../src/freetype/base/ftbbox.c \
|
||||
../src/freetype/base/ftbdf.c \
|
||||
../src/freetype/base/ftbitmap.c \
|
||||
../src/freetype/base/ftcid.c \
|
||||
../src/freetype/base/ftfntfmt.c \
|
||||
../src/freetype/base/ftfstype.c \
|
||||
../src/freetype/base/ftgasp.c \
|
||||
../src/freetype/base/ftglyph.c \
|
||||
../src/freetype/base/ftgxval.c \
|
||||
../src/freetype/base/ftinit.c \
|
||||
../src/freetype/base/ftlcdfil.c \
|
||||
../src/freetype/base/ftmm.c \
|
||||
../src/freetype/base/ftotval.c \
|
||||
../src/freetype/base/ftpatent.c \
|
||||
../src/freetype/base/ftpfr.c \
|
||||
../src/freetype/base/ftstroke.c \
|
||||
../src/freetype/base/ftsynth.c \
|
||||
../src/freetype/base/ftsystem.c \
|
||||
../src/freetype/base/fttype1.c \
|
||||
../src/freetype/base/ftwinfnt.c \
|
||||
../src/freetype/bdf/bdf.c \
|
||||
../src/freetype/bzip2/ftbzip2.c \
|
||||
../src/freetype/cache/ftcache.c \
|
||||
../src/freetype/cff/cff.c \
|
||||
../src/freetype/cid/type1cid.c \
|
||||
../src/freetype/gzip/ftgzip.c \
|
||||
../src/freetype/lzw/ftlzw.c \
|
||||
../src/freetype/pcf/pcf.c \
|
||||
../src/freetype/pfr/pfr.c \
|
||||
../src/freetype/psaux/psaux.c \
|
||||
../src/freetype/pshinter/pshinter.c \
|
||||
../src/freetype/psnames/psnames.c \
|
||||
../src/freetype/raster/raster.c \
|
||||
../src/freetype/sfnt/sfnt.c \
|
||||
../src/freetype/smooth/smooth.c \
|
||||
../src/freetype/truetype/truetype.c \
|
||||
../src/freetype/type1/type1.c \
|
||||
../src/freetype/type42/type42.c \
|
||||
../src/freetype/winfonts/winfnt.c
|
||||
|
||||
../src/thirdparty/zlib/adler32.c \
|
||||
../src/thirdparty/zlib/compress.c \
|
||||
../src/thirdparty/zlib/crc32.c \
|
||||
../src/thirdparty/zlib/crc32.h \
|
||||
../src/thirdparty/zlib/deflate.c \
|
||||
../src/thirdparty/zlib/deflate.h \
|
||||
../src/thirdparty/zlib/gzclose.c \
|
||||
../src/thirdparty/zlib/gzguts.h \
|
||||
../src/thirdparty/zlib/gzlib.c \
|
||||
../src/thirdparty/zlib/gzread.c \
|
||||
../src/thirdparty/zlib/gzwrite.c \
|
||||
../src/thirdparty/zlib/infback.c \
|
||||
../src/thirdparty/zlib/inffast.c \
|
||||
../src/thirdparty/zlib/inffast.h \
|
||||
../src/thirdparty/zlib/inffixed.h \
|
||||
../src/thirdparty/zlib/inflate.c \
|
||||
../src/thirdparty/zlib/inflate.h \
|
||||
../src/thirdparty/zlib/inftrees.c \
|
||||
../src/thirdparty/zlib/inftrees.h \
|
||||
../src/thirdparty/zlib/trees.c \
|
||||
../src/thirdparty/zlib/trees.h \
|
||||
../src/thirdparty/zlib/uncompr.c \
|
||||
../src/thirdparty/zlib/zconf.h \
|
||||
../src/thirdparty/zlib/zlib.h \
|
||||
../src/thirdparty/zlib/zutil.c \
|
||||
../src/thirdparty/zlib/zutil.h \
|
||||
../src/thirdparty/utf8proc/utf8proc.c \
|
||||
../src/thirdparty/utf8proc/utf8proc.h \
|
||||
../src/thirdparty/lib_hash/sha2.c \
|
||||
../src/thirdparty/lib_hash/sha2.h \
|
||||
../src/thirdparty/protobuf-c/protobuf-c.c \
|
||||
../src/thirdparty/protobuf-c/protobuf-c.h \
|
||||
../src/lib_ccx/zvbi/bcd.h \
|
||||
../src/lib_ccx/zvbi/bit_slicer.c \
|
||||
../src/lib_ccx/zvbi/bit_slicer.h \
|
||||
../src/lib_ccx/zvbi/decoder.c \
|
||||
../src/lib_ccx/zvbi/macros.h \
|
||||
../src/lib_ccx/zvbi/misc.h \
|
||||
../src/lib_ccx/zvbi/raw_decoder.c \
|
||||
../src/lib_ccx/zvbi/raw_decoder.h \
|
||||
../src/lib_ccx/zvbi/sampling_par.c \
|
||||
../src/lib_ccx/zvbi/sampling_par.h \
|
||||
../src/lib_ccx/zvbi/sliced.h \
|
||||
../src/lib_ccx/zvbi/zvbi_decoder.h \
|
||||
../src/freetype/* \
|
||||
../src/thirdparty/freetype/autofit/autofit.c \
|
||||
../src/thirdparty/freetype/base/ftbase.c \
|
||||
../src/thirdparty/freetype/base/ftbbox.c \
|
||||
../src/thirdparty/freetype/base/ftbdf.c \
|
||||
../src/thirdparty/freetype/base/ftbitmap.c \
|
||||
../src/thirdparty/freetype/base/ftcid.c \
|
||||
../src/thirdparty/freetype/base/ftfntfmt.c \
|
||||
../src/thirdparty/freetype/base/ftfstype.c \
|
||||
../src/thirdparty/freetype/base/ftgasp.c \
|
||||
../src/thirdparty/freetype/base/ftglyph.c \
|
||||
../src/thirdparty/freetype/base/ftgxval.c \
|
||||
../src/thirdparty/freetype/base/ftinit.c \
|
||||
../src/thirdparty/freetype/base/ftlcdfil.c \
|
||||
../src/thirdparty/freetype/base/ftmm.c \
|
||||
../src/thirdparty/freetype/base/ftotval.c \
|
||||
../src/thirdparty/freetype/base/ftpatent.c \
|
||||
../src/thirdparty/freetype/base/ftpfr.c \
|
||||
../src/thirdparty/freetype/base/ftstroke.c \
|
||||
../src/thirdparty/freetype/base/ftsynth.c \
|
||||
../src/thirdparty/freetype/base/ftsystem.c \
|
||||
../src/thirdparty/freetype/base/fttype1.c \
|
||||
../src/thirdparty/freetype/base/ftwinfnt.c \
|
||||
../src/thirdparty/freetype/bdf/bdf.c \
|
||||
../src/thirdparty/freetype/bzip2/ftbzip2.c \
|
||||
../src/thirdparty/freetype/cache/ftcache.c \
|
||||
../src/thirdparty/freetype/cff/cff.c \
|
||||
../src/thirdparty/freetype/cid/type1cid.c \
|
||||
../src/thirdparty/freetype/gzip/ftgzip.c \
|
||||
../src/thirdparty/freetype/include/ft2build.h \
|
||||
../src/thirdparty/freetype/lzw/ftlzw.c \
|
||||
../src/thirdparty/freetype/pcf/pcf.c \
|
||||
../src/thirdparty/freetype/pfr/pfr.c \
|
||||
../src/thirdparty/freetype/psaux/psaux.c \
|
||||
../src/thirdparty/freetype/pshinter/pshinter.c \
|
||||
../src/thirdparty/freetype/psnames/psnames.c \
|
||||
../src/thirdparty/freetype/raster/raster.c \
|
||||
../src/thirdparty/freetype/sfnt/sfnt.c \
|
||||
../src/thirdparty/freetype/smooth/smooth.c \
|
||||
../src/thirdparty/freetype/truetype/truetype.c \
|
||||
../src/thirdparty/freetype/type1/type1.c \
|
||||
../src/thirdparty/freetype/type42/type42.c \
|
||||
../src/thirdparty/freetype/winfonts/winfnt.c
|
||||
|
||||
ccextractor_CFLAGS = -std=gnu99 -Wno-write-strings -D_FILE_OFFSET_BITS=64 -DVERSION_FILE_PRESENT -DFT2_BUILD_LIBRARY -DGPAC_DISABLE_VTT -DGPAC_DISABLE_OD_DUMP
|
||||
if SYS_IS_APPLE_SILICON
|
||||
ccextractor_SOURCES += ../src/thirdparty/libpng/arm/arm_init.c \
|
||||
../src/thirdparty/libpng/arm/filter_neon_intrinsics.c \
|
||||
../src/thirdparty/libpng/arm/palette_neon_intrinsics.c
|
||||
endif
|
||||
|
||||
ccextractor_CPPFLAGS =-I../src/lib_ccx/ -I../src/gpacmp4/ -I../src/libpng/ -I../src/zlib/ -I../src/zvbi/ -I../src/lib_hash/ -I../src/protobuf-c/ -I../src/utf8proc/ -I../src/ -I../src/freetype/include/
|
||||
ccextractor_CFLAGS = -std=gnu99 -Wno-write-strings -Wno-pointer-sign -D_FILE_OFFSET_BITS=64 -DVERSION_FILE_PRESENT -DFT2_BUILD_LIBRARY -DGPAC_DISABLE_VTT -DGPAC_DISABLE_OD_DUMP -DGPAC_DISABLE_REMOTERY -DNO_GZIP -DGPAC_HAVE_CONFIG_H
|
||||
|
||||
ccextractor_CPPFLAGS =-I../src/lib_ccx/ -I../src/thirdparty/gpacmp4/ -I../src/thirdparty/libpng/ -I../src/thirdparty/zlib/ -I../src/lib_ccx/zvbi/ -I../src/thirdparty/lib_hash/ -I../src/thirdparty/protobuf-c/ -I../src/thirdparty -I../src/ -I../src/thirdparty/freetype/include/
|
||||
|
||||
|
||||
ccextractor_LDADD=-lm
|
||||
ccextractor_LDADD=-lm -lpthread -ldl
|
||||
|
||||
if WITH_RUST
|
||||
ccextractor_LDADD += ./rust/@RUST_TARGET_SUBDIR@/libccx_rust.a
|
||||
else
|
||||
ccextractor_CFLAGS += -DDISABLE_RUST
|
||||
ccextractor_CPPFLAGS += -DDISABLE_RUST
|
||||
endif
|
||||
|
||||
if DEBUG_RELEASE
|
||||
CARGO_RELEASE_ARGS=
|
||||
else
|
||||
CARGO_RELEASE_ARGS=--release
|
||||
endif
|
||||
|
||||
./rust/@RUST_TARGET_SUBDIR@/libccx_rust.a:
|
||||
cd ../src/rust && \
|
||||
CARGO_TARGET_DIR=../../linux/rust $(CARGO) build $(CARGO_RELEASE_ARGS);
|
||||
|
||||
if SYS_IS_LINUX
|
||||
ccextractor_CFLAGS += -O3 -s -DGPAC_CONFIG_LINUX
|
||||
@@ -324,7 +354,11 @@ endif
|
||||
|
||||
if SYS_IS_MAC
|
||||
ccextractor_CFLAGS += -DPAC_CONFIG_DARWIN -Dfopen64=fopen -Dopen64=open -Dlseek64=lseek
|
||||
ccextractor_LDADD += -liconv -lz
|
||||
ccextractor_LDADD += -liconv -lz
|
||||
endif
|
||||
|
||||
if SYS_IS_64_BIT
|
||||
ccextractor_CFLAGS += -DGPAC_64_BITS
|
||||
endif
|
||||
|
||||
if HARDSUBX_IS_ENABLED
|
||||
@@ -364,7 +398,7 @@ ccextractor_LDADD += $(TESS_LIB)
|
||||
ccextractor_LDADD += $(LEPT_LIB)
|
||||
endif
|
||||
|
||||
EXTRA_DIST = ../src/gpacmp4/gpac/sync_layer.h ../src/lib_ccx/ccfont2.xbm ../src/utf8proc/utf8proc_data.c fonts/ icon/
|
||||
EXTRA_DIST = ../src/thirdparty/gpacmp4/gpac/sync_layer.h ../src/lib_ccx/ccfont2.xbm ../src/thirdparty/utf8proc/utf8proc_data.c fonts/ icon/
|
||||
|
||||
#For GUI
|
||||
if BUILD_WITH_GUI
|
||||
@@ -412,12 +446,12 @@ ccextractorGUI_CFLAGS += -O3 -DUNIX
|
||||
ccextractorGUI_CFLAGS += ${glew_CFLAGS}
|
||||
ccextractorGUI_LDADD += ${glew_LIBS}
|
||||
ccextractorGUI_LDFLAGS = -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo
|
||||
ccextractorGUI_LDADD += -lm -L/usr/local/lib -lpthread
|
||||
ccextractorGUI_LDADD += -lglfw -lm -L/usr/local/lib -lpthread
|
||||
endif
|
||||
|
||||
if HARDSUBX_IS_ENABLED
|
||||
if OCR_IS_ENABLED
|
||||
ccextractorGUI_CFLAGS += -DENABLE_OCR
|
||||
ccextractorGUI_CFLAGS += -DENABLE_OCR
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
@@ -1,61 +1,59 @@
|
||||
#!/bin/bash
|
||||
cd `dirname $0`
|
||||
BLD_FLAGS="-std=gnu99 -Wno-write-strings -DGPAC_CONFIG_DARWIN -D_FILE_OFFSET_BITS=64 -DVERSION_FILE_PRESENT -Dfopen64=fopen -Dopen64=open -Dlseek64=lseek -DFT2_BUILD_LIBRARY -DGPAC_DISABLE_VTT -DGPAC_DISABLE_OD_DUMP"
|
||||
BLD_FLAGS="-std=gnu99 -Wno-write-strings -Wno-pointer-sign -DGPAC_CONFIG_DARWIN -D_FILE_OFFSET_BITS=64 -DVERSION_FILE_PRESENT -Dfopen64=fopen -Dopen64=open -Dlseek64=lseek -DFT2_BUILD_LIBRARY -DGPAC_DISABLE_VTT -DGPAC_DISABLE_OD_DUMP -DGPAC_DISABLE_REMOTERY -DNO_GZIP -DGPAC_HAVE_CONFIG_H -DDISABLE_RUST"
|
||||
[[ $1 = "OCR" ]] && BLD_FLAGS="$BLD_FLAGS -DENABLE_OCR"
|
||||
BLD_INCLUDE="-I../src/ -I../src/lib_ccx -I../src/gpacmp4 -I../src/lib_hash -I../src/libpng -I../src/utf8proc -I../src/protobuf-c -I../src/zlib -I../src/zvbi -I../src/freetype/include"
|
||||
BLD_INCLUDE="-I../src/ -I../src/lib_ccx -I../src/thirdparty/gpacmp4 -I../src/lib_hash -I../src/thirdparty/libpng -I../src/thirdparty -I../src/thirdparty/protobuf-c -I../src/thirdparty/zlib -I../src/thirdparty/freetype/include"
|
||||
[[ $1 = "OCR" ]] && BLD_INCLUDE="$BLD_INCLUDE `pkg-config --cflags --silence-errors tesseract`"
|
||||
SRC_CCX="$(find ../src/lib_ccx -name '*.c')"
|
||||
SRC_GPAC="$(find ../src/gpacmp4 -name '*.c')"
|
||||
SRC_LIB_HASH="$(find ../src/lib_hash -name '*.c')"
|
||||
SRC_LIBPNG="$(find ../src/libpng -name '*.c')"
|
||||
SRC_PROTOBUF="$(find ../src/protobuf-c -name '*.c')"
|
||||
SRC_UTF8="../src/utf8proc/utf8proc.c"
|
||||
SRC_ZLIB="$(find ../src/zlib -name '*.c')"
|
||||
SRC_ZVBI="$(find ../src/zvbi -name '*.c')"
|
||||
API_WRAPPERS="$(find ../src/wrappers/ -name '*.c')"
|
||||
SRC_FREETYPE="../src/freetype/autofit/autofit.c \
|
||||
../src/freetype/base/ftbase.c \
|
||||
../src/freetype/base/ftbbox.c \
|
||||
../src/freetype/base/ftbdf.c \
|
||||
../src/freetype/base/ftbitmap.c \
|
||||
../src/freetype/base/ftcid.c \
|
||||
../src/freetype/base/ftfntfmt.c \
|
||||
../src/freetype/base/ftfstype.c \
|
||||
../src/freetype/base/ftgasp.c \
|
||||
../src/freetype/base/ftglyph.c \
|
||||
../src/freetype/base/ftgxval.c \
|
||||
../src/freetype/base/ftinit.c \
|
||||
../src/freetype/base/ftlcdfil.c \
|
||||
../src/freetype/base/ftmm.c \
|
||||
../src/freetype/base/ftotval.c \
|
||||
../src/freetype/base/ftpatent.c \
|
||||
../src/freetype/base/ftpfr.c \
|
||||
../src/freetype/base/ftstroke.c \
|
||||
../src/freetype/base/ftsynth.c \
|
||||
../src/freetype/base/ftsystem.c \
|
||||
../src/freetype/base/fttype1.c \
|
||||
../src/freetype/base/ftwinfnt.c \
|
||||
../src/freetype/bdf/bdf.c \
|
||||
../src/freetype/bzip2/ftbzip2.c \
|
||||
../src/freetype/cache/ftcache.c \
|
||||
../src/freetype/cff/cff.c \
|
||||
../src/freetype/cid/type1cid.c \
|
||||
../src/freetype/gzip/ftgzip.c \
|
||||
../src/freetype/lzw/ftlzw.c \
|
||||
../src/freetype/pcf/pcf.c \
|
||||
../src/freetype/pfr/pfr.c \
|
||||
../src/freetype/psaux/psaux.c \
|
||||
../src/freetype/pshinter/pshinter.c \
|
||||
../src/freetype/psnames/psnames.c \
|
||||
../src/freetype/raster/raster.c \
|
||||
../src/freetype/sfnt/sfnt.c \
|
||||
../src/freetype/smooth/smooth.c \
|
||||
../src/freetype/truetype/truetype.c \
|
||||
../src/freetype/type1/type1.c \
|
||||
../src/freetype/type42/type42.c \
|
||||
../src/freetype/winfonts/winfnt.c"
|
||||
BLD_SOURCES="../src/ccextractor.c $SRC_API $SRC_CCX $SRC_GPAC $SRC_LIB_HASH $SRC_LIBPNG $SRC_PROTOBUF $SRC_UTF8 $SRC_ZLIB $SRC_ZVBI $SRC_FREETYPE $API_WRAPPERS"
|
||||
BLD_LINKER="-lm -liconv"
|
||||
SRC_GPAC="$(find ../src/thirdparty/gpacmp4 -name '*.c')"
|
||||
SRC_LIB_HASH="$(find ../src/thirdparty/lib_hash -name '*.c')"
|
||||
SRC_LIBPNG="$(find ../src/thirdparty/libpng -name '*.c')"
|
||||
SRC_PROTOBUF="$(find ../src/thirdparty/protobuf-c -name '*.c')"
|
||||
SRC_UTF8="../src/thirdparty/utf8proc/utf8proc.c"
|
||||
SRC_ZLIB="$(find ../src/thirdparty/zlib -name '*.c')"
|
||||
SRC_FREETYPE="../src/thirdparty/freetype/autofit/autofit.c \
|
||||
../src/thirdparty/freetype/base/ftbase.c \
|
||||
../src/thirdparty/freetype/base/ftbbox.c \
|
||||
../src/thirdparty/freetype/base/ftbdf.c \
|
||||
../src/thirdparty/freetype/base/ftbitmap.c \
|
||||
../src/thirdparty/freetype/base/ftcid.c \
|
||||
../src/thirdparty/freetype/base/ftfntfmt.c \
|
||||
../src/thirdparty/freetype/base/ftfstype.c \
|
||||
../src/thirdparty/freetype/base/ftgasp.c \
|
||||
../src/thirdparty/freetype/base/ftglyph.c \
|
||||
../src/thirdparty/freetype/base/ftgxval.c \
|
||||
../src/thirdparty/freetype/base/ftinit.c \
|
||||
../src/thirdparty/freetype/base/ftlcdfil.c \
|
||||
../src/thirdparty/freetype/base/ftmm.c \
|
||||
../src/thirdparty/freetype/base/ftotval.c \
|
||||
../src/thirdparty/freetype/base/ftpatent.c \
|
||||
../src/thirdparty/freetype/base/ftpfr.c \
|
||||
../src/thirdparty/freetype/base/ftstroke.c \
|
||||
../src/thirdparty/freetype/base/ftsynth.c \
|
||||
../src/thirdparty/freetype/base/ftsystem.c \
|
||||
../src/thirdparty/freetype/base/fttype1.c \
|
||||
../src/thirdparty/freetype/base/ftwinfnt.c \
|
||||
../src/thirdparty/freetype/bdf/bdf.c \
|
||||
../src/thirdparty/freetype/bzip2/ftbzip2.c \
|
||||
../src/thirdparty/freetype/cache/ftcache.c \
|
||||
../src/thirdparty/freetype/cff/cff.c \
|
||||
../src/thirdparty/freetype/cid/type1cid.c \
|
||||
../src/thirdparty/freetype/gzip/ftgzip.c \
|
||||
../src/thirdparty/freetype/lzw/ftlzw.c \
|
||||
../src/thirdparty/freetype/pcf/pcf.c \
|
||||
../src/thirdparty/freetype/pfr/pfr.c \
|
||||
../src/thirdparty/freetype/psaux/psaux.c \
|
||||
../src/thirdparty/freetype/pshinter/pshinter.c \
|
||||
../src/thirdparty/freetype/psnames/psnames.c \
|
||||
../src/thirdparty/freetype/raster/raster.c \
|
||||
../src/thirdparty/freetype/sfnt/sfnt.c \
|
||||
../src/thirdparty/freetype/smooth/smooth.c \
|
||||
../src/thirdparty/freetype/truetype/truetype.c \
|
||||
../src/thirdparty/freetype/type1/type1.c \
|
||||
../src/thirdparty/freetype/type42/type42.c \
|
||||
../src/thirdparty/freetype/winfonts/winfnt.c"
|
||||
BLD_SOURCES="../src/ccextractor.c $SRC_API $SRC_CCX $SRC_GPAC $SRC_LIB_HASH $SRC_LIBPNG $SRC_PROTOBUF $SRC_UTF8 $SRC_ZLIB $SRC_ZVBI $SRC_FREETYPE"
|
||||
BLD_LINKER="-lm -liconv -lpthread -ldl"
|
||||
[[ $1 = "OCR" ]] && BLD_LINKER="$BLD_LINKER `pkg-config --libs --silence-errors tesseract` `pkg-config --libs --silence-errors lept`"
|
||||
|
||||
./pre-build.sh
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# -*- Autoconf -*-
|
||||
# Process this file with autoconf to produce a configure script.
|
||||
|
||||
AC_PREREQ([2.69])
|
||||
AC_INIT([CCExtractor], [0.87], [carlos@ccextractor.org])
|
||||
AC_PREREQ([2.71])
|
||||
AC_INIT([CCExtractor],[0.94],[carlos@ccextractor.org])
|
||||
AC_CONFIG_AUX_DIR([build-conf])
|
||||
AC_CONFIG_SRCDIR([../src/ccextractor.c])
|
||||
AM_INIT_AUTOMAKE([foreign subdir-objects])
|
||||
|
||||
AC_CONFIG_MACRO_DIRS([m4])
|
||||
|
||||
# Checks for programs.
|
||||
AC_PROG_CC
|
||||
@@ -63,7 +63,7 @@ AC_CHECK_FUNCS([floor ftruncate gethostbyname gettimeofday inet_ntoa mblen memch
|
||||
|
||||
# Checks for arguments with configure
|
||||
AC_ARG_ENABLE([hardsubx],
|
||||
AC_HELP_STRING([--enable-hardsubx], [Enables extraction of burnt subtitles (hard subtitles)]),
|
||||
AS_HELP_STRING([--enable-hardsubx],[Enables extraction of burnt subtitles (hard subtitles)]),
|
||||
[case "${enableval}" in
|
||||
yes) hardsubx=true ;;
|
||||
no) hardsubx=false ;;
|
||||
@@ -71,7 +71,7 @@ AC_HELP_STRING([--enable-hardsubx], [Enables extraction of burnt subtitles (hard
|
||||
esac],[hardsubx=false])
|
||||
|
||||
AC_ARG_ENABLE([ocr],
|
||||
AC_HELP_STRING([--enable-ocr], [Enables Optical Character Recognition]),
|
||||
AS_HELP_STRING([--enable-ocr],[Enables Optical Character Recognition]),
|
||||
[case "${enableval}" in
|
||||
yes) ocr=true ;;
|
||||
no) ocr=false ;;
|
||||
@@ -79,7 +79,7 @@ AC_HELP_STRING([--enable-ocr], [Enables Optical Character Recognition]),
|
||||
esac],[ocr=false])
|
||||
|
||||
AC_ARG_ENABLE([ffmpeg],
|
||||
AC_HELP_STRING([--enable-ffmpeg], [Enable FFmpeg integration]),
|
||||
AS_HELP_STRING([--enable-ffmpeg],[Enable FFmpeg integration]),
|
||||
[case "${enableval}" in
|
||||
yes) ffmpeg=true ;;
|
||||
no) ffmpeg=false ;;
|
||||
@@ -87,12 +87,55 @@ AC_HELP_STRING([--enable-ffmpeg], [Enable FFmpeg integration]),
|
||||
esac],[ffmpeg=false])
|
||||
|
||||
AC_ARG_WITH([gui],
|
||||
AC_HELP_STRING([--with-gui], [Builds CCExtractor with GUI (requires GLFW and GLEW)]),
|
||||
AS_HELP_STRING([--with-gui],[Builds CCExtractor with GUI (requires GLFW and GLEW)]),
|
||||
[PKG_CHECK_MODULES([glfw3], [glfw3]) && PKG_CHECK_MODULES([glew], [glew])],
|
||||
[with_gui=no])
|
||||
|
||||
#Add argument for rust
|
||||
AC_ARG_WITH([rust],
|
||||
AS_HELP_STRING([--with-rust],[Builds CCExtractor with rust library]),
|
||||
[with_rust=$withval],
|
||||
[with_rust=yes])
|
||||
|
||||
#Checks and prompts if libraries found/not found to avoild failure while building
|
||||
AC_MSG_CHECKING(whether to build with rust library)
|
||||
if test "x$with_rust" = "xyes" ; then
|
||||
AC_MSG_RESULT(yes)
|
||||
|
||||
#Check if cargo and rust is installed
|
||||
AC_PATH_PROG([CARGO], [cargo], [notfound])
|
||||
AS_IF([test "$CARGO" = "notfound"], [AC_MSG_ERROR([cargo is required])])
|
||||
|
||||
AC_PATH_PROG([RUSTC], [rustc], [notfound])
|
||||
AS_IF([test "$RUSTC" = "notfound"], [AC_MSG_ERROR([rustc is required])])
|
||||
|
||||
rustc_version=$(rustc --version)
|
||||
MSRV="1.54.0"
|
||||
AX_COMPARE_VERSION($rustc_version, [ge], [$MSRV],
|
||||
[AC_MSG_RESULT(rustc >= $MSRV)],
|
||||
[AC_MSG_ERROR([Minimum supported rust version(MSRV) is $MSRV, please upgrade rust])])
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
fi
|
||||
AM_CONDITIONAL([WITH_RUST], [test "x$with_rust" = "xyes"])
|
||||
|
||||
AC_ARG_ENABLE(debug,
|
||||
AS_HELP_STRING([--enable-debug],[Build Rust code with debugging information [default=no]]),
|
||||
[debug_release=$enableval],
|
||||
[debug_release=no])
|
||||
|
||||
AC_MSG_CHECKING(whether to build Rust code with debugging information)
|
||||
if test "x$debug_release" = "xyes" ; then
|
||||
AC_MSG_RESULT(yes)
|
||||
RUST_TARGET_SUBDIR=debug
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
RUST_TARGET_SUBDIR=release
|
||||
fi
|
||||
AM_CONDITIONAL([DEBUG_RELEASE], [test "x$debug_release" = "xyes"])
|
||||
|
||||
AC_SUBST([RUST_TARGET_SUBDIR])
|
||||
|
||||
#Checks and prompts if libraries found/not found to avoid failure while building
|
||||
AS_IF([ test x$hardsubx = xtrue && test $HAS_AVCODEC -gt 0 ], [AC_MSG_NOTICE(avcodec library found)])
|
||||
AS_IF([ test x$hardsubx = xtrue && test ! $HAS_AVCODEC -gt 0 ], [AC_MSG_ERROR(avcodec library not found. Please install the avcodec library before proceeding)])
|
||||
AS_IF([ test x$hardsubx = xtrue && test $HAS_AVFORMAT -gt 0 ], [AC_MSG_NOTICE(avformat library found)])
|
||||
@@ -110,11 +153,13 @@ AS_IF([ (test x$ocr = xtrue || test x$hardsubx = xtrue) && test ! $HAS_LEPT -gt
|
||||
AM_CONDITIONAL(HARDSUBX_IS_ENABLED, [ test x$hardsubx = xtrue ])
|
||||
AM_CONDITIONAL(OCR_IS_ENABLED, [ test x$ocr = xtrue || test x$hardsubx = xtrue ])
|
||||
AM_CONDITIONAL(FFMPEG_IS_ENABLED, [ test x$ffmpeg = xtrue ])
|
||||
AM_CONDITIONAL(TESSERACT_PRESENT, [ test ! -z `pkg-config --libs-only-l --silence-errors tesseract`])
|
||||
AM_CONDITIONAL(TESSERACT_PRESENT, [ test ! -z `pkg-config --libs-only-l --silence-errors tesseract` ])
|
||||
AM_CONDITIONAL(TESSERACT_PRESENT_RPI, [ test -d "/usr/include/tesseract" && test `ls -A /usr/include/tesseract | wc -l` -gt 0 ])
|
||||
AM_CONDITIONAL(SYS_IS_LINUX, [ test `uname -s` = "Linux"])
|
||||
AM_CONDITIONAL(SYS_IS_MAC, [ test `uname -s` = "Darwin"])
|
||||
AM_CONDITIONAL(SYS_IS_APPLE_SILICON, [ test `uname -a | awk '{print $NF}'` = "arm64" ])
|
||||
AM_CONDITIONAL(BUILD_WITH_GUI, [test "x$with_gui" = "xyes"])
|
||||
AM_CONDITIONAL(SYS_IS_64_BIT,[test `getconf LONG_BIT` = "64"])
|
||||
|
||||
AC_CONFIG_FILES([Makefile])
|
||||
AC_OUTPUT
|
||||
|
||||
BIN
mac/gui/InstallCCExtractorMacGUI.app.zip
Normal file
BIN
mac/gui/InstallCCExtractorMacGUI.app/Contents/Info.plist
Normal file
BIN
mac/gui/InstallCCExtractorMacGUI.app/Contents/MacOS/InstallCCExtractorMacGUI
Executable file
BIN
mac/gui/InstallCCExtractorMacGUI.app/Contents/Resources/MainMenu.nib
generated
Normal file
BIN
mac/gui/InstallCCExtractorMacGUI.app/Contents/Resources/script
Executable file
2
mac/gui/README.md
Normal file
@@ -0,0 +1,2 @@
|
||||
## Simple MacOS GUI for CCExtractor
|
||||
This is a simple GUI for MacOS. It was generated using the open source Platypus tool created by [Sveinbjörn Þórðarson](https://sveinbjorn.org). You can learn more about Platypus [here.](https://sveinbjorn.org/platypus) It is recommended if you need more customization please use the CLI tool as this app only has the default settings.
|
||||
BIN
mac/gui/src/CCExtractor.app/Contents/Info.plist
Normal file
BIN
mac/gui/src/CCExtractor.app/Contents/MacOS/CCExtractor
Executable file
BIN
mac/gui/src/CCExtractor.app/Contents/Resources/AppIcon.icns
Normal file
BIN
mac/gui/src/CCExtractor.app/Contents/Resources/AppSettings.plist
Normal file
BIN
mac/gui/src/CCExtractor.app/Contents/Resources/MainMenu.nib
generated
Normal file
12
mac/gui/src/CCExtractor.app/Contents/Resources/script
Executable file
@@ -0,0 +1,12 @@
|
||||
/usr/local/bin/ccextractor $1
|
||||
|
||||
function display() {
|
||||
osascript <<EOT
|
||||
tell app "System Events"
|
||||
display dialog "$1" buttons {"OK"} default button 1 with title "CCExtractor"
|
||||
return
|
||||
end tell
|
||||
EOT
|
||||
}
|
||||
echo "Done"
|
||||
display "Process Complete. Check the source file's folder for the subtitles."
|
||||
BIN
mac/gui/src/CCExtractor.dmg
Normal file
25
mac/gui/src/HowToGenerateApp.md
Normal file
@@ -0,0 +1,25 @@
|
||||
# HowToGenerateApp
|
||||
|
||||
## Main App
|
||||
|
||||
Script Type: Shell
|
||||
|
||||
Script Path: script.sh located in src folder
|
||||
|
||||
Interface: Droplet
|
||||
|
||||
Remain running after execution: Enabled
|
||||
|
||||
Accept Dropped Files: Enabled
|
||||
|
||||
## Install App
|
||||
|
||||
Script Type: Apple Script
|
||||
|
||||
Script Path: InstallCCExtractor.scpt located in src folder
|
||||
|
||||
Interface: Progress Bar
|
||||
|
||||
Bundled Files: CCExtractor.dmg located in src folder
|
||||
|
||||
Remain running after execution: Disabled
|
||||
BIN
mac/gui/src/InstallCCExtractor.scpt
Normal file
BIN
mac/gui/src/ccx_logo_icon.png
Normal file
|
After Width: | Height: | Size: 39 KiB |
1
mac/gui/src/placeholder.md
Normal file
@@ -0,0 +1 @@
|
||||
place
|
||||
12
mac/gui/src/script.sh
Normal file
@@ -0,0 +1,12 @@
|
||||
/usr/local/bin/ccextractor $1
|
||||
|
||||
function display() {
|
||||
osascript <<EOT
|
||||
tell app "System Events"
|
||||
display dialog "$1" buttons {"OK"} default button 1 with title "CCExtractor"
|
||||
return
|
||||
end tell
|
||||
EOT
|
||||
}
|
||||
echo "Done"
|
||||
display "Process Complete. Check the source file's folder for the subtitles."
|
||||
177
mac/m4/ax_compare_version.m4
Normal file
@@ -0,0 +1,177 @@
|
||||
# ===========================================================================
|
||||
# https://www.gnu.org/software/autoconf-archive/ax_compare_version.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_COMPARE_VERSION(VERSION_A, OP, VERSION_B, [ACTION-IF-TRUE], [ACTION-IF-FALSE])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# This macro compares two version strings. Due to the various number of
|
||||
# minor-version numbers that can exist, and the fact that string
|
||||
# comparisons are not compatible with numeric comparisons, this is not
|
||||
# necessarily trivial to do in a autoconf script. This macro makes doing
|
||||
# these comparisons easy.
|
||||
#
|
||||
# The six basic comparisons are available, as well as checking equality
|
||||
# limited to a certain number of minor-version levels.
|
||||
#
|
||||
# The operator OP determines what type of comparison to do, and can be one
|
||||
# of:
|
||||
#
|
||||
# eq - equal (test A == B)
|
||||
# ne - not equal (test A != B)
|
||||
# le - less than or equal (test A <= B)
|
||||
# ge - greater than or equal (test A >= B)
|
||||
# lt - less than (test A < B)
|
||||
# gt - greater than (test A > B)
|
||||
#
|
||||
# Additionally, the eq and ne operator can have a number after it to limit
|
||||
# the test to that number of minor versions.
|
||||
#
|
||||
# eq0 - equal up to the length of the shorter version
|
||||
# ne0 - not equal up to the length of the shorter version
|
||||
# eqN - equal up to N sub-version levels
|
||||
# neN - not equal up to N sub-version levels
|
||||
#
|
||||
# When the condition is true, shell commands ACTION-IF-TRUE are run,
|
||||
# otherwise shell commands ACTION-IF-FALSE are run. The environment
|
||||
# variable 'ax_compare_version' is always set to either 'true' or 'false'
|
||||
# as well.
|
||||
#
|
||||
# Examples:
|
||||
#
|
||||
# AX_COMPARE_VERSION([3.15.7],[lt],[3.15.8])
|
||||
# AX_COMPARE_VERSION([3.15],[lt],[3.15.8])
|
||||
#
|
||||
# would both be true.
|
||||
#
|
||||
# AX_COMPARE_VERSION([3.15.7],[eq],[3.15.8])
|
||||
# AX_COMPARE_VERSION([3.15],[gt],[3.15.8])
|
||||
#
|
||||
# would both be false.
|
||||
#
|
||||
# AX_COMPARE_VERSION([3.15.7],[eq2],[3.15.8])
|
||||
#
|
||||
# would be true because it is only comparing two minor versions.
|
||||
#
|
||||
# AX_COMPARE_VERSION([3.15.7],[eq0],[3.15])
|
||||
#
|
||||
# would be true because it is only comparing the lesser number of minor
|
||||
# versions of the two values.
|
||||
#
|
||||
# Note: The characters that separate the version numbers do not matter. An
|
||||
# empty string is the same as version 0. OP is evaluated by autoconf, not
|
||||
# configure, so must be a string, not a variable.
|
||||
#
|
||||
# The author would like to acknowledge Guido Draheim whose advice about
|
||||
# the m4_case and m4_ifvaln functions make this macro only include the
|
||||
# portions necessary to perform the specific comparison specified by the
|
||||
# OP argument in the final configure script.
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2008 Tim Toolan <toolan@ele.uri.edu>
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice
|
||||
# and this notice are preserved. This file is offered as-is, without any
|
||||
# warranty.
|
||||
|
||||
#serial 13
|
||||
|
||||
dnl #########################################################################
|
||||
AC_DEFUN([AX_COMPARE_VERSION], [
|
||||
AC_REQUIRE([AC_PROG_AWK])
|
||||
|
||||
# Used to indicate true or false condition
|
||||
ax_compare_version=false
|
||||
|
||||
# Convert the two version strings to be compared into a format that
|
||||
# allows a simple string comparison. The end result is that a version
|
||||
# string of the form 1.12.5-r617 will be converted to the form
|
||||
# 0001001200050617. In other words, each number is zero padded to four
|
||||
# digits, and non digits are removed.
|
||||
AS_VAR_PUSHDEF([A],[ax_compare_version_A])
|
||||
A=`echo "$1" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \
|
||||
-e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \
|
||||
-e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \
|
||||
-e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \
|
||||
-e 's/[[^0-9]]//g'`
|
||||
|
||||
AS_VAR_PUSHDEF([B],[ax_compare_version_B])
|
||||
B=`echo "$3" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \
|
||||
-e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \
|
||||
-e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \
|
||||
-e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \
|
||||
-e 's/[[^0-9]]//g'`
|
||||
|
||||
dnl # In the case of le, ge, lt, and gt, the strings are sorted as necessary
|
||||
dnl # then the first line is used to determine if the condition is true.
|
||||
dnl # The sed right after the echo is to remove any indented white space.
|
||||
m4_case(m4_tolower($2),
|
||||
[lt],[
|
||||
ax_compare_version=`echo "x$A
|
||||
x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/false/;s/x${B}/true/;1q"`
|
||||
],
|
||||
[gt],[
|
||||
ax_compare_version=`echo "x$A
|
||||
x$B" | sed 's/^ *//' | sort | sed "s/x${A}/false/;s/x${B}/true/;1q"`
|
||||
],
|
||||
[le],[
|
||||
ax_compare_version=`echo "x$A
|
||||
x$B" | sed 's/^ *//' | sort | sed "s/x${A}/true/;s/x${B}/false/;1q"`
|
||||
],
|
||||
[ge],[
|
||||
ax_compare_version=`echo "x$A
|
||||
x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/true/;s/x${B}/false/;1q"`
|
||||
],[
|
||||
dnl Split the operator from the subversion count if present.
|
||||
m4_bmatch(m4_substr($2,2),
|
||||
[0],[
|
||||
# A count of zero means use the length of the shorter version.
|
||||
# Determine the number of characters in A and B.
|
||||
ax_compare_version_len_A=`echo "$A" | $AWK '{print(length)}'`
|
||||
ax_compare_version_len_B=`echo "$B" | $AWK '{print(length)}'`
|
||||
|
||||
# Set A to no more than B's length and B to no more than A's length.
|
||||
A=`echo "$A" | sed "s/\(.\{$ax_compare_version_len_B\}\).*/\1/"`
|
||||
B=`echo "$B" | sed "s/\(.\{$ax_compare_version_len_A\}\).*/\1/"`
|
||||
],
|
||||
[[0-9]+],[
|
||||
# A count greater than zero means use only that many subversions
|
||||
A=`echo "$A" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"`
|
||||
B=`echo "$B" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"`
|
||||
],
|
||||
[.+],[
|
||||
AC_WARNING(
|
||||
[invalid OP numeric parameter: $2])
|
||||
],[])
|
||||
|
||||
# Pad zeros at end of numbers to make same length.
|
||||
ax_compare_version_tmp_A="$A`echo $B | sed 's/./0/g'`"
|
||||
B="$B`echo $A | sed 's/./0/g'`"
|
||||
A="$ax_compare_version_tmp_A"
|
||||
|
||||
# Check for equality or inequality as necessary.
|
||||
m4_case(m4_tolower(m4_substr($2,0,2)),
|
||||
[eq],[
|
||||
test "x$A" = "x$B" && ax_compare_version=true
|
||||
],
|
||||
[ne],[
|
||||
test "x$A" != "x$B" && ax_compare_version=true
|
||||
],[
|
||||
AC_WARNING([invalid OP parameter: $2])
|
||||
])
|
||||
])
|
||||
|
||||
AS_VAR_POPDEF([A])dnl
|
||||
AS_VAR_POPDEF([B])dnl
|
||||
|
||||
dnl # Execute ACTION-IF-TRUE / ACTION-IF-FALSE.
|
||||
if test "$ax_compare_version" = "true" ; then
|
||||
m4_ifvaln([$4],[$4],[:])dnl
|
||||
m4_ifvaln([$5],[else $5])dnl
|
||||
fi
|
||||
]) dnl AX_COMPARE_VERSION
|
||||
@@ -21,7 +21,7 @@ fi
|
||||
if [ -z "$commit" ]; then
|
||||
commit="Unknown"
|
||||
fi
|
||||
builddate=`date --utc --date="@${SOURCE_DATE_EPOCH:-$(date +%s)}" +%Y-%m-%d`
|
||||
builddate=`date -j -u -r "${SOURCE_DATE_EPOCH:-$(date +%s)}" +%Y-%m-%d`
|
||||
echo "Storing variables in file"
|
||||
echo "Commit: $commit"
|
||||
echo "Date: $builddate"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
pkgname=ccextractor
|
||||
pkgver=0.85
|
||||
pkgver=0.94
|
||||
pkgrel=1
|
||||
pkgdesc="A closed captions and teletext subtitles extractor for video streams."
|
||||
arch=('i686' 'x86_64')
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
Name: ccextractor
|
||||
Version: 0.85
|
||||
Version: 0.88
|
||||
Release: 1
|
||||
Summary: A closed captions and teletext subtitles extractor for video streams.
|
||||
Group: Applications/Internet
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/bin/bash
|
||||
TYPE="debian" # can be one of 'slackware', 'debian', 'rpm'
|
||||
PROGRAM_NAME="ccextractor"
|
||||
VERSION="0.85"
|
||||
VERSION="0.88"
|
||||
RELEASE="1"
|
||||
LICENSE="GPL-2.0"
|
||||
MAINTAINER="carlos@ccextractor.org"
|
||||
|
||||
16
src/BUILD
Normal file
@@ -0,0 +1,16 @@
|
||||
cc_binary(
|
||||
name = "ccextractor",
|
||||
srcs = ["ccextractor.c",
|
||||
"ccextractor.h"],
|
||||
deps = [
|
||||
"//src/lib_ccx:lib_ccx",
|
||||
"//src/thirdparty/protobuf-c:protobuf-c",
|
||||
"//src/thirdparty/gpacmp4:gpacmp4",
|
||||
"//src/thirdparty/zlib:zlib",
|
||||
"//src/thirdparty/freetype:freetype"
|
||||
],
|
||||
copts = [ "-Isrc/thirdparty/protobuf-c", "-Isrc/thirdparty/libpng", "-Isrc" ]
|
||||
)
|
||||
|
||||
exports_files (["ccextractor.h"], ["//src/lib_ccx:__pkg__"])
|
||||
|
||||
@@ -6,10 +6,11 @@ option (WITH_FFMPEG "Build using FFmpeg demuxer and decoder" OFF)
|
||||
option (WITH_OCR "Build with OCR (Optical Character Recognition) feature" OFF)
|
||||
option (WITH_SHARING "Build with sharing and translation support" OFF)
|
||||
option (WITH_HARDSUBX "Build with support for burned-in subtitles" OFF)
|
||||
option (WITHOUT_RUST "Build without Rust library" OFF)
|
||||
|
||||
# Version number
|
||||
set (CCEXTRACTOR_VERSION_MAJOR 0)
|
||||
set (CCEXTRACTOR_VERSION_MINOR 85b)
|
||||
set (CCEXTRACTOR_VERSION_MINOR 89)
|
||||
|
||||
# Get project directory
|
||||
get_filename_component(BASE_PROJ_DIR ../ ABSOLUTE)
|
||||
@@ -40,78 +41,93 @@ configure_file (
|
||||
"${PROJECT_SOURCE_DIR}/lib_ccx/compile_info_real.h"
|
||||
)
|
||||
|
||||
add_definitions(-DVERSION_FILE_PRESENT -DFT2_BUILD_LIBRARY -DGPAC_DISABLE_VTT -DGPAC_DISABLE_OD_DUMP)
|
||||
add_definitions(-DVERSION_FILE_PRESENT -DFT2_BUILD_LIBRARY -DGPAC_DISABLE_VTT -DGPAC_DISABLE_OD_DUMP -DGPAC_DISABLE_REMOTERY -DNO_GZIP -DGPAC_HAVE_CONFIG_H)
|
||||
|
||||
include_directories ("${PROJECT_SOURCE_DIR}")
|
||||
include_directories ("${PROJECT_SOURCE_DIR}/lib_ccx/")
|
||||
include_directories ("${PROJECT_SOURCE_DIR}/utf8proc/")
|
||||
include_directories ("${PROJECT_SOURCE_DIR}/gpacmp4/")
|
||||
include_directories ("${PROJECT_SOURCE_DIR}/protobuf-c/")
|
||||
include_directories ("${PROJECT_SOURCE_DIR}/zvbi/")
|
||||
include_directories ("${PROJECT_SOURCE_DIR}/lib_hash/")
|
||||
include_directories ("${PROJECT_SOURCE_DIR}/wrappers/")
|
||||
include_directories ("${PROJECT_SOURCE_DIR}/libpng/")
|
||||
include_directories ("${PROJECT_SOURCE_DIR}/zlib/")
|
||||
include_directories ("${PROJECT_SOURCE_DIR}/freetype/include/")
|
||||
aux_source_directory ("${PROJECT_SOURCE_DIR}/protobuf-c/" SOURCEFILE)
|
||||
aux_source_directory ("${PROJECT_SOURCE_DIR}/zvbi/" SOURCEFILE)
|
||||
aux_source_directory ("${PROJECT_SOURCE_DIR}/lib_hash/" SOURCEFILE)
|
||||
aux_source_directory ("${PROJECT_SOURCE_DIR}/wrappers/" SOURCEFILE)
|
||||
aux_source_directory ("${PROJECT_SOURCE_DIR}/libpng/" SOURCEFILE)
|
||||
aux_source_directory ("${PROJECT_SOURCE_DIR}/zlib/" SOURCEFILE)
|
||||
if(UNIX)
|
||||
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
||||
add_definitions(-DGPAC_CONFIG_DARWIN)
|
||||
else ()
|
||||
add_definitions(-DGPAC_CONFIG_LINUX)
|
||||
endif()
|
||||
endif(UNIX)
|
||||
|
||||
set(UTF8PROC_SOURCE
|
||||
${PROJECT_SOURCE_DIR}/utf8proc/utf8proc.c
|
||||
)
|
||||
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||
add_definitions(-DGPAC_64_BITS)
|
||||
endif()
|
||||
|
||||
include_directories(${PROJECT_SOURCE_DIR})
|
||||
include_directories(${PROJECT_SOURCE_DIR}/lib_ccx)
|
||||
include_directories(${PROJECT_SOURCE_DIR}/lib_ccx/zvbi)
|
||||
include_directories(${PROJECT_SOURCE_DIR}/thirdparty)
|
||||
include_directories(${PROJECT_SOURCE_DIR}/thirdparty/gpacmp4)
|
||||
include_directories(${PROJECT_SOURCE_DIR}/thirdparty/protobuf-c)
|
||||
include_directories(${PROJECT_SOURCE_DIR}/thirdparty/lib_hash)
|
||||
include_directories(${PROJECT_SOURCE_DIR}/thirdparty/libpng)
|
||||
|
||||
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin" AND ${CMAKE_HOST_SYSTEM_PROCESSOR} MATCHES "arm64")
|
||||
include_directories(${PROJECT_SOURCE_DIR}/thirdparty/libpng/arm)
|
||||
aux_source_directory(${PROJECT_SOURCE_DIR}/thirdparty/libpng/arm SOURCEFILE)
|
||||
endif ()
|
||||
|
||||
include_directories(${PROJECT_SOURCE_DIR}/thirdparty/zlib)
|
||||
include_directories(${PROJECT_SOURCE_DIR}/thirdparty/freetype/include)
|
||||
aux_source_directory(${PROJECT_SOURCE_DIR}/thirdparty/gpacmp4/ SOURCEFILE)
|
||||
aux_source_directory(${PROJECT_SOURCE_DIR}/thirdparty/lib_hash/ SOURCEFILE)
|
||||
aux_source_directory(${PROJECT_SOURCE_DIR}/thirdparty/libpng/ SOURCEFILE)
|
||||
aux_source_directory(${PROJECT_SOURCE_DIR}/thirdparty/protobuf-c/ SOURCEFILE)
|
||||
aux_source_directory(${PROJECT_SOURCE_DIR}/thirdparty/zlib/ SOURCEFILE)
|
||||
aux_source_directory(${PROJECT_SOURCE_DIR}/lib_ccx/zvbi/ SOURCEFILE)
|
||||
|
||||
set(UTF8PROC_SOURCE ${PROJECT_SOURCE_DIR}/thirdparty/utf8proc/utf8proc.c)
|
||||
|
||||
set(FREETYPE_SOURCE
|
||||
${PROJECT_SOURCE_DIR}/freetype/autofit/autofit.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/base/ftbase.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/base/ftbbox.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/base/ftbdf.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/base/ftbitmap.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/base/ftcid.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/base/ftfntfmt.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/base/ftfstype.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/base/ftgasp.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/base/ftglyph.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/base/ftgxval.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/base/ftinit.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/base/ftlcdfil.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/base/ftmm.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/base/ftotval.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/base/ftpatent.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/base/ftpfr.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/base/ftstroke.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/base/ftsynth.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/base/ftsystem.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/base/fttype1.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/base/ftwinfnt.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/bdf/bdf.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/bzip2/ftbzip2.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/cache/ftcache.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/cff/cff.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/cid/type1cid.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/gzip/ftgzip.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/lzw/ftlzw.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/pcf/pcf.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/pfr/pfr.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/psaux/psaux.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/pshinter/pshinter.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/psnames/psnames.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/raster/raster.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/sfnt/sfnt.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/smooth/smooth.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/truetype/truetype.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/type1/type1.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/type42/type42.c
|
||||
${PROJECT_SOURCE_DIR}/freetype/winfonts/winfnt.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/autofit/autofit.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/base/ftbase.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/base/ftbbox.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/base/ftbdf.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/base/ftbitmap.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/base/ftcid.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/base/ftfntfmt.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/base/ftfstype.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/base/ftgasp.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/base/ftglyph.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/base/ftgxval.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/base/ftinit.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/base/ftlcdfil.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/base/ftmm.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/base/ftotval.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/base/ftpatent.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/base/ftpfr.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/base/ftstroke.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/base/ftsynth.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/base/ftsystem.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/base/fttype1.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/base/ftwinfnt.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/bdf/bdf.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/bzip2/ftbzip2.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/cache/ftcache.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/cff/cff.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/cid/type1cid.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/gzip/ftgzip.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/lzw/ftlzw.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/pcf/pcf.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/pfr/pfr.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/psaux/psaux.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/pshinter/pshinter.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/psnames/psnames.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/raster/raster.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/sfnt/sfnt.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/smooth/smooth.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/truetype/truetype.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/type1/type1.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/type42/type42.c
|
||||
${PROJECT_SOURCE_DIR}/thirdparty/freetype/winfonts/winfnt.c
|
||||
)
|
||||
#Windows specific libraries and linker flags
|
||||
if(WIN32)
|
||||
include_directories ("${PROJECT_SOURCE_DIR}/win_spec_incld/")
|
||||
include_directories ("${PROJECT_SOURCE_DIR}/win_iconv/")
|
||||
aux_source_directory ("${PROJECT_SOURCE_DIR}/win_iconv/" SOURCEFILE)
|
||||
include_directories ("${PROJECT_SOURCE_DIR}/thirdparty/win_spec_incld/")
|
||||
include_directories ("${PROJECT_SOURCE_DIR}/thirdparty/win_iconv/")
|
||||
aux_source_directory ("${PROJECT_SOURCE_DIR}/thirdparty/win_iconv/" SOURCEFILE)
|
||||
set (EXTRA_LIBS ${EXTRA_LIBS} ws2_32 winmm)
|
||||
else (WIN32)
|
||||
# Adding some platform specific library path
|
||||
@@ -128,7 +144,7 @@ endif(MSVC)
|
||||
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_FILE_OFFSET_BITS=64")
|
||||
add_subdirectory (lib_ccx)
|
||||
|
||||
aux_source_directory (${PROJECT_SOURCE_DIR} SOURCEFILE)
|
||||
aux_source_directory(${PROJECT_SOURCE_DIR} SOURCEFILE)
|
||||
set (EXTRA_LIBS ${EXTRA_LIBS} ccx)
|
||||
# set (EXTRA_LIBS ${EXTRA_LIBS} m)
|
||||
|
||||
@@ -137,7 +153,7 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
||||
endif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
||||
|
||||
|
||||
set (EXTRA_LIBS ${EXTRA_LIBS} -lz -lm -lpthread)
|
||||
set (EXTRA_LIBS ${EXTRA_LIBS} -lm -lpthread -ldl)
|
||||
|
||||
find_package (PkgConfig)
|
||||
|
||||
@@ -193,8 +209,8 @@ if (PKG_CONFIG_FOUND AND WITH_SHARING)
|
||||
pkg_check_modules (NANOMSG REQUIRED libnanomsg)
|
||||
set (EXTRA_LIBS ${EXTRA_LIBS} ${NANOMSG_STATIC_LIBRARIES})
|
||||
|
||||
include_directories ("${PROJECT_SOURCE_DIR}/protobuf-c/")
|
||||
aux_source_directory ("${PROJECT_SOURCE_DIR}/protobuf-c/" SOURCEFILE)
|
||||
include_directories ("${PROJECT_SOURCE_DIR}/thirdparty/protobuf-c/")
|
||||
aux_source_directory ("${PROJECT_SOURCE_DIR}/thirdparty/protobuf-c/" SOURCEFILE)
|
||||
|
||||
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DENABLE_SHARING")
|
||||
endif (PKG_CONFIG_FOUND AND WITH_SHARING)
|
||||
@@ -225,6 +241,21 @@ if (PKG_CONFIG_FOUND AND WITH_HARDSUBX)
|
||||
endif (PKG_CONFIG_FOUND AND WITH_HARDSUBX)
|
||||
|
||||
add_executable (ccextractor ${SOURCEFILE} ${FREETYPE_SOURCE} ${UTF8PROC_SOURCE})
|
||||
|
||||
########################################################
|
||||
# Build with Rust library
|
||||
########################################################
|
||||
|
||||
if (PKG_CONFIG_FOUND AND NOT WITHOUT_RUST)
|
||||
add_subdirectory (rust)
|
||||
get_target_property(RUST_LIB ccx_rust LOCATION)
|
||||
set (EXTRA_LIBS ${EXTRA_LIBS} ${RUST_LIB})
|
||||
add_dependencies(ccextractor ccx_rust)
|
||||
else ()
|
||||
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DDISABLE_RUST")
|
||||
endif (PKG_CONFIG_FOUND AND NOT WITHOUT_RUST)
|
||||
|
||||
|
||||
target_link_libraries (ccextractor ${EXTRA_LIBS})
|
||||
target_include_directories (ccextractor PUBLIC ${EXTRA_INCLUDES})
|
||||
|
||||
|
||||
@@ -7,10 +7,10 @@
|
||||
int activity(struct nk_context *ctx, int x, int y, int width, int height, struct main_tab *main_settings)
|
||||
{
|
||||
static int i;
|
||||
if (nk_begin(ctx, "Activity", nk_rect(x, y, width, height), NK_WINDOW_TITLE|NK_WINDOW_BACKGROUND))
|
||||
if (nk_begin(ctx, "Activity", nk_rect(x, y, width, height), NK_WINDOW_TITLE | NK_WINDOW_BACKGROUND))
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 40, 1);
|
||||
for(i = 0; i < main_settings->activity_string_count; i++)
|
||||
for (i = 0; i < main_settings->activity_string_count; i++)
|
||||
nk_label_wrap(ctx, main_settings->activity_string[i]);
|
||||
}
|
||||
nk_end(ctx);
|
||||
|
||||
@@ -13,8 +13,6 @@
|
||||
#include <GL/glew.h>
|
||||
#include <GLFW/glfw3.h>
|
||||
|
||||
|
||||
|
||||
#define PATH_LENGTH 66
|
||||
#define NAME_LENGTH 56
|
||||
#define PREFIX_LENGTH_TRUNCATED 10
|
||||
@@ -31,6 +29,7 @@
|
||||
#include "nuklear_lib/nuklear.h"
|
||||
#include "nuklear_lib/nuklear_glfw_gl2.h"
|
||||
|
||||
#include "icon_data.c"
|
||||
|
||||
//#define WINDOW_WIDTH 1200
|
||||
//#define WINDOW_HEIGHT 800
|
||||
@@ -54,7 +53,6 @@
|
||||
#define STB_IMAGE_IMPLEMENTATION
|
||||
#include "stb_image.h"
|
||||
|
||||
|
||||
static struct main_tab main_settings;
|
||||
|
||||
/*Trigger command for CLI*/
|
||||
@@ -62,7 +60,6 @@ char command[20];
|
||||
|
||||
/*Global Variables for Drag and Drop files*/
|
||||
|
||||
|
||||
/* Width and Height of all frames*/
|
||||
const GLint WIDTH_mainPanelAndWindow = 530, HEIGHT_mainPanelandWindow = 550;
|
||||
const GLint WIDTH_termORPreviewPanel = 530, HEIGHT_termORPreviewPanel = 100;
|
||||
@@ -78,38 +75,35 @@ static int tab_screen_height;
|
||||
/*Parameter Constants*/
|
||||
static int modifiedParams = 0;
|
||||
|
||||
|
||||
static void error_callback(int e, const char *d)
|
||||
{
|
||||
printf("Error %d: %s\n", e, d);
|
||||
}
|
||||
|
||||
void drop_callback(GLFWwindow* window, int count, const char **paths)
|
||||
void drop_callback(GLFWwindow *window, int count, const char **paths)
|
||||
{
|
||||
int i,j,k,z,copycount, prefix_length, slash_length, fileNameTruncated_index;
|
||||
|
||||
int i, j, k, z, copycount, prefix_length, slash_length, fileNameTruncated_index;
|
||||
|
||||
printf("Number of selected paths:%d\n", count);
|
||||
|
||||
if(main_settings.filename_count == 0 && main_settings.filenames == NULL)
|
||||
main_settings.filenames = (char**)calloc(count + 1, sizeof(char*));
|
||||
if (main_settings.filename_count == 0 && main_settings.filenames == NULL)
|
||||
main_settings.filenames = (char **)calloc(count + 1, sizeof(char *));
|
||||
else
|
||||
main_settings.filenames = (char**)realloc(main_settings.filenames, (main_settings.filename_count + count + 1) * sizeof(char*));
|
||||
main_settings.filenames = (char **)realloc(main_settings.filenames, (main_settings.filename_count + count + 1) * sizeof(char *));
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
printf("\n%d", main_settings.filename_count);
|
||||
|
||||
main_settings.filenames[main_settings.filename_count] = (char*)calloc((strlen(paths[i])+5), sizeof(char));
|
||||
main_settings.filenames[main_settings.filename_count] = (char *)calloc((strlen(paths[i]) + 5), sizeof(char));
|
||||
main_settings.filenames[main_settings.filename_count][0] = '\"';
|
||||
strcat(main_settings.filenames[main_settings.filename_count], paths[i]);
|
||||
strcat(main_settings.filenames[main_settings.filename_count], "\"");
|
||||
puts(main_settings.filenames[main_settings.filename_count]);
|
||||
puts(main_settings.filenames[main_settings.filename_count]);
|
||||
main_settings.filename_count++;
|
||||
}
|
||||
main_settings.filenames[main_settings.filename_count] = NULL;
|
||||
|
||||
main_settings.filenames[main_settings.filename_count] = NULL;
|
||||
}
|
||||
|
||||
|
||||
/*Rectangle to hold file names*/
|
||||
//void draw_file_rectangle_widget(struct nk_context *ctx, struct nk_font *font)
|
||||
//{
|
||||
@@ -137,7 +131,7 @@ void drop_callback(GLFWwindow* window, int count, const char **paths)
|
||||
// space.y = space.y + 20;
|
||||
// }
|
||||
// }
|
||||
//
|
||||
//
|
||||
//}
|
||||
|
||||
/*Rectangle to hold extraction info*/
|
||||
@@ -188,7 +182,8 @@ int main(void)
|
||||
glfwSetWindowUserPointer(win, &ctx);
|
||||
glfwSetDropCallback(win, drop_callback);
|
||||
|
||||
if (glewInit() != GLEW_OK) {
|
||||
if (glewInit() != GLEW_OK)
|
||||
{
|
||||
fprintf(stderr, "Failed to setup GLEW\n");
|
||||
exit(1);
|
||||
}
|
||||
@@ -202,20 +197,12 @@ int main(void)
|
||||
ctx = nk_glfw3_init(win, NK_GLFW3_INSTALL_CALLBACKS);
|
||||
struct nk_font_atlas *font_atlas;
|
||||
nk_glfw3_font_stash_begin(&font_atlas);
|
||||
#ifdef _WIN32
|
||||
struct nk_font *droid = nk_font_atlas_add_from_file(font_atlas, "../../fonts/Roboto-Regular.ttf", 16, 0);
|
||||
struct nk_font *droid_big = nk_font_atlas_add_from_file(font_atlas, "../../fonts/Roboto-Regular.ttf", 25, 0);
|
||||
struct nk_font *droid_head = nk_font_atlas_add_from_file(font_atlas, "../../fonts/Roboto-Regular.ttf", 20, 0);
|
||||
#else
|
||||
struct nk_font *droid = nk_font_atlas_add_from_file(font_atlas, "../fonts/Roboto-Regular.ttf", 16, 0);
|
||||
struct nk_font *droid_big = nk_font_atlas_add_from_file(font_atlas, "../fonts/Roboto-Regular.ttf", 25, 0);
|
||||
struct nk_font *droid_head = nk_font_atlas_add_from_file(font_atlas, "../fonts/Roboto-Regular.ttf", 20, 0);
|
||||
#endif
|
||||
struct nk_font *droid = nk_font_atlas_add_from_memory(font_atlas, roboto_regular_font, sizeof(roboto_regular_font), 16, 0);
|
||||
struct nk_font *droid_big = nk_font_atlas_add_from_memory(font_atlas, roboto_regular_font, sizeof(roboto_regular_font), 25, 0);
|
||||
struct nk_font *droid_head = nk_font_atlas_add_from_memory(font_atlas, roboto_regular_font, sizeof(roboto_regular_font), 20, 0);
|
||||
nk_glfw3_font_stash_end();
|
||||
nk_style_set_font(ctx, &droid->handle);
|
||||
|
||||
|
||||
|
||||
//CHECKBOX VALUES
|
||||
static int show_terminal_check = nk_false;
|
||||
static int show_preview_check = nk_false;
|
||||
@@ -223,7 +210,7 @@ int main(void)
|
||||
static int advanced_mode_check = nk_false;
|
||||
static int file_extension_check = nk_true;
|
||||
|
||||
/*Settigs and tab options*/
|
||||
/*Settings and tab options*/
|
||||
setup_main_settings(&main_settings);
|
||||
static struct network_popup network_settings;
|
||||
setup_network_settings(&network_settings);
|
||||
@@ -247,49 +234,38 @@ int main(void)
|
||||
|
||||
/* icons */
|
||||
|
||||
media.icons.home = icon_load(home_icon_data, sizeof(home_icon_data));
|
||||
media.icons.directory = icon_load(directory_icon_data, sizeof(directory_icon_data));
|
||||
media.icons.computer = icon_load(computer_icon_data, sizeof(computer_icon_data));
|
||||
#ifdef _WIN32
|
||||
media.icons.home = icon_load("../../icon/home.png");
|
||||
media.icons.directory = icon_load("../../icon/directory.png");
|
||||
media.icons.computer = icon_load("../../icon/computer.png");
|
||||
media.icons.drives = icon_load("../../icon/drive.png");
|
||||
media.icons.desktop = icon_load("../../icon/desktop.png");
|
||||
media.icons.default_file = icon_load("../../icon/default.png");
|
||||
media.icons.text_file = icon_load("../../icon/text.png");
|
||||
media.icons.music_file = icon_load("../../icon/music.png");
|
||||
media.icons.font_file = icon_load("../../icon/font.png");
|
||||
media.icons.img_file = icon_load("../../icon/img.png");
|
||||
media.icons.movie_file = icon_load("../../icon/movie.png");
|
||||
#else
|
||||
media.icons.home = icon_load("../icon/home.png");
|
||||
media.icons.directory = icon_load("../icon/directory.png");
|
||||
media.icons.computer = icon_load("../icon/computer.png");
|
||||
media.icons.desktop = icon_load("../icon/desktop.png");
|
||||
media.icons.default_file = icon_load("../icon/default.png");
|
||||
media.icons.text_file = icon_load("../icon/text.png");
|
||||
media.icons.music_file = icon_load("../icon/music.png");
|
||||
media.icons.font_file = icon_load("../icon/font.png");
|
||||
media.icons.img_file = icon_load("../icon/img.png");
|
||||
media.icons.movie_file = icon_load("../icon/movie.png");
|
||||
media.icons.drives = icon_load(drive_icon_data, sizeof(drive_icon_data));
|
||||
#endif
|
||||
media.icons.desktop = icon_load(desktop_icon_data, sizeof(desktop_icon_data));
|
||||
media.icons.default_file = icon_load(default_icon_data, sizeof(default_icon_data));
|
||||
media.icons.text_file = icon_load(text_icon_data, sizeof(text_icon_data));
|
||||
media.icons.music_file = icon_load(music_icon_data, sizeof(music_icon_data));
|
||||
media.icons.font_file = icon_load(font_icon_data, sizeof(font_icon_data));
|
||||
media.icons.img_file = icon_load(img_icon_data, sizeof(img_icon_data));
|
||||
media.icons.movie_file = icon_load(movie_icon_data, sizeof(movie_icon_data));
|
||||
|
||||
media_init(&media);
|
||||
media_init(&media);
|
||||
|
||||
file_browser_init(&browser, &media);
|
||||
file_browser_init(&browser, &media);
|
||||
|
||||
/*Read Last run state*/
|
||||
FILE *loadFile;
|
||||
loadFile = fopen("ccxGUI.ini", "r");
|
||||
if(loadFile != NULL)
|
||||
{
|
||||
printf("File found and reading it!\n");
|
||||
load_data(loadFile, &main_settings, &input, &advanced_input, &output, &decoders, &credits, &debug, &hd_homerun, &burned_subs, &network_settings);
|
||||
fclose(loadFile);
|
||||
}
|
||||
/*Read Last run state*/
|
||||
FILE *loadFile;
|
||||
loadFile = fopen("ccxGUI.ini", "r");
|
||||
if (loadFile != NULL)
|
||||
{
|
||||
printf("File found and reading it!\n");
|
||||
load_data(loadFile, &main_settings, &input, &advanced_input, &output, &decoders, &credits, &debug, &hd_homerun, &burned_subs, &network_settings);
|
||||
fclose(loadFile);
|
||||
}
|
||||
|
||||
/*Main GUI loop*/
|
||||
while (nk_true)
|
||||
{
|
||||
if(glfwWindowShouldClose(win))
|
||||
if (glfwWindowShouldClose(win))
|
||||
{
|
||||
FILE *saveFile;
|
||||
saveFile = fopen("ccxGUI.ini", "w");
|
||||
@@ -301,27 +277,24 @@ int main(void)
|
||||
glfwPollEvents();
|
||||
nk_glfw3_new_frame();
|
||||
|
||||
|
||||
//Popups
|
||||
static int show_progress_details = nk_false;
|
||||
static int show_about_ccx = nk_false;
|
||||
static int show_getting_started = nk_false;
|
||||
|
||||
|
||||
|
||||
//GUI
|
||||
if (nk_begin(ctx, "CCExtractor", nk_rect(0, 0, WIDTH_mainPanelAndWindow, HEIGHT_mainPanelandWindow),
|
||||
NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_BACKGROUND))
|
||||
NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_BACKGROUND))
|
||||
{
|
||||
|
||||
|
||||
//MENUBAR
|
||||
//MENUBAR
|
||||
nk_menubar_begin(ctx);
|
||||
nk_layout_row_begin(ctx, NK_STATIC, 30, 3);
|
||||
nk_layout_row_push(ctx, 80);
|
||||
if (nk_menu_begin_label(ctx, "Preferences", NK_TEXT_LEFT, nk_vec2(120, 200))) {
|
||||
if (nk_menu_begin_label(ctx, "Preferences", NK_TEXT_LEFT, nk_vec2(120, 200)))
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 30, 1);
|
||||
if(nk_menu_item_label(ctx, "Reset Defaults", NK_TEXT_LEFT))
|
||||
if (nk_menu_item_label(ctx, "Reset Defaults", NK_TEXT_LEFT))
|
||||
{
|
||||
remove("ccxGUI.ini");
|
||||
setup_main_settings(&main_settings);
|
||||
@@ -334,14 +307,14 @@ int main(void)
|
||||
setup_debug_tab(&debug);
|
||||
setup_hd_homerun_tab(&hd_homerun);
|
||||
setup_burned_subs_tab(&burned_subs);
|
||||
|
||||
}
|
||||
if (nk_menu_item_label(ctx, "Network Settings", NK_TEXT_LEFT))
|
||||
network_settings.show_network_settings = nk_true;
|
||||
nk_menu_end(ctx);
|
||||
}
|
||||
nk_layout_row_push(ctx, 70);
|
||||
if (nk_menu_begin_label(ctx, "Windows", NK_TEXT_LEFT, nk_vec2(120, 200))) {
|
||||
if (nk_menu_begin_label(ctx, "Windows", NK_TEXT_LEFT, nk_vec2(120, 200)))
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 30, 1);
|
||||
nk_checkbox_label(ctx, "Activity", &show_activity_check);
|
||||
nk_checkbox_label(ctx, "Terminal", &show_terminal_check);
|
||||
@@ -358,38 +331,39 @@ int main(void)
|
||||
show_about_ccx = nk_true;
|
||||
nk_menu_end(ctx);
|
||||
}
|
||||
|
||||
//Network Settings
|
||||
|
||||
//Network Settings
|
||||
if (network_settings.show_network_settings)
|
||||
draw_network_popup(ctx, &network_settings);
|
||||
|
||||
//About CCExtractor Popup
|
||||
//About CCExtractor Popup
|
||||
if (show_about_ccx)
|
||||
draw_about_ccx_popup(ctx, &show_about_ccx, &droid_big->handle, &droid_head->handle);
|
||||
|
||||
//Getting Started
|
||||
//Getting Started
|
||||
if (show_getting_started)
|
||||
draw_getting_started_popup(ctx, &show_getting_started);
|
||||
|
||||
//Color Popup
|
||||
//Color Popup
|
||||
if (output.color_popup)
|
||||
draw_color_popup(ctx, &output);
|
||||
|
||||
//File Browser as Popup
|
||||
if(main_settings.scaleWindowForFileBrowser){
|
||||
//File Browser as Popup
|
||||
if (main_settings.scaleWindowForFileBrowser)
|
||||
{
|
||||
int width = 0, height = 0;
|
||||
glfwGetWindowSize(win, &width, &height);
|
||||
glfwSetWindowSize(win, 930, 650);
|
||||
glfwSetWindowSizeLimits(win,930, 650, 930, 650 );
|
||||
glfwSetWindowSizeLimits(win, 930, 650, 930, 650);
|
||||
file_browser_run(&browser, ctx, &main_settings, &output, &debug, &hd_homerun);
|
||||
}
|
||||
|
||||
//Thread popop when file can't be read
|
||||
if(main_settings.threadPopup)
|
||||
//Thread popop when file can't be read
|
||||
if (main_settings.threadPopup)
|
||||
draw_thread_popup(ctx, &main_settings.threadPopup);
|
||||
|
||||
//Thread popup for hd_homerun thread
|
||||
if(hd_homerun.threadPopup)
|
||||
//Thread popup for hd_homerun thread
|
||||
if (hd_homerun.threadPopup)
|
||||
draw_thread_popup(ctx, &hd_homerun.threadPopup);
|
||||
|
||||
nk_layout_row_end(ctx);
|
||||
@@ -397,27 +371,38 @@ int main(void)
|
||||
nk_layout_space_begin(ctx, NK_STATIC, 15, 1);
|
||||
nk_layout_space_end(ctx);
|
||||
|
||||
|
||||
|
||||
/*TABS TRIGGERED IN ADVANCED MODE FLAG*/
|
||||
if (advanced_mode_check)
|
||||
{
|
||||
static int current_tab = 0;
|
||||
enum tab_name { MAIN, INPUT, ADV_INPUT, OUTPUT, DECODERS, CREDITS, DEBUG, HDHOMERUN, BURNEDSUBS };
|
||||
const char *names[] = { "Main", "Input", "Advanced Input", "Output", "Decoders", "Credits", "Debug", "HDHomeRun", "BurnedSubs" };
|
||||
enum tab_name
|
||||
{
|
||||
MAIN,
|
||||
INPUT,
|
||||
ADV_INPUT,
|
||||
OUTPUT,
|
||||
DECODERS,
|
||||
CREDITS,
|
||||
DEBUG,
|
||||
HDHOMERUN,
|
||||
BURNEDSUBS
|
||||
};
|
||||
const char *names[] = {"Main", "Input", "Advanced Input", "Output", "Decoders", "Credits", "Debug", "HDHomeRun", "BurnedSubs"};
|
||||
float id = 0;
|
||||
int i;
|
||||
|
||||
nk_style_push_vec2(ctx, &ctx->style.window.spacing, nk_vec2(0, 0));
|
||||
nk_style_push_float(ctx, &ctx->style.button.rounding, 0);
|
||||
nk_layout_row_begin(ctx, NK_STATIC, 20, 9);
|
||||
for (i = 0; i < 9; ++i) {
|
||||
for (i = 0; i < 9; ++i)
|
||||
{
|
||||
/*Make sure button perfectly fits text*/
|
||||
const struct nk_user_font *f = ctx->style.font;
|
||||
float text_width = f->width(f->userdata, f->height, names[i], nk_strlen(names[i]));
|
||||
float widget_width = text_width + 3 * ctx->style.button.padding.x;
|
||||
nk_layout_row_push(ctx, widget_width);
|
||||
if (current_tab == i) {
|
||||
if (current_tab == i)
|
||||
{
|
||||
/*Active tab gets highlighted*/
|
||||
struct nk_style_item button_color = ctx->style.button.normal;
|
||||
ctx->style.button.normal = ctx->style.button.active;
|
||||
@@ -434,61 +419,64 @@ int main(void)
|
||||
if (nk_group_begin(ctx, "Advanced Tabs", NK_WINDOW_NO_SCROLLBAR))
|
||||
{
|
||||
nk_style_pop_vec2(ctx);
|
||||
switch (current_tab) {
|
||||
case MAIN:
|
||||
tab_screen_height = 0;
|
||||
break;
|
||||
switch (current_tab)
|
||||
{
|
||||
case MAIN:
|
||||
tab_screen_height = 0;
|
||||
break;
|
||||
|
||||
case INPUT:
|
||||
draw_input_tab(ctx, &tab_screen_height, &input, &decoders);
|
||||
break;
|
||||
case INPUT:
|
||||
draw_input_tab(ctx, &tab_screen_height, &input, &decoders);
|
||||
break;
|
||||
|
||||
case ADV_INPUT:
|
||||
draw_advanced_input_tab(ctx, &tab_screen_height, &advanced_input);
|
||||
break;
|
||||
case ADV_INPUT:
|
||||
draw_advanced_input_tab(ctx, &tab_screen_height, &advanced_input);
|
||||
break;
|
||||
|
||||
case OUTPUT:
|
||||
draw_output_tab(ctx, &tab_screen_height, &output, &main_settings);
|
||||
break;
|
||||
case OUTPUT:
|
||||
draw_output_tab(ctx, &tab_screen_height, &output, &main_settings);
|
||||
break;
|
||||
|
||||
case DECODERS:
|
||||
draw_decoders_tab(ctx, &tab_screen_height, &decoders);
|
||||
break;
|
||||
case DECODERS:
|
||||
draw_decoders_tab(ctx, &tab_screen_height, &decoders);
|
||||
break;
|
||||
|
||||
case CREDITS:
|
||||
draw_credits_tab(ctx, &tab_screen_height, &credits);
|
||||
break;
|
||||
case CREDITS:
|
||||
draw_credits_tab(ctx, &tab_screen_height, &credits);
|
||||
break;
|
||||
|
||||
case DEBUG:
|
||||
draw_debug_tab(ctx, &tab_screen_height, &main_settings, &output, &debug);
|
||||
break;
|
||||
case DEBUG:
|
||||
draw_debug_tab(ctx, &tab_screen_height, &main_settings, &output, &debug);
|
||||
break;
|
||||
|
||||
case HDHOMERUN:
|
||||
draw_hd_homerun_tab(ctx, &tab_screen_height, &hd_homerun, &main_settings);
|
||||
break;
|
||||
case HDHOMERUN:
|
||||
draw_hd_homerun_tab(ctx, &tab_screen_height, &hd_homerun, &main_settings);
|
||||
break;
|
||||
|
||||
case BURNEDSUBS:
|
||||
draw_burned_subs_tab(ctx, &tab_screen_height, &burned_subs);
|
||||
break;
|
||||
case BURNEDSUBS:
|
||||
draw_burned_subs_tab(ctx, &tab_screen_height, &burned_subs);
|
||||
break;
|
||||
}
|
||||
nk_group_end(ctx);
|
||||
}
|
||||
else nk_style_pop_vec2(ctx);
|
||||
else
|
||||
nk_style_pop_vec2(ctx);
|
||||
}
|
||||
|
||||
//ADVANCED MODE FLAG
|
||||
static const float ratio_adv_mode[] = { 0.75f, 0.22f, .03f };
|
||||
static const float ratio_adv_mode[] = {0.75f, 0.22f, .03f};
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 20, 3, ratio_adv_mode);
|
||||
nk_spacing(ctx, 1);
|
||||
nk_checkbox_label(ctx, "Advanced Mode", &advanced_mode_check);
|
||||
|
||||
//RADIO BUTTON 1
|
||||
static const float ratio_button[] = { .10f, .90f };
|
||||
static const float check_extension_ratio[] = { .10f, .53f, .12f, .15f, .10f };
|
||||
//RADIO BUTTON 1
|
||||
static const float ratio_button[] = {.10f, .90f};
|
||||
static const float check_extension_ratio[] = {.10f, .53f, .12f, .15f, .10f};
|
||||
//static int op = FILES;
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 20, 2, ratio_button);
|
||||
nk_spacing(ctx, 1);
|
||||
if (nk_option_label(ctx, "Extract from files below:", main_settings.port_or_files == FILES)) {
|
||||
if (nk_option_label(ctx, "Extract from files below:", main_settings.port_or_files == FILES))
|
||||
{
|
||||
//op = FILES;
|
||||
main_settings.port_or_files = FILES;
|
||||
}
|
||||
@@ -500,7 +488,7 @@ int main(void)
|
||||
nk_checkbox_label(ctx, "Check for common video file extensions", &file_extension_check);
|
||||
if (main_settings.filename_count > 0)
|
||||
{
|
||||
if(nk_button_label(ctx, "Add"))
|
||||
if (nk_button_label(ctx, "Add"))
|
||||
{
|
||||
main_settings.is_file_browser_active = nk_true;
|
||||
main_settings.scaleWindowForFileBrowser = nk_true;
|
||||
@@ -508,7 +496,8 @@ int main(void)
|
||||
|
||||
for (int i = 0; i < main_settings.filename_count; i++)
|
||||
{
|
||||
if (main_settings.is_file_selected[i]) {
|
||||
if (main_settings.is_file_selected[i])
|
||||
{
|
||||
add_remove_button = nk_true;
|
||||
break;
|
||||
}
|
||||
@@ -518,32 +507,29 @@ int main(void)
|
||||
if (add_remove_button)
|
||||
{
|
||||
|
||||
if (nk_button_label(ctx, "Remove")) {
|
||||
for (int i = main_settings.filename_count-1; i != -1; i--)
|
||||
if (main_settings.is_file_selected[i]) {
|
||||
remove_path_entry(&main_settings, i );
|
||||
if (nk_button_label(ctx, "Remove"))
|
||||
{
|
||||
for (int i = main_settings.filename_count - 1; i != -1; i--)
|
||||
if (main_settings.is_file_selected[i])
|
||||
{
|
||||
remove_path_entry(&main_settings, i);
|
||||
main_settings.is_file_selected[i] = nk_false;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
else
|
||||
if (nk_button_label(ctx, "Clear"))
|
||||
{
|
||||
free(main_settings.filenames);
|
||||
main_settings.filename_count = 0;
|
||||
}
|
||||
else if (nk_button_label(ctx, "Clear"))
|
||||
{
|
||||
free(main_settings.filenames);
|
||||
main_settings.filename_count = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//RECTANGLE-FILES
|
||||
static const float ratio_rect_files[] = { 0.10f,0.80f };
|
||||
static const float ratio_rect_files[] = {0.10f, 0.80f};
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 180, 2, ratio_rect_files);
|
||||
nk_spacing(ctx, 1);
|
||||
if (nk_group_begin(ctx, "Files in extraction queue:", NK_WINDOW_BORDER | NK_WINDOW_TITLE ))
|
||||
if (nk_group_begin(ctx, "Files in extraction queue:", NK_WINDOW_BORDER | NK_WINDOW_TITLE))
|
||||
{
|
||||
if (main_settings.filename_count != 0)
|
||||
{
|
||||
@@ -553,7 +539,8 @@ int main(void)
|
||||
nk_selectable_label(ctx, truncate_path_string(main_settings.filenames[i]), NK_TEXT_LEFT, &main_settings.is_file_selected[i]);
|
||||
}
|
||||
|
||||
else {
|
||||
else
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 1, 1);
|
||||
nk_spacing(ctx, 1);
|
||||
nk_layout_row_dynamic(ctx, 25, 1);
|
||||
@@ -568,21 +555,20 @@ int main(void)
|
||||
main_settings.scaleWindowForFileBrowser = nk_true;
|
||||
}
|
||||
nk_spacing(ctx, 1);
|
||||
|
||||
}
|
||||
nk_group_end(ctx);
|
||||
|
||||
}
|
||||
|
||||
//RadioButton 2 along with combobox
|
||||
static const float ratio_port[] = { 0.10f,0.20f,0.20f,0.20f,0.20f,0.10f };
|
||||
//RadioButton 2 along with combobox
|
||||
static const float ratio_port[] = {0.10f, 0.20f, 0.20f, 0.20f, 0.20f, 0.10f};
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 20, 6, ratio_port);
|
||||
nk_spacing(ctx, 1);
|
||||
if (nk_option_label(ctx, "Extract from", main_settings.port_or_files == PORT)) {
|
||||
if (nk_option_label(ctx, "Extract from", main_settings.port_or_files == PORT))
|
||||
{
|
||||
//op = PORT;
|
||||
main_settings.port_or_files = PORT;
|
||||
}
|
||||
main_settings.port_select = nk_combo(ctx, main_settings.port_type, 2, main_settings.port_select, 20, nk_vec2(85,100));
|
||||
main_settings.port_select = nk_combo(ctx, main_settings.port_type, 2, main_settings.port_select, 20, nk_vec2(85, 100));
|
||||
nk_label(ctx, " stream, on port:", NK_TEXT_LEFT);
|
||||
|
||||
//RADDIO BUTTON 2, TEXTEDIT FOR ENTERING PORT NUMBER
|
||||
@@ -593,12 +579,12 @@ int main(void)
|
||||
nk_layout_space_begin(ctx, NK_STATIC, 10, 1);
|
||||
nk_layout_space_end(ctx);
|
||||
|
||||
//Extraction Info`rmation
|
||||
//Extraction Information
|
||||
nk_layout_row_dynamic(ctx, 10, 1);
|
||||
nk_text(ctx, "Extraction Info:", 16, NK_TEXT_CENTERED);
|
||||
|
||||
//RECTANGLE-INFO
|
||||
static const float ratio_rect_info[] = { 0.10f,0.80f,0.10f };
|
||||
static const float ratio_rect_info[] = {0.10f, 0.80f, 0.10f};
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 75, 2, ratio_rect_info);
|
||||
nk_spacing(ctx, 1);
|
||||
if (nk_group_begin(ctx, "Extraction Info:", NK_WINDOW_BORDER))
|
||||
@@ -606,50 +592,42 @@ int main(void)
|
||||
if (main_settings.filename_count != 0)
|
||||
{
|
||||
nk_layout_row_static(ctx, 18, 380, 1);
|
||||
nk_label(ctx, concat("Input type: ", input.type[input.type_select]), NK_TEXT_LEFT);
|
||||
nk_label(ctx, concat("Output type: ", output.type[output.type_select]), NK_TEXT_LEFT);
|
||||
if(output.is_filename)
|
||||
nk_label(ctx, concat("Output path: ", output.filename), NK_TEXT_LEFT);
|
||||
else
|
||||
nk_label(ctx, "Output path: Default", NK_TEXT_LEFT);
|
||||
if(burned_subs.is_burned_subs)
|
||||
nk_label(ctx, "Hardsubtitles extraction: Yes", NK_TEXT_LEFT);
|
||||
else
|
||||
nk_label(ctx, "Hardsubtitles extraction: No", NK_TEXT_LEFT);
|
||||
|
||||
|
||||
nk_label(ctx, concat("Input type: ", input.type[input.type_select]), NK_TEXT_LEFT);
|
||||
nk_label(ctx, concat("Output type: ", output.type[output.type_select]), NK_TEXT_LEFT);
|
||||
if (output.is_filename)
|
||||
nk_label(ctx, concat("Output path: ", output.filename), NK_TEXT_LEFT);
|
||||
else
|
||||
nk_label(ctx, "Output path: Default", NK_TEXT_LEFT);
|
||||
if (burned_subs.is_burned_subs)
|
||||
nk_label(ctx, "Hardsubtitles extraction: Yes", NK_TEXT_LEFT);
|
||||
else
|
||||
nk_label(ctx, "Hardsubtitles extraction: No", NK_TEXT_LEFT);
|
||||
}
|
||||
nk_group_end(ctx);
|
||||
|
||||
}
|
||||
|
||||
|
||||
nk_layout_space_begin(ctx, NK_STATIC, 10, 1);
|
||||
nk_layout_space_end(ctx);
|
||||
//PROGRESSBAR
|
||||
static const float ratio_progress[] = { 0.10f,0.03f,0.57f,0.03f,0.17f,0.10f };
|
||||
static const float ratio_progress[] = {0.10f, 0.03f, 0.57f, 0.03f, 0.17f, 0.10f};
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 20, 6, ratio_progress);
|
||||
nk_spacing(ctx, 1);
|
||||
nk_spacing(ctx, 1);
|
||||
nk_progress(ctx, &main_settings.progress_cursor, 101, nk_false);
|
||||
|
||||
|
||||
|
||||
//Extract Button
|
||||
nk_spacing(ctx, 1);
|
||||
if (nk_button_label(ctx, "Extract"))
|
||||
{
|
||||
|
||||
setup_and_create_thread(&main_settings, &command);
|
||||
|
||||
}
|
||||
|
||||
|
||||
nk_layout_space_begin(ctx, NK_STATIC, 10, 1);
|
||||
nk_layout_space_end(ctx);
|
||||
|
||||
//PROGRESS_DETAILS_BUTTON
|
||||
if(!show_activity_check)
|
||||
if (!show_activity_check)
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 20, 3);
|
||||
nk_spacing(ctx, 1);
|
||||
@@ -666,14 +644,11 @@ int main(void)
|
||||
|
||||
//build command string
|
||||
command_builder(&command, &main_settings, &network_settings, &input, &advanced_input, &output, &decoders, &credits, &debug, &burned_subs);
|
||||
|
||||
|
||||
|
||||
}
|
||||
nk_end(ctx);
|
||||
|
||||
glfwGetWindowSize(win, &screenWidth, &screenHeight);
|
||||
|
||||
|
||||
if (!main_settings.scaleWindowForFileBrowser)
|
||||
{
|
||||
if (show_activity_check && show_preview_check && show_terminal_check)
|
||||
@@ -748,7 +723,7 @@ int main(void)
|
||||
{
|
||||
glfwSetWindowSize(win, WIDTH_mainPanelAndWindow, HEIGHT_mainPanelandWindow);
|
||||
glfwSetWindowSizeLimits(win, WIDTH_mainPanelAndWindow, HEIGHT_mainPanelandWindow,
|
||||
WIDTH_mainPanelAndWindow, HEIGHT_mainPanelandWindow);
|
||||
WIDTH_mainPanelAndWindow, HEIGHT_mainPanelandWindow);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -757,7 +732,6 @@ int main(void)
|
||||
glfwSetWindowSizeLimits(win, 930, 650, 930, 650);
|
||||
}
|
||||
|
||||
|
||||
glViewport(0, 0, screenWidth, screenHeight);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
/* IMPORTANT: `nk_glfw_render` modifies some global OpenGL state
|
||||
@@ -768,19 +742,19 @@ int main(void)
|
||||
glfwSwapBuffers(win);
|
||||
}
|
||||
|
||||
glDeleteTextures(1,(const GLuint*)&media.icons.home.handle.id);
|
||||
glDeleteTextures(1,(const GLuint*)&media.icons.directory.handle.id);
|
||||
glDeleteTextures(1,(const GLuint*)&media.icons.computer.handle.id);
|
||||
glDeleteTextures(1, (const GLuint *)&media.icons.home.handle.id);
|
||||
glDeleteTextures(1, (const GLuint *)&media.icons.directory.handle.id);
|
||||
glDeleteTextures(1, (const GLuint *)&media.icons.computer.handle.id);
|
||||
#ifdef _WIN32
|
||||
glDeleteTextures(1, (const GLuint*)&media.icons.drives.handle.id);
|
||||
glDeleteTextures(1, (const GLuint *)&media.icons.drives.handle.id);
|
||||
#endif
|
||||
glDeleteTextures(1,(const GLuint*)&media.icons.desktop.handle.id);
|
||||
glDeleteTextures(1,(const GLuint*)&media.icons.default_file.handle.id);
|
||||
glDeleteTextures(1,(const GLuint*)&media.icons.text_file.handle.id);
|
||||
glDeleteTextures(1,(const GLuint*)&media.icons.music_file.handle.id);
|
||||
glDeleteTextures(1,(const GLuint*)&media.icons.font_file.handle.id);
|
||||
glDeleteTextures(1,(const GLuint*)&media.icons.img_file.handle.id);
|
||||
glDeleteTextures(1,(const GLuint*)&media.icons.movie_file.handle.id);
|
||||
glDeleteTextures(1, (const GLuint *)&media.icons.desktop.handle.id);
|
||||
glDeleteTextures(1, (const GLuint *)&media.icons.default_file.handle.id);
|
||||
glDeleteTextures(1, (const GLuint *)&media.icons.text_file.handle.id);
|
||||
glDeleteTextures(1, (const GLuint *)&media.icons.music_file.handle.id);
|
||||
glDeleteTextures(1, (const GLuint *)&media.icons.font_file.handle.id);
|
||||
glDeleteTextures(1, (const GLuint *)&media.icons.img_file.handle.id);
|
||||
glDeleteTextures(1, (const GLuint *)&media.icons.movie_file.handle.id);
|
||||
|
||||
file_browser_free(&browser);
|
||||
//free(main_settings.filenames);
|
||||
@@ -790,14 +764,13 @@ int main(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void setup_main_settings(struct main_tab *main_settings)
|
||||
{
|
||||
|
||||
|
||||
main_settings->is_check_common_extension = nk_false;
|
||||
main_settings->port_num_len = 0;
|
||||
main_settings->port_or_files = FILES;
|
||||
main_settings->port_type = (char**)malloc(2 * sizeof(char*));
|
||||
main_settings->port_type = (char **)malloc(2 * sizeof(char *));
|
||||
main_settings->port_type[0] = "UDP";
|
||||
main_settings->port_type[1] = "TCP";
|
||||
main_settings->port_select = 0;
|
||||
@@ -808,10 +781,10 @@ void setup_main_settings(struct main_tab *main_settings)
|
||||
main_settings->threadPopup = nk_false;
|
||||
}
|
||||
|
||||
char* truncate_path_string(char *filePath)
|
||||
char *truncate_path_string(char *filePath)
|
||||
{
|
||||
char* file_path = strdup(filePath);
|
||||
int i,j,z,slash_length, fileNameTruncated_index,copycount, prefix_length;
|
||||
char *file_path = strdup(filePath);
|
||||
int i, j, z, slash_length, fileNameTruncated_index, copycount, prefix_length;
|
||||
char file_name[PATH_LENGTH], *ptr_slash, fileNameTruncated[NAME_LENGTH];
|
||||
//strcpy(filePath[i], paths[i]);
|
||||
if (strlen(filePath) >= PATH_LENGTH - 1)
|
||||
@@ -838,7 +811,7 @@ char* truncate_path_string(char *filePath)
|
||||
}
|
||||
strncpy(fileNameTruncated, ptr_slash, 47);
|
||||
|
||||
strncpy(file_name, file_path , 7);
|
||||
strncpy(file_name, file_path, 7);
|
||||
file_name[7] = '.';
|
||||
file_name[8] = '.';
|
||||
file_name[9] = '.';
|
||||
@@ -849,7 +822,8 @@ char* truncate_path_string(char *filePath)
|
||||
strcpy(file_path, file_name);
|
||||
}
|
||||
|
||||
else {
|
||||
else
|
||||
{
|
||||
copycount = PATH_LENGTH - 1;
|
||||
prefix_length = copycount - slash_length - 3;
|
||||
strncpy(file_name, file_path, prefix_length);
|
||||
@@ -867,7 +841,7 @@ char* truncate_path_string(char *filePath)
|
||||
}
|
||||
return file_path;
|
||||
}
|
||||
else
|
||||
else
|
||||
return filePath;
|
||||
}
|
||||
|
||||
@@ -878,52 +852,51 @@ void remove_path_entry(struct main_tab *main_settings, int indexToRemove)
|
||||
// printf("%d ", (*array)[i]);
|
||||
//printf("\n");
|
||||
|
||||
char** temp = (char**)calloc(main_settings->filename_count, sizeof(char *)); // allocate an array with a size 1 less than the current one
|
||||
char **temp = (char **)calloc(main_settings->filename_count, sizeof(char *)); // allocate an array with a size 1 less than the current one
|
||||
|
||||
memmove(
|
||||
temp,
|
||||
main_settings->filenames,
|
||||
(indexToRemove + 1) * sizeof(char *)); // copy everything BEFORE the index
|
||||
memmove(
|
||||
temp,
|
||||
main_settings->filenames,
|
||||
(indexToRemove + 1) * sizeof(char *)); // copy everything BEFORE the index
|
||||
|
||||
memmove(
|
||||
temp + indexToRemove,
|
||||
(main_settings->filenames) + (indexToRemove + 1),
|
||||
(main_settings->filename_count - indexToRemove) * sizeof(char *)); // copy everything AFTER the index
|
||||
|
||||
free(main_settings->filenames);
|
||||
main_settings->filenames = temp;
|
||||
main_settings->filename_count--;
|
||||
main_settings->filenames[main_settings->filename_count] = NULL;
|
||||
|
||||
memmove(
|
||||
temp + indexToRemove,
|
||||
(main_settings->filenames) + (indexToRemove + 1),
|
||||
(main_settings->filename_count - indexToRemove) * sizeof(char *)); // copy everything AFTER the index
|
||||
|
||||
free(main_settings->filenames);
|
||||
main_settings->filenames = temp;
|
||||
main_settings->filename_count--;
|
||||
main_settings->filenames[main_settings->filename_count] = NULL;
|
||||
}
|
||||
|
||||
struct nk_image
|
||||
icon_load(const char *filename)
|
||||
icon_load(char icon_data[], int len)
|
||||
{
|
||||
int x,y,n;
|
||||
GLuint tex;
|
||||
unsigned char *data = stbi_load(filename, &x, &y, &n, 0);
|
||||
if (!data) die("[SDL]: failed to load image: %s", filename);
|
||||
int x, y, n;
|
||||
GLuint tex;
|
||||
|
||||
glGenTextures(1, &tex);
|
||||
glBindTexture(GL_TEXTURE_2D, tex);
|
||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
|
||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_NEAREST);
|
||||
unsigned char *data = stbi_load_from_memory(icon_data, len, &x, &y, &n, 0);
|
||||
if (!data)
|
||||
die("[SDL]: failed to load icons");
|
||||
|
||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, x, y, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
|
||||
glGenerateMipmap(GL_TEXTURE_2D);
|
||||
stbi_image_free(data);
|
||||
return nk_image_id((int)tex);
|
||||
glGenTextures(1, &tex);
|
||||
glBindTexture(GL_TEXTURE_2D, tex);
|
||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
|
||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_NEAREST);
|
||||
|
||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, x, y, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
|
||||
glGenerateMipmap(GL_TEXTURE_2D);
|
||||
stbi_image_free(data);
|
||||
return nk_image_id((int)tex);
|
||||
}
|
||||
|
||||
|
||||
char* concat(char* string1, char *string2)
|
||||
char *concat(char *string1, char *string2)
|
||||
{
|
||||
static char prefix[300], suffix[300];
|
||||
strcpy(prefix, string1);
|
||||
strcpy(suffix, string2);
|
||||
return strcat(prefix, suffix);
|
||||
}
|
||||
static char prefix[300], suffix[300];
|
||||
strcpy(prefix, string1);
|
||||
strcpy(suffix, string2);
|
||||
return strcat(prefix, suffix);
|
||||
}
|
||||
|
||||
@@ -7,9 +7,9 @@
|
||||
#define MAX_WAIT 10
|
||||
#define PROGRESS_COMPLETE 100
|
||||
|
||||
void* extract_thread(void* extract_args)
|
||||
void *extract_thread(void *extract_args)
|
||||
{
|
||||
struct args_extract *params = (struct args_extract*)extract_args;
|
||||
struct args_extract *params = (struct args_extract *)extract_args;
|
||||
static char term_string[500];
|
||||
strcpy(term_string, params->command_string);
|
||||
strcat(term_string, " ");
|
||||
@@ -20,7 +20,7 @@ void* extract_thread(void* extract_args)
|
||||
pthread_exit(0);
|
||||
}
|
||||
|
||||
void* read_activity_data(void *read_args)
|
||||
void *read_activity_data(void *read_args)
|
||||
{
|
||||
puts("Inside activity thread!");
|
||||
char line[500];
|
||||
@@ -31,13 +31,13 @@ void* read_activity_data(void *read_args)
|
||||
time.tv_nsec = 10000000L;
|
||||
#endif
|
||||
int wait = 0;
|
||||
struct args_extract *read_params = (struct args_extract*)read_args;
|
||||
struct args_extract *read_params = (struct args_extract *)read_args;
|
||||
FILE *file;
|
||||
char current_input[500];
|
||||
int concat_index = 0;
|
||||
file = fopen("ccx.log", "r");
|
||||
|
||||
while(file == NULL)
|
||||
while (file == NULL)
|
||||
{
|
||||
printf("Cannot open ccx.log, trying again.\n");
|
||||
file = fopen("ccx.log", "r");
|
||||
@@ -47,20 +47,23 @@ void* read_activity_data(void *read_args)
|
||||
_sleep(10);
|
||||
#endif
|
||||
wait++;
|
||||
if(wait == MAX_WAIT)
|
||||
if (wait == MAX_WAIT)
|
||||
{
|
||||
read_params->main_threadsettings->threadPopup = nk_true;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
while(!feof(file))
|
||||
while (!feof(file))
|
||||
{
|
||||
if (fgets(current_input, sizeof(current_input), file) == NULL)
|
||||
continue;
|
||||
if (concat_index == 0) {
|
||||
if (concat_index == 0)
|
||||
{
|
||||
strcpy(line, current_input);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
strcat(line, current_input);
|
||||
}
|
||||
concat_index++;
|
||||
@@ -68,26 +71,24 @@ void* read_activity_data(void *read_args)
|
||||
continue;
|
||||
|
||||
sscanf(line, "%[^\n]", buffer);
|
||||
if(read_params->main_threadsettings->activity_string_count == 0)
|
||||
if (read_params->main_threadsettings->activity_string_count == 0)
|
||||
read_params->main_threadsettings->activity_string =
|
||||
malloc(sizeof(*read_params->main_threadsettings->activity_string));
|
||||
malloc(sizeof(*read_params->main_threadsettings->activity_string));
|
||||
else
|
||||
read_params->main_threadsettings->activity_string =
|
||||
realloc(read_params->main_threadsettings->activity_string,
|
||||
(read_params->main_threadsettings->activity_string_count + 1)*sizeof(char*));
|
||||
realloc(read_params->main_threadsettings->activity_string,
|
||||
(read_params->main_threadsettings->activity_string_count + 1) * sizeof(char *));
|
||||
|
||||
read_params->main_threadsettings->activity_string[read_params->main_threadsettings->activity_string_count] = strdup(buffer);
|
||||
read_params->main_threadsettings->activity_string_count++;
|
||||
|
||||
|
||||
|
||||
memset(line, 0, sizeof(line));
|
||||
memset(buffer, 0, sizeof(buffer));
|
||||
concat_index = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void* read_data_from_thread(void* read_args)
|
||||
void *read_data_from_thread(void *read_args)
|
||||
{
|
||||
pthread_t tid_activity;
|
||||
pthread_attr_t attr_activity;
|
||||
@@ -99,10 +100,9 @@ void* read_data_from_thread(void* read_args)
|
||||
time.tv_nsec = 10000000L;
|
||||
#endif
|
||||
|
||||
|
||||
int wait = 0;
|
||||
struct args_extract *read_params = (struct args_extract*)read_args;
|
||||
int unknown1 = 0, unknown2 = 0,progress_count = 0;
|
||||
struct args_extract *read_params = (struct args_extract *)read_args;
|
||||
int unknown1 = 0, unknown2 = 0, progress_count = 0;
|
||||
FILE *file;
|
||||
char prev_line[500];
|
||||
char line[500];
|
||||
@@ -115,12 +115,13 @@ void* read_data_from_thread(void* read_args)
|
||||
/*Setup activity thread*/
|
||||
pthread_attr_init(&attr_activity);
|
||||
int err = pthread_create(&tid_activity, &attr_activity, read_activity_data, read_params);
|
||||
if(!err)
|
||||
if (!err)
|
||||
puts("Activity Thread created");
|
||||
|
||||
file = fopen("gui_report.log", "r");
|
||||
|
||||
while (file == NULL) {
|
||||
while (file == NULL)
|
||||
{
|
||||
printf("Cannot open gui_report.log, trying again.\n");
|
||||
file = fopen("gui_report.log", "r");
|
||||
#if UNIX
|
||||
@@ -129,20 +130,23 @@ void* read_data_from_thread(void* read_args)
|
||||
_sleep(10);
|
||||
#endif
|
||||
wait++;
|
||||
if (wait >= MAX_WAIT) {
|
||||
if (wait >= MAX_WAIT)
|
||||
{
|
||||
read_params->main_threadsettings->threadPopup = nk_true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
while(1)
|
||||
while (1)
|
||||
{
|
||||
if (fgets(current_input, sizeof(current_input), file) == NULL)
|
||||
continue;
|
||||
if (concat_index == 0) {
|
||||
if (concat_index == 0)
|
||||
{
|
||||
strcpy(line, current_input);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
strcat(line, current_input);
|
||||
}
|
||||
concat_index++;
|
||||
@@ -150,41 +154,41 @@ void* read_data_from_thread(void* read_args)
|
||||
continue;
|
||||
|
||||
progress_success = sscanf(line, "###PROGRESS#%d#%d#%d", &progress_count, &unknown1, &unknown2);
|
||||
if(progress_success == 3)
|
||||
if (progress_success == 3)
|
||||
read_params->main_threadsettings->progress_cursor = progress_count;
|
||||
subs_success1 = sscanf(line, "###SUBTITLE#%[^#]#%[^#]#%[^\n]", t_start, t_end, subtitle1);
|
||||
subs_success2 = sscanf(line, "###SUBTITLE###%[^\n]", subtitle2);
|
||||
if(subs_success1 == 3)
|
||||
if (subs_success1 == 3)
|
||||
{
|
||||
sprintf(buffer, "%s-%s: %s", t_start, t_end, subtitle1);
|
||||
if(read_params->main_threadsettings->preview_string_count == 0)
|
||||
if (read_params->main_threadsettings->preview_string_count == 0)
|
||||
read_params->main_threadsettings->preview_string =
|
||||
malloc(sizeof(*read_params->main_threadsettings->preview_string));
|
||||
malloc(sizeof(*read_params->main_threadsettings->preview_string));
|
||||
else
|
||||
read_params->main_threadsettings->preview_string =
|
||||
realloc(read_params->main_threadsettings->preview_string,
|
||||
(read_params->main_threadsettings->preview_string_count + 1)*sizeof(char*));
|
||||
realloc(read_params->main_threadsettings->preview_string,
|
||||
(read_params->main_threadsettings->preview_string_count + 1) * sizeof(char *));
|
||||
|
||||
read_params->main_threadsettings->preview_string[read_params->main_threadsettings->preview_string_count] = strdup(buffer);
|
||||
read_params->main_threadsettings->preview_string_count++;
|
||||
}
|
||||
|
||||
if(subs_success2 == 1)
|
||||
if (subs_success2 == 1)
|
||||
{
|
||||
sprintf(buffer, " %s", subtitle2);
|
||||
if(read_params->main_threadsettings->preview_string_count == 0)
|
||||
if (read_params->main_threadsettings->preview_string_count == 0)
|
||||
read_params->main_threadsettings->preview_string =
|
||||
malloc(sizeof(*read_params->main_threadsettings->preview_string));
|
||||
malloc(sizeof(*read_params->main_threadsettings->preview_string));
|
||||
else
|
||||
read_params->main_threadsettings->preview_string =
|
||||
realloc(read_params->main_threadsettings->preview_string,
|
||||
(read_params->main_threadsettings->preview_string_count + 1)*sizeof(char*));
|
||||
realloc(read_params->main_threadsettings->preview_string,
|
||||
(read_params->main_threadsettings->preview_string_count + 1) * sizeof(char *));
|
||||
|
||||
read_params->main_threadsettings->preview_string[read_params->main_threadsettings->preview_string_count] = strdup(buffer);
|
||||
read_params->main_threadsettings->preview_string_count++;
|
||||
}
|
||||
|
||||
if(progress_count == PROGRESS_COMPLETE)
|
||||
if (progress_count == PROGRESS_COMPLETE)
|
||||
break;
|
||||
memset(line, 0, sizeof(line));
|
||||
concat_index = 0;
|
||||
@@ -193,15 +197,15 @@ void* read_data_from_thread(void* read_args)
|
||||
printf("progress count:%d\n", progress_count);
|
||||
fclose(file);
|
||||
printf("File closed\n");
|
||||
for(int i = 0; i<read_params->main_threadsettings->preview_string_count; i++)
|
||||
printf("%s\n",read_params->main_threadsettings->preview_string[i]);
|
||||
for (int i = 0; i < read_params->main_threadsettings->preview_string_count; i++)
|
||||
printf("%s\n", read_params->main_threadsettings->preview_string[i]);
|
||||
pthread_exit(0);
|
||||
}
|
||||
|
||||
void* feed_files_for_extraction(void* file_args)
|
||||
void *feed_files_for_extraction(void *file_args)
|
||||
{
|
||||
printf("Inside feeder\n");
|
||||
|
||||
|
||||
struct args_extract *extract_params = (struct args_extract *)file_args;
|
||||
printf("count:%d\n", extract_params->main_threadsettings->filename_count);
|
||||
extract_params->command_string = extract_params->threadcommand->term_string;
|
||||
@@ -209,15 +213,14 @@ void* feed_files_for_extraction(void* file_args)
|
||||
pthread_t tid_extract, tid_read;
|
||||
pthread_attr_t attr_extract, attr_read;
|
||||
|
||||
|
||||
for(int i = 0; count != 0; i++, count--)
|
||||
for (int i = 0; count != 0; i++, count--)
|
||||
{
|
||||
pthread_t tid_extract, tid_read;
|
||||
pthread_attr_t attr_extract, attr_read;
|
||||
|
||||
pthread_attr_init(&attr_extract);
|
||||
pthread_attr_init(&attr_read);
|
||||
|
||||
|
||||
extract_params->main_threadsettings->is_file_selected[i] = nk_true;
|
||||
extract_args.file_string = extract_params->main_threadsettings->filenames[i];
|
||||
int err1 = pthread_create(&tid_extract, &attr_extract, extract_thread, extract_params);
|
||||
@@ -236,16 +239,14 @@ void* feed_files_for_extraction(void* file_args)
|
||||
|
||||
remove("gui_report.log");
|
||||
remove("ccx.log");
|
||||
|
||||
}
|
||||
printf("File feeding over\n");
|
||||
}
|
||||
|
||||
|
||||
void setup_and_create_thread(struct main_tab *main_settings, struct built_string *command)
|
||||
{
|
||||
extract_args.main_threadsettings = (struct main_tab*)main_settings;
|
||||
extract_args.threadcommand = (struct built_string*)command;
|
||||
extract_args.main_threadsettings = (struct main_tab *)main_settings;
|
||||
extract_args.threadcommand = (struct built_string *)command;
|
||||
|
||||
pthread_attr_init(&attr_launch);
|
||||
int err = pthread_create(&tid_launch, &attr_launch, feed_files_for_extraction, &extract_args);
|
||||
@@ -253,12 +254,11 @@ void setup_and_create_thread(struct main_tab *main_settings, struct built_string
|
||||
printf("Feeder created!\n");
|
||||
}
|
||||
|
||||
|
||||
/*THREAD FUNCTIONS FOR HD_HOMERUN*/
|
||||
void* find_hd_homerun_devices(void *args)
|
||||
void *find_hd_homerun_devices(void *args)
|
||||
{
|
||||
char command[300];
|
||||
extract_args.homerun_thread = (struct hd_homerun_tab*)args;
|
||||
extract_args.homerun_thread = (struct hd_homerun_tab *)args;
|
||||
int wait = 0;
|
||||
FILE *file;
|
||||
char line[200];
|
||||
@@ -271,7 +271,6 @@ void* find_hd_homerun_devices(void *args)
|
||||
time.tv_nsec = 10000000L;
|
||||
#endif
|
||||
|
||||
|
||||
#if HD_HOMERUN
|
||||
strcpy(command, "hdhomerun_config");
|
||||
#else
|
||||
@@ -280,56 +279,55 @@ void* find_hd_homerun_devices(void *args)
|
||||
strcpy(command, " discover >> homerun.log");
|
||||
system(command);
|
||||
|
||||
|
||||
file = fopen("homerun.log", "r");
|
||||
|
||||
while (file == NULL) {
|
||||
printf("Cannot open file! Trying again.\n");
|
||||
file = fopen("homerun.log", "r");
|
||||
while (file == NULL)
|
||||
{
|
||||
printf("Cannot open file! Trying again.\n");
|
||||
file = fopen("homerun.log", "r");
|
||||
#if UNIX
|
||||
nanosleep(&time, NULL);
|
||||
nanosleep(&time, NULL);
|
||||
#else
|
||||
_sleep(10);
|
||||
_sleep(10);
|
||||
#endif
|
||||
wait++;
|
||||
if (wait >= MAX_WAIT) {
|
||||
extract_args.homerun_thread->threadPopup = nk_true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
wait++;
|
||||
if (wait >= MAX_WAIT)
|
||||
{
|
||||
extract_args.homerun_thread->threadPopup = nk_true;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
while(1)
|
||||
while (1)
|
||||
{
|
||||
fgets(line, sizeof(line), file);
|
||||
device_success = sscanf(line, "hdhomerun device %[^\n]", device);
|
||||
if(feof(file))
|
||||
if (feof(file))
|
||||
break;
|
||||
if(device_success == 1)
|
||||
if (device_success == 1)
|
||||
{
|
||||
if(extract_args.homerun_thread->device_num == 0)
|
||||
if (extract_args.homerun_thread->device_num == 0)
|
||||
{
|
||||
extract_args.homerun_thread->devices = malloc(sizeof(char*));
|
||||
extract_args.homerun_thread->devices = malloc(sizeof(char *));
|
||||
extract_args.homerun_thread->devices[extract_args.homerun_thread->device_num] = strdup(device);
|
||||
extract_args.homerun_thread->device_num++;
|
||||
}
|
||||
else
|
||||
{
|
||||
extract_args.homerun_thread->devices = realloc(extract_args.homerun_thread->devices,
|
||||
(extract_args.homerun_thread->device_num + 1)*sizeof(char*));
|
||||
(extract_args.homerun_thread->device_num + 1) * sizeof(char *));
|
||||
extract_args.homerun_thread->devices[extract_args.homerun_thread->device_num] = strdup(device);
|
||||
extract_args.homerun_thread->device_num++;
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("Find device thread finished\n");
|
||||
|
||||
printf("Find device thread finished\n");
|
||||
}
|
||||
|
||||
void* setup_hd_homerun_device(void *args)
|
||||
void *setup_hd_homerun_device(void *args)
|
||||
{
|
||||
char device[20];
|
||||
extract_args.homerun_thread = (struct hd_homerun_tab*)args;
|
||||
extract_args.homerun_thread = (struct hd_homerun_tab *)args;
|
||||
char channel_command[300];
|
||||
char program_command[300];
|
||||
char target_command[300];
|
||||
|
||||
@@ -10,16 +10,16 @@
|
||||
#include "command_builder.h"
|
||||
|
||||
void command_builder(struct built_string *command,
|
||||
struct main_tab *main_settings,
|
||||
struct network_popup *network_settings,struct input_tab *input,
|
||||
struct advanced_input_tab *advanced_input,
|
||||
struct output_tab *output,
|
||||
struct decoders_tab *decoders,
|
||||
struct credits_tab *credits,
|
||||
struct debug_tab *debug,
|
||||
struct burned_subs_tab *burned_subs)
|
||||
struct main_tab *main_settings,
|
||||
struct network_popup *network_settings, struct input_tab *input,
|
||||
struct advanced_input_tab *advanced_input,
|
||||
struct output_tab *output,
|
||||
struct decoders_tab *decoders,
|
||||
struct credits_tab *credits,
|
||||
struct debug_tab *debug,
|
||||
struct burned_subs_tab *burned_subs)
|
||||
{
|
||||
static char buffer[1000];
|
||||
static char buffer[1000];
|
||||
#ifdef _WIN32
|
||||
strcpy(buffer, "ccextractorwin --gui_mode_reports");
|
||||
#else
|
||||
@@ -38,70 +38,77 @@ void command_builder(struct built_string *command,
|
||||
if (input->is_split)
|
||||
strcat(buffer, " --videoedited");
|
||||
|
||||
if (input->is_process_from) {
|
||||
if (input->is_process_from)
|
||||
{
|
||||
strcat(buffer, " -startat ");
|
||||
strcat(buffer, input->from_time_buffer);
|
||||
}
|
||||
|
||||
if (input->is_process_until) {
|
||||
|
||||
if (input->is_process_until)
|
||||
{
|
||||
strcat(buffer, " -endat ");
|
||||
strcat(buffer, input->until_time_buffer);
|
||||
}
|
||||
|
||||
switch (input->elementary_stream) {
|
||||
case AUTO_DETECT:
|
||||
break;
|
||||
case STREAM_TYPE:
|
||||
strcat(buffer, " -datastreamtype ");
|
||||
strncat(buffer, input->stream_type, input->stream_type_len);
|
||||
break;
|
||||
case STREAM_PID:
|
||||
strcat(buffer, " -datapid ");
|
||||
strncat(buffer, input->stream_pid, input->stream_pid_len);
|
||||
switch (input->elementary_stream)
|
||||
{
|
||||
case AUTO_DETECT:
|
||||
break;
|
||||
case STREAM_TYPE:
|
||||
strcat(buffer, " -datastreamtype ");
|
||||
strncat(buffer, input->stream_type, input->stream_type_len);
|
||||
break;
|
||||
case STREAM_PID:
|
||||
strcat(buffer, " -datapid ");
|
||||
strncat(buffer, input->stream_pid, input->stream_pid_len);
|
||||
}
|
||||
|
||||
if (input->is_assume_mpeg) {
|
||||
if (input->is_assume_mpeg)
|
||||
{
|
||||
strcat(buffer, " -streamtype ");
|
||||
strncat(buffer, input->mpeg_type, input->mpeg_type_len);
|
||||
}
|
||||
|
||||
if(decoders->teletext_dvb == TELETEXT)
|
||||
if (decoders->teletext_dvb == TELETEXT)
|
||||
{
|
||||
switch (input->teletext_decoder) {
|
||||
case AUTO_DECODE:
|
||||
break;
|
||||
case FORCE:
|
||||
strcat(buffer, " -teletext");
|
||||
break;
|
||||
case DISABLE:
|
||||
strcat(buffer, " -noteletext");
|
||||
switch (input->teletext_decoder)
|
||||
{
|
||||
case AUTO_DECODE:
|
||||
break;
|
||||
case FORCE:
|
||||
strcat(buffer, " -teletext");
|
||||
break;
|
||||
case DISABLE:
|
||||
strcat(buffer, " -noteletext");
|
||||
}
|
||||
|
||||
if (input->is_process_teletext_page) {
|
||||
if (input->is_process_teletext_page)
|
||||
{
|
||||
strcat(buffer, " -tpage ");
|
||||
strncat(buffer, input->teletext_page_number, input->teletext_page_numer_len);
|
||||
}
|
||||
}
|
||||
|
||||
switch (input->is_limit) {
|
||||
case NO_LIMIT:
|
||||
break;
|
||||
case LIMITED:
|
||||
strcat(buffer, " --screenfuls ");
|
||||
strcat(buffer, input->screenful_limit_buffer);
|
||||
switch (input->is_limit)
|
||||
{
|
||||
case NO_LIMIT:
|
||||
break;
|
||||
case LIMITED:
|
||||
strcat(buffer, " --screenfuls ");
|
||||
strcat(buffer, input->screenful_limit_buffer);
|
||||
}
|
||||
|
||||
switch (input->clock_input) {
|
||||
case AUTO:
|
||||
break;
|
||||
case GOP:
|
||||
strcat(buffer, " --goptime");
|
||||
break;
|
||||
case PTS:
|
||||
strcat(buffer, " --nogoptime");
|
||||
break;
|
||||
switch (input->clock_input)
|
||||
{
|
||||
case AUTO:
|
||||
break;
|
||||
case GOP:
|
||||
strcat(buffer, " --goptime");
|
||||
break;
|
||||
case PTS:
|
||||
strcat(buffer, " --nogoptime");
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*Main tab and network settings*/
|
||||
@@ -109,200 +116,212 @@ void command_builder(struct built_string *command,
|
||||
{
|
||||
switch (main_settings->port_select)
|
||||
{
|
||||
case 0:
|
||||
strcat(buffer, " -udp ");
|
||||
if (!strstr(network_settings->udp_ipv4, "None")) {
|
||||
strncat(buffer, network_settings->udp_ipv4, network_settings->udp_ipv4_len);
|
||||
strcat(buffer, ":");
|
||||
}
|
||||
strncat(buffer, main_settings->port_num, main_settings->port_num_len);
|
||||
break;
|
||||
case 1:
|
||||
strcat(buffer, " -tcp ");
|
||||
strncat(buffer, main_settings->port_num, main_settings->port_num_len);
|
||||
if (!strstr(network_settings->tcp_pass, "None")) {
|
||||
strcat(buffer, " -tcppassword ");
|
||||
strncat(buffer, network_settings->tcp_pass, network_settings->tcp_pass_len);
|
||||
}
|
||||
if (!strstr(network_settings->tcp_desc, "None")) {
|
||||
strcat(buffer, " -tcpdesc ");
|
||||
strncat(buffer, network_settings->tcp_desc, network_settings->tcp_desc_len);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
case 0:
|
||||
strcat(buffer, " -udp ");
|
||||
if (!strstr(network_settings->udp_ipv4, "None"))
|
||||
{
|
||||
strncat(buffer, network_settings->udp_ipv4, network_settings->udp_ipv4_len);
|
||||
strcat(buffer, ":");
|
||||
}
|
||||
strncat(buffer, main_settings->port_num, main_settings->port_num_len);
|
||||
break;
|
||||
case 1:
|
||||
strcat(buffer, " -tcp ");
|
||||
strncat(buffer, main_settings->port_num, main_settings->port_num_len);
|
||||
if (!strstr(network_settings->tcp_pass, "None"))
|
||||
{
|
||||
strcat(buffer, " -tcppassword ");
|
||||
strncat(buffer, network_settings->tcp_pass, network_settings->tcp_pass_len);
|
||||
}
|
||||
if (!strstr(network_settings->tcp_desc, "None"))
|
||||
{
|
||||
strcat(buffer, " -tcpdesc ");
|
||||
strncat(buffer, network_settings->tcp_desc, network_settings->tcp_desc_len);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (input->is_live_stream) {
|
||||
if (input->is_live_stream)
|
||||
{
|
||||
strcat(buffer, " -s ");
|
||||
strncat(buffer, input->wait_data_sec, input->wait_data_sec_len);
|
||||
}
|
||||
|
||||
if (input->is_process_from) {
|
||||
if (input->is_process_from)
|
||||
{
|
||||
strcat(buffer, " -startat ");
|
||||
strcat(buffer, input->from_time_buffer);
|
||||
}
|
||||
|
||||
if (input->is_process_until) {
|
||||
if (input->is_process_until)
|
||||
{
|
||||
strcat(buffer, " -endat ");
|
||||
strcat(buffer, input->until_time_buffer);
|
||||
}
|
||||
|
||||
switch (input->elementary_stream) {
|
||||
case AUTO_DETECT:
|
||||
break;
|
||||
case STREAM_TYPE:
|
||||
strcat(buffer, " -datastreamtype ");
|
||||
strncat(buffer, input->stream_type, input->stream_type_len);
|
||||
break;
|
||||
case STREAM_PID:
|
||||
strcat(buffer, " -datapid ");
|
||||
strncat(buffer, input->stream_pid, input->stream_pid_len);
|
||||
switch (input->elementary_stream)
|
||||
{
|
||||
case AUTO_DETECT:
|
||||
break;
|
||||
case STREAM_TYPE:
|
||||
strcat(buffer, " -datastreamtype ");
|
||||
strncat(buffer, input->stream_type, input->stream_type_len);
|
||||
break;
|
||||
case STREAM_PID:
|
||||
strcat(buffer, " -datapid ");
|
||||
strncat(buffer, input->stream_pid, input->stream_pid_len);
|
||||
}
|
||||
|
||||
if (input->is_assume_mpeg) {
|
||||
if (input->is_assume_mpeg)
|
||||
{
|
||||
strcat(buffer, " -streamtype ");
|
||||
strncat(buffer, input->mpeg_type, input->mpeg_type_len);
|
||||
}
|
||||
|
||||
switch (input->teletext_decoder) {
|
||||
case AUTO_DECODE:
|
||||
break;
|
||||
case FORCE:
|
||||
strcat(buffer, " -teletext");
|
||||
break;
|
||||
case DISABLE:
|
||||
strcat(buffer, " -noteletext");
|
||||
switch (input->teletext_decoder)
|
||||
{
|
||||
case AUTO_DECODE:
|
||||
break;
|
||||
case FORCE:
|
||||
strcat(buffer, " -teletext");
|
||||
break;
|
||||
case DISABLE:
|
||||
strcat(buffer, " -noteletext");
|
||||
}
|
||||
|
||||
if (input->is_process_teletext_page) {
|
||||
if (input->is_process_teletext_page)
|
||||
{
|
||||
strcat(buffer, " -tpage ");
|
||||
strncat(buffer, input->teletext_page_number, input->teletext_page_numer_len);
|
||||
}
|
||||
|
||||
switch (input->is_limit) {
|
||||
case NO_LIMIT:
|
||||
break;
|
||||
case LIMITED:
|
||||
strcat(buffer, " --screenfuls ");
|
||||
strcat(buffer, input->screenful_limit_buffer);
|
||||
switch (input->is_limit)
|
||||
{
|
||||
case NO_LIMIT:
|
||||
break;
|
||||
case LIMITED:
|
||||
strcat(buffer, " --screenfuls ");
|
||||
strcat(buffer, input->screenful_limit_buffer);
|
||||
}
|
||||
|
||||
switch (input->clock_input) {
|
||||
case AUTO:
|
||||
break;
|
||||
case GOP:
|
||||
strcat(buffer, " --goptime");
|
||||
break;
|
||||
case PTS:
|
||||
strcat(buffer, " --nogoptime");
|
||||
break;
|
||||
switch (input->clock_input)
|
||||
{
|
||||
case AUTO:
|
||||
break;
|
||||
case GOP:
|
||||
strcat(buffer, " --goptime");
|
||||
break;
|
||||
case PTS:
|
||||
strcat(buffer, " --nogoptime");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*ADVANCED INPUT SETTINGS*/
|
||||
if(advanced_input->is_multiple_program)
|
||||
if (advanced_input->is_multiple_program)
|
||||
{
|
||||
switch(advanced_input->multiple_program)
|
||||
switch (advanced_input->multiple_program)
|
||||
{
|
||||
case FIRST_PROG:
|
||||
strcat(buffer, " -autoprogram");
|
||||
break;
|
||||
case PROG_NUM:
|
||||
strcat(buffer, " -pn ");
|
||||
strcat(buffer, advanced_input->prog_number);
|
||||
break;
|
||||
case FIRST_PROG:
|
||||
strcat(buffer, " -autoprogram");
|
||||
break;
|
||||
case PROG_NUM:
|
||||
strcat(buffer, " -pn ");
|
||||
strcat(buffer, advanced_input->prog_number);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch(advanced_input->set_myth)
|
||||
switch (advanced_input->set_myth)
|
||||
{
|
||||
case AUTO_MYTH:
|
||||
break;
|
||||
case FORCE_MYTH:
|
||||
strcat(buffer, " -myth");
|
||||
break;
|
||||
case DISABLE_MYTH:
|
||||
strcat(buffer, " -nomyth");
|
||||
break;
|
||||
case AUTO_MYTH:
|
||||
break;
|
||||
case FORCE_MYTH:
|
||||
strcat(buffer, " -myth");
|
||||
break;
|
||||
case DISABLE_MYTH:
|
||||
strcat(buffer, " -nomyth");
|
||||
break;
|
||||
}
|
||||
|
||||
if(advanced_input->is_mpeg_90090)
|
||||
if (advanced_input->is_mpeg_90090)
|
||||
strcat(buffer, " -90090");
|
||||
if(advanced_input->is_padding_0000)
|
||||
if (advanced_input->is_padding_0000)
|
||||
strcat(buffer, " -fp");
|
||||
if(advanced_input->is_order_ccinfo)
|
||||
if (advanced_input->is_order_ccinfo)
|
||||
strcat(buffer, " -poc");
|
||||
if(advanced_input->is_win_bug)
|
||||
if (advanced_input->is_win_bug)
|
||||
strcat(buffer, " -wtvconvertfix");
|
||||
if(advanced_input->is_hauppage_file)
|
||||
if (advanced_input->is_hauppage_file)
|
||||
strcat(buffer, " -haup");
|
||||
if(advanced_input->is_process_mp4)
|
||||
if (advanced_input->is_process_mp4)
|
||||
strcat(buffer, " -mp4vidtrack");
|
||||
if(advanced_input->is_ignore_broadcast)
|
||||
if (advanced_input->is_ignore_broadcast)
|
||||
strcat(buffer, " -noautotimeref");
|
||||
|
||||
/*DECODERS TAB*/
|
||||
if(decoders->is_field2)
|
||||
if (decoders->is_field2)
|
||||
strcat(buffer, " -12");
|
||||
|
||||
switch(decoders->channel)
|
||||
switch (decoders->channel)
|
||||
{
|
||||
case CHANNEL_1:
|
||||
break;
|
||||
case CHANNEL_2:
|
||||
strcat(buffer, " -cc2");
|
||||
break;
|
||||
case CHANNEL_1:
|
||||
break;
|
||||
case CHANNEL_2:
|
||||
strcat(buffer, " -cc2");
|
||||
break;
|
||||
}
|
||||
|
||||
if(decoders->is_708)
|
||||
if (decoders->is_708)
|
||||
{
|
||||
strcat(buffer, " -svc ");
|
||||
strncat(buffer, decoders->services, decoders->services_len);
|
||||
}
|
||||
|
||||
switch(decoders->teletext_dvb)
|
||||
switch (decoders->teletext_dvb)
|
||||
{
|
||||
case TELETEXT:
|
||||
if(strcmp(decoders->min_distance, "2"))
|
||||
{
|
||||
strcat(buffer, " -levdistmincnt ");
|
||||
strncat(buffer, decoders->min_distance, decoders->min_distance_len);
|
||||
}
|
||||
if(strcmp(decoders->max_distance, "10"))
|
||||
{
|
||||
strcat(buffer, " -levdistmaxpct ");
|
||||
strncat(buffer, decoders->max_distance, decoders->max_distance_len);
|
||||
}
|
||||
break;
|
||||
case TELETEXT:
|
||||
if (strcmp(decoders->min_distance, "2"))
|
||||
{
|
||||
strcat(buffer, " -levdistmincnt ");
|
||||
strncat(buffer, decoders->min_distance, decoders->min_distance_len);
|
||||
}
|
||||
if (strcmp(decoders->max_distance, "10"))
|
||||
{
|
||||
strcat(buffer, " -levdistmaxpct ");
|
||||
strncat(buffer, decoders->max_distance, decoders->max_distance_len);
|
||||
}
|
||||
break;
|
||||
|
||||
case DVB:
|
||||
strcat(buffer, " -codec dvdsub");
|
||||
break;
|
||||
case DVB:
|
||||
strcat(buffer, " -codec dvdsub");
|
||||
break;
|
||||
}
|
||||
|
||||
/*CREDITS TAB*/
|
||||
if(credits->is_start_text)
|
||||
if (credits->is_start_text)
|
||||
{
|
||||
strcat(buffer, " --startcreditstext \"");
|
||||
strncat(buffer, credits->start_text, credits->start_text_len);
|
||||
strcat(buffer,"\" --startcreditsforatleast ");
|
||||
strcat(buffer, "\" --startcreditsforatleast ");
|
||||
strncat(buffer, credits->start_atleast_sec, credits->start_atleast_sec_len);
|
||||
strcat(buffer, " --startcreditsforatmost ");
|
||||
strncat(buffer, credits->start_atmost_sec, credits->start_atmost_sec_len);
|
||||
if(credits->is_before)
|
||||
if (credits->is_before)
|
||||
{
|
||||
strcat(buffer, " --startcreditsnotbefore ");
|
||||
strcat(buffer, credits->before_time_buffer);
|
||||
}
|
||||
if(credits->is_after)
|
||||
if (credits->is_after)
|
||||
{
|
||||
strcat(buffer, " --startcreditsnotafter ");
|
||||
strcat(buffer, credits->after_time_buffer);
|
||||
}
|
||||
}
|
||||
|
||||
if(credits->is_end_text)
|
||||
if (credits->is_end_text)
|
||||
{
|
||||
strcat(buffer, " --endcreditstext \"");
|
||||
strncat(buffer, credits->end_text, credits->end_text_len);
|
||||
@@ -313,91 +332,94 @@ void command_builder(struct built_string *command,
|
||||
}
|
||||
|
||||
/*DEBUG TAB*/
|
||||
if(debug->is_elementary_stream)
|
||||
if (debug->is_elementary_stream)
|
||||
{
|
||||
strcat(buffer, " -cf ");
|
||||
strncat(buffer, debug->elementary_stream, debug->elementary_stream_len);
|
||||
}
|
||||
if(debug->is_dump_packets)
|
||||
if (debug->is_dump_packets)
|
||||
strcat(buffer, " -debug");
|
||||
if(debug->is_debug_608)
|
||||
if (debug->is_debug_608)
|
||||
strcat(buffer, " -608");
|
||||
if(debug->is_debug_708)
|
||||
if (debug->is_debug_708)
|
||||
strcat(buffer, " -708");
|
||||
if(debug->is_stamp_output)
|
||||
if (debug->is_stamp_output)
|
||||
strcat(buffer, " -goppts");
|
||||
if(debug->is_debug_analysed_vid)
|
||||
if (debug->is_debug_analysed_vid)
|
||||
strcat(buffer, " -vides");
|
||||
if(debug->is_raw_608_708)
|
||||
if (debug->is_raw_608_708)
|
||||
strcat(buffer, " -cbraw");
|
||||
if(debug->is_debug_parsed)
|
||||
if (debug->is_debug_parsed)
|
||||
strcat(buffer, " -parsedebug");
|
||||
if(!strcmp(output->type[output->type_select], "bin"))
|
||||
if (!strcmp(output->type[output->type_select], "bin"))
|
||||
{
|
||||
if(debug->is_disable_sync)
|
||||
if (debug->is_disable_sync)
|
||||
strcat(buffer, " -nosync");
|
||||
if(debug->is_no_padding)
|
||||
if (debug->is_no_padding)
|
||||
strcat(buffer, " -fullbin");
|
||||
}
|
||||
if(debug->is_debug_xds)
|
||||
if (debug->is_debug_xds)
|
||||
strcat(buffer, " -xdsdebug");
|
||||
if(debug->is_output_pat)
|
||||
if (debug->is_output_pat)
|
||||
strcat(buffer, " -parsePAT");
|
||||
if(debug->is_output_pmt)
|
||||
if (debug->is_output_pmt)
|
||||
strcat(buffer, " -parsePMT");
|
||||
if(debug->is_scan_ccdata)
|
||||
if (debug->is_scan_ccdata)
|
||||
strcat(buffer, " -investigate_packets");
|
||||
if(debug->is_output_levenshtein)
|
||||
if (debug->is_output_levenshtein)
|
||||
strcat(buffer, " -deblev");
|
||||
|
||||
/*HARD_BURNED SUBS SETTINGS*/
|
||||
if(burned_subs->is_burned_subs)
|
||||
if (burned_subs->is_burned_subs)
|
||||
{
|
||||
strcat(buffer, " -hardsubx -ocr_mode");
|
||||
switch(burned_subs->ocr_mode)
|
||||
switch (burned_subs->ocr_mode)
|
||||
{
|
||||
case FRAME_WISE:
|
||||
strcat(buffer, " frame");
|
||||
break;
|
||||
case WORD_WISE:
|
||||
strcat(buffer, " word");
|
||||
break;
|
||||
case LETTER_WISE:
|
||||
strcat(buffer, " letter");
|
||||
break;
|
||||
case FRAME_WISE:
|
||||
strcat(buffer, " frame");
|
||||
break;
|
||||
case WORD_WISE:
|
||||
strcat(buffer, " word");
|
||||
break;
|
||||
case LETTER_WISE:
|
||||
strcat(buffer, " letter");
|
||||
break;
|
||||
}
|
||||
|
||||
strcat(buffer, " -min_sub_duration ");
|
||||
strcat(buffer, burned_subs->min_duration);
|
||||
|
||||
if(!burned_subs->subs_color_select && burned_subs->color_type == PRESET)
|
||||
if (!burned_subs->subs_color_select && burned_subs->color_type == PRESET)
|
||||
sprintf(buffer, "%s -whiteness_thresh %d", buffer, burned_subs->luminance_threshold);
|
||||
|
||||
sprintf(buffer, "%s -conf_thresh %d", buffer, burned_subs->confidence_threshold);
|
||||
|
||||
if(burned_subs->is_italic)
|
||||
if (burned_subs->is_italic)
|
||||
strcat(buffer, " -detect_italics");
|
||||
}
|
||||
|
||||
//Output
|
||||
{
|
||||
strcat(buffer, " -out=");
|
||||
strcat(buffer, output->type[output->type_select]);
|
||||
if (output->is_filename) {
|
||||
strcat(buffer, " -o \"");
|
||||
strncat(buffer, output->filename, output->filename_len);
|
||||
strcat(buffer, "\"");
|
||||
}
|
||||
strcat(buffer, " -out=");
|
||||
strcat(buffer, output->type[output->type_select]);
|
||||
if (output->is_filename)
|
||||
{
|
||||
strcat(buffer, " -o \"");
|
||||
strncat(buffer, output->filename, output->filename_len);
|
||||
strcat(buffer, "\"");
|
||||
}
|
||||
|
||||
if (output->is_delay) {
|
||||
strcat(buffer, " -delay ");
|
||||
strcat(buffer, output->delay_sec_buffer);
|
||||
}
|
||||
if (output->is_delay)
|
||||
{
|
||||
strcat(buffer, " -delay ");
|
||||
strcat(buffer, output->delay_sec_buffer);
|
||||
}
|
||||
|
||||
if (output->is_export_xds)
|
||||
strcat(buffer, " -xds");
|
||||
if (output->is_export_xds)
|
||||
strcat(buffer, " -xds");
|
||||
|
||||
switch (output->encoding) {
|
||||
switch (output->encoding)
|
||||
{
|
||||
case LATIN:
|
||||
strcat(buffer, " -latin1");
|
||||
break;
|
||||
@@ -407,41 +429,43 @@ void command_builder(struct built_string *command,
|
||||
case UTF:
|
||||
strcat(buffer, " -utf8");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (output->is_bom)
|
||||
strcat(buffer, " -bom");
|
||||
else
|
||||
strcat(buffer, " -nobom");
|
||||
if (output->is_bom)
|
||||
strcat(buffer, " -bom");
|
||||
else
|
||||
strcat(buffer, " -nobom");
|
||||
|
||||
if (output->is_cap_standard)
|
||||
strcat(buffer, " --sentencecap");
|
||||
if (output->is_cap_standard)
|
||||
strcat(buffer, " --sentencecap");
|
||||
|
||||
if (output->is_cap_file) {
|
||||
strcat(buffer, " --capfile \"");
|
||||
strncat(buffer, output->cap_dictionary, output->cap_dictionary_len);
|
||||
strcat(buffer, "\"");
|
||||
}
|
||||
if (output->is_cap_file)
|
||||
{
|
||||
strcat(buffer, " --capfile \"");
|
||||
strncat(buffer, output->cap_dictionary, output->cap_dictionary_len);
|
||||
strcat(buffer, "\"");
|
||||
}
|
||||
|
||||
switch (output->line_ending)
|
||||
{
|
||||
switch (output->line_ending)
|
||||
{
|
||||
case CRLF:
|
||||
break;
|
||||
case LF:
|
||||
strcat(buffer, " -lf");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (output->is_center)
|
||||
strcat(buffer, " -trim");
|
||||
if (output->is_center)
|
||||
strcat(buffer, " -trim");
|
||||
|
||||
if (output->is_dash)
|
||||
strcat(buffer, " -autodash");
|
||||
if (output->is_dash)
|
||||
strcat(buffer, " -autodash");
|
||||
|
||||
if (output->no_typesetting)
|
||||
strcat(buffer, " --notypesetting");
|
||||
if (output->no_typesetting)
|
||||
strcat(buffer, " --notypesetting");
|
||||
|
||||
switch (output->font_color) {
|
||||
switch (output->font_color)
|
||||
{
|
||||
case NO_COLOR:
|
||||
strcat(buffer, " --nofontcolor");
|
||||
break;
|
||||
@@ -449,10 +473,10 @@ void command_builder(struct built_string *command,
|
||||
strcat(buffer, " --defaultcolor #");
|
||||
strcat(buffer, output->color_hex);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch (output->onetime_or_realtime)
|
||||
{
|
||||
switch (output->onetime_or_realtime)
|
||||
{
|
||||
case ONETIME:
|
||||
strcat(buffer, " --norollup");
|
||||
break;
|
||||
@@ -460,23 +484,21 @@ void command_builder(struct built_string *command,
|
||||
strcat(buffer, " -dru");
|
||||
switch (output->roll_limit_select)
|
||||
{
|
||||
case 1:
|
||||
strcat(buffer, " -ru1");
|
||||
break;
|
||||
case 2:
|
||||
strcat(buffer, " -ru2");
|
||||
break;
|
||||
case 3:
|
||||
strcat(buffer, " -ru3");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
case 1:
|
||||
strcat(buffer, " -ru1");
|
||||
break;
|
||||
case 2:
|
||||
strcat(buffer, " -ru2");
|
||||
break;
|
||||
case 3:
|
||||
strcat(buffer, " -ru3");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
memset(command->term_string, 0, sizeof(command->term_string));
|
||||
strncpy(command->term_string, buffer, strlen(buffer));
|
||||
}
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#ifndef STB_IMAGE_IMPLEMENTATION
|
||||
#include "stb_image.h"
|
||||
@@ -24,8 +24,7 @@
|
||||
#include "ccextractorGUI.h"
|
||||
#include "tabs.h"
|
||||
|
||||
void
|
||||
die(const char *fmt, ...)
|
||||
void die(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
@@ -35,36 +34,38 @@ die(const char *fmt, ...)
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
char*
|
||||
file_load(const char* path, size_t* siz)
|
||||
char *
|
||||
file_load(const char *path, size_t *siz)
|
||||
{
|
||||
char *buf;
|
||||
FILE *fd = fopen(path, "rb");
|
||||
if (!fd) die("Failed to open file: %s\n", path);
|
||||
if (!fd)
|
||||
die("Failed to open file: %s\n", path);
|
||||
fseek(fd, 0, SEEK_END);
|
||||
*siz = (size_t)ftell(fd);
|
||||
fseek(fd, 0, SEEK_SET);
|
||||
buf = (char*)calloc(*siz, 1);
|
||||
buf = (char *)calloc(*siz, 1);
|
||||
fread(buf, *siz, 1, fd);
|
||||
fclose(fd);
|
||||
return buf;
|
||||
}
|
||||
|
||||
char*
|
||||
char *
|
||||
str_duplicate(const char *src)
|
||||
{
|
||||
char *ret;
|
||||
size_t len = strlen(src);
|
||||
if (!len) return 0;
|
||||
ret = (char*)malloc(len + 1);
|
||||
if (!ret) return 0;
|
||||
if (!len)
|
||||
return 0;
|
||||
ret = (char *)malloc(len + 1);
|
||||
if (!ret)
|
||||
return 0;
|
||||
memcpy(ret, src, len);
|
||||
ret[len] = '\0';
|
||||
return ret;
|
||||
}
|
||||
|
||||
void
|
||||
dir_free_list(char **list, size_t size)
|
||||
void dir_free_list(char **list, size_t size)
|
||||
{
|
||||
size_t i;
|
||||
for (i = 0; i < size; ++i)
|
||||
@@ -72,7 +73,7 @@ dir_free_list(char **list, size_t size)
|
||||
free(list);
|
||||
}
|
||||
|
||||
char**
|
||||
char **
|
||||
dir_list(const char *dir, int return_subdirs, size_t *count)
|
||||
{
|
||||
size_t n = 0;
|
||||
@@ -99,13 +100,16 @@ dir_list(const char *dir, int return_subdirs, size_t *count)
|
||||
size = 0;
|
||||
|
||||
z = opendir(dir);
|
||||
if (z != none) {
|
||||
if (z != none)
|
||||
{
|
||||
int nonempty = 1;
|
||||
struct dirent *data = readdir(z);
|
||||
nonempty = (data != NULL);
|
||||
if (!nonempty) return NULL;
|
||||
if (!nonempty)
|
||||
return NULL;
|
||||
|
||||
do {
|
||||
do
|
||||
{
|
||||
DIR *y;
|
||||
char *p;
|
||||
int is_subdir;
|
||||
@@ -115,18 +119,23 @@ dir_list(const char *dir, int return_subdirs, size_t *count)
|
||||
strncpy(buffer + n, data->d_name, MAX_PATH_LEN - n);
|
||||
y = opendir(buffer);
|
||||
is_subdir = (y != NULL);
|
||||
if (y != NULL) closedir(y);
|
||||
if (y != NULL)
|
||||
closedir(y);
|
||||
|
||||
if ((return_subdirs && is_subdir) || (!is_subdir && !return_subdirs)) {
|
||||
if (!size) {
|
||||
results = (char**)calloc(sizeof(char*), capacity);
|
||||
if ((return_subdirs && is_subdir) || (!is_subdir && !return_subdirs))
|
||||
{
|
||||
if (!size)
|
||||
{
|
||||
results = (char **)calloc(sizeof(char *), capacity);
|
||||
}
|
||||
else if (size >= capacity) {
|
||||
else if (size >= capacity)
|
||||
{
|
||||
void *old = results;
|
||||
capacity = capacity * 2;
|
||||
results = (char**)realloc(results, capacity * sizeof(char*));
|
||||
results = (char **)realloc(results, capacity * sizeof(char *));
|
||||
assert(results);
|
||||
if (!results) free(old);
|
||||
if (!results)
|
||||
free(old);
|
||||
}
|
||||
p = str_duplicate(data->d_name);
|
||||
results[size++] = p;
|
||||
@@ -134,13 +143,14 @@ dir_list(const char *dir, int return_subdirs, size_t *count)
|
||||
} while ((data = readdir(z)) != NULL);
|
||||
}
|
||||
|
||||
if (z) closedir(z);
|
||||
if (z)
|
||||
closedir(z);
|
||||
*count = size;
|
||||
return results;
|
||||
}
|
||||
|
||||
struct file_group
|
||||
FILE_GROUP(enum file_groups group, const char *name, struct nk_image *icon)
|
||||
FILE_GROUP(enum file_groups group, const char *name, struct nk_image *icon)
|
||||
{
|
||||
struct file_group fg;
|
||||
fg.group = group;
|
||||
@@ -150,7 +160,7 @@ struct file_group
|
||||
}
|
||||
|
||||
struct file
|
||||
FILE_DEF(enum file_types type, const char *suffix, enum file_groups group)
|
||||
FILE_DEF(enum file_types type, const char *suffix, enum file_groups group)
|
||||
{
|
||||
struct file fd;
|
||||
fd.type = type;
|
||||
@@ -159,8 +169,8 @@ struct file
|
||||
return fd;
|
||||
}
|
||||
|
||||
struct nk_image*
|
||||
media_icon_for_file(struct media *media, const char *file)
|
||||
struct nk_image *
|
||||
media_icon_for_file(struct media *media, const char *file)
|
||||
{
|
||||
int i = 0;
|
||||
const char *s = file;
|
||||
@@ -169,12 +179,15 @@ struct nk_image*
|
||||
memset(suffix, 0, sizeof(suffix));
|
||||
|
||||
/* extract suffix .xxx from file */
|
||||
while (*s++ != '\0') {
|
||||
while (*s++ != '\0')
|
||||
{
|
||||
if (found && i < 3)
|
||||
suffix[i++] = *s;
|
||||
|
||||
if (*s == '.') {
|
||||
if (found) {
|
||||
if (*s == '.')
|
||||
{
|
||||
if (found)
|
||||
{
|
||||
found = 0;
|
||||
break;
|
||||
}
|
||||
@@ -183,13 +196,16 @@ struct nk_image*
|
||||
}
|
||||
|
||||
/* check for all file definition of all groups for fitting suffix*/
|
||||
for (i = 0; i < FILE_MAX && found; ++i) {
|
||||
for (i = 0; i < FILE_MAX && found; ++i)
|
||||
{
|
||||
struct file *d = &media->files[i];
|
||||
{
|
||||
const char *f = d->suffix;
|
||||
s = suffix;
|
||||
while (f && *f && *s && *s == *f) {
|
||||
s++; f++;
|
||||
while (f && *f && *s && *s == *f)
|
||||
{
|
||||
s++;
|
||||
f++;
|
||||
}
|
||||
|
||||
/* found correct file definition so */
|
||||
@@ -201,8 +217,7 @@ struct nk_image*
|
||||
return &media->icons.default_file;
|
||||
}
|
||||
|
||||
void
|
||||
media_init(struct media *media)
|
||||
void media_init(struct media *media)
|
||||
{
|
||||
/* file groups */
|
||||
struct icons *icons = &media->icons;
|
||||
@@ -232,8 +247,7 @@ media_init(struct media *media)
|
||||
media->files[FILE_GIF] = FILE_DEF(FILE_GIF, "gif", FILE_GROUP_IMAGE);
|
||||
}
|
||||
|
||||
void
|
||||
file_browser_reload_directory_content(struct file_browser *browser, const char *path)
|
||||
void file_browser_reload_directory_content(struct file_browser *browser, const char *path)
|
||||
{
|
||||
strncpy(browser->directory, path, MAX_PATH_LEN);
|
||||
dir_free_list(browser->files, browser->file_count);
|
||||
@@ -243,8 +257,7 @@ file_browser_reload_directory_content(struct file_browser *browser, const char *
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
void
|
||||
get_drives(struct file_browser *browser)
|
||||
void get_drives(struct file_browser *browser)
|
||||
{
|
||||
static int drive_num;
|
||||
static char drive_list[50][4];
|
||||
@@ -258,7 +271,8 @@ get_drives(struct file_browser *browser)
|
||||
{
|
||||
printf("cannot find any drives! try again with different settings/permissions");
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
puts("File opened");
|
||||
while ((c = getc(file)) != EOF)
|
||||
{
|
||||
@@ -272,7 +286,6 @@ get_drives(struct file_browser *browser)
|
||||
continue;
|
||||
|
||||
prev_char = c;
|
||||
|
||||
}
|
||||
}
|
||||
printf("drive nums:%d\n", drive_num);
|
||||
@@ -280,17 +293,16 @@ get_drives(struct file_browser *browser)
|
||||
for (int i = 0; i < drive_num; i++)
|
||||
strcat(drive_list[i], ":\\");
|
||||
|
||||
|
||||
browser->drives_num = drive_num;
|
||||
browser->drives = (char**)calloc(drive_num + 1, sizeof(char*));
|
||||
browser->drives = (char **)calloc(drive_num + 1, sizeof(char *));
|
||||
for (int i = 0; i < drive_num; i++)
|
||||
{
|
||||
browser->drives[i] = (char*)calloc(strlen(drive_list[i]), sizeof(char));
|
||||
browser->drives[i] = (char *)calloc(strlen(drive_list[i]), sizeof(char));
|
||||
browser->drives[i] = strdup(drive_list[i]);
|
||||
}
|
||||
browser->drives[browser->drives_num] = NULL;
|
||||
|
||||
for (int i = 0; i< drive_num; i++)
|
||||
for (int i = 0; i < drive_num; i++)
|
||||
puts(browser->drives[i]);
|
||||
|
||||
fclose(file);
|
||||
@@ -298,8 +310,7 @@ get_drives(struct file_browser *browser)
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
file_browser_init(struct file_browser *browser, struct media *media)
|
||||
void file_browser_init(struct file_browser *browser, struct media *media)
|
||||
{
|
||||
memset(browser, 0, sizeof(*browser));
|
||||
browser->media = media;
|
||||
@@ -311,9 +322,11 @@ file_browser_init(struct file_browser *browser, struct media *media)
|
||||
/* load files and sub-directory list */
|
||||
const char *home = getenv("HOME");
|
||||
#ifdef _WIN32
|
||||
if (!home) home = getenv("USERPROFILE");
|
||||
if (!home)
|
||||
home = getenv("USERPROFILE");
|
||||
#else
|
||||
if (!home) home = getpwuid(getuid());
|
||||
if (!home)
|
||||
home = getpwuid(getuid());
|
||||
#endif
|
||||
{
|
||||
size_t l;
|
||||
@@ -341,8 +354,7 @@ file_browser_init(struct file_browser *browser, struct media *media)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
file_browser_free(struct file_browser *browser)
|
||||
void file_browser_free(struct file_browser *browser)
|
||||
{
|
||||
if (browser->files)
|
||||
dir_free_list(browser->files, browser->file_count);
|
||||
@@ -353,24 +365,22 @@ file_browser_free(struct file_browser *browser)
|
||||
memset(browser, 0, sizeof(*browser));
|
||||
}
|
||||
|
||||
int
|
||||
file_browser_run(struct file_browser *browser,
|
||||
struct nk_context *ctx,
|
||||
struct main_tab *main_settings,
|
||||
struct output_tab *output,
|
||||
struct debug_tab *debug,
|
||||
struct hd_homerun_tab *hd_homerun)
|
||||
int file_browser_run(struct file_browser *browser,
|
||||
struct nk_context *ctx,
|
||||
struct main_tab *main_settings,
|
||||
struct output_tab *output,
|
||||
struct debug_tab *debug,
|
||||
struct hd_homerun_tab *hd_homerun)
|
||||
{
|
||||
static int isFileAdded = nk_false;
|
||||
int ret = 0;
|
||||
struct media *media = browser->media;
|
||||
struct nk_rect total_space;
|
||||
|
||||
|
||||
if (nk_popup_begin(ctx, NK_POPUP_STATIC, "File Browser", NK_WINDOW_CLOSABLE | NK_WINDOW_BORDER | NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_MOVABLE,
|
||||
nk_rect(0, 0, 930, 650)))
|
||||
nk_rect(0, 0, 930, 650)))
|
||||
{
|
||||
static float ratio[] = { 0.25f, NK_UNDEFINED };
|
||||
static float ratio[] = {0.25f, NK_UNDEFINED};
|
||||
float spacing_x = ctx->style.window.spacing.x;
|
||||
|
||||
/* output path directory selector in the menubar */
|
||||
@@ -380,7 +390,8 @@ file_browser_run(struct file_browser *browser,
|
||||
char *d = browser->directory;
|
||||
char *begin = d + 1;
|
||||
nk_layout_row_dynamic(ctx, 25, 6);
|
||||
while (*d++) {
|
||||
while (*d++)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
if (*d == '\\')
|
||||
#else
|
||||
@@ -388,7 +399,8 @@ file_browser_run(struct file_browser *browser,
|
||||
#endif
|
||||
{
|
||||
*d = '\0';
|
||||
if (nk_button_label(ctx, begin)) {
|
||||
if (nk_button_label(ctx, begin))
|
||||
{
|
||||
#ifdef _WIN32
|
||||
*d++ = '\\';
|
||||
#else
|
||||
@@ -451,100 +463,112 @@ file_browser_run(struct file_browser *browser,
|
||||
|
||||
cols = 4;
|
||||
rows = count / cols;
|
||||
for (i = 0; i <= rows; i += 1) {
|
||||
{size_t n = j + cols;
|
||||
nk_layout_row_dynamic(ctx, 135, (int)cols);
|
||||
for (; j < count && j < n; ++j) {
|
||||
/* draw one row of icons */
|
||||
if (j < browser->dir_count) {
|
||||
/* draw and execute directory buttons */
|
||||
if (nk_button_image(ctx, media->icons.directory))
|
||||
index = (int)j;
|
||||
}
|
||||
else {
|
||||
/* draw and execute files buttons */
|
||||
struct nk_image *icon;
|
||||
size_t fileIndex = ((size_t)j - browser->dir_count);
|
||||
icon = media_icon_for_file(media, browser->files[fileIndex]);
|
||||
if (nk_button_image(ctx, *icon)) {
|
||||
strncpy(browser->file, browser->directory, MAX_PATH_LEN);
|
||||
n = strlen(browser->file);
|
||||
strncpy(browser->file + n, browser->files[fileIndex], MAX_PATH_LEN - n);
|
||||
ret = 1;
|
||||
for (i = 0; i <= rows; i += 1)
|
||||
{
|
||||
{
|
||||
size_t n = j + cols;
|
||||
nk_layout_row_dynamic(ctx, 135, (int)cols);
|
||||
for (; j < count && j < n; ++j)
|
||||
{
|
||||
/* draw one row of icons */
|
||||
if (j < browser->dir_count)
|
||||
{
|
||||
/* draw and execute directory buttons */
|
||||
if (nk_button_image(ctx, media->icons.directory))
|
||||
index = (int)j;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* draw and execute files buttons */
|
||||
struct nk_image *icon;
|
||||
size_t fileIndex = ((size_t)j - browser->dir_count);
|
||||
icon = media_icon_for_file(media, browser->files[fileIndex]);
|
||||
if (nk_button_image(ctx, *icon))
|
||||
{
|
||||
strncpy(browser->file, browser->directory, MAX_PATH_LEN);
|
||||
n = strlen(browser->file);
|
||||
strncpy(browser->file + n, browser->files[fileIndex], MAX_PATH_LEN - n);
|
||||
ret = 1;
|
||||
|
||||
if (hd_homerun->is_homerun_browser_active)
|
||||
{
|
||||
hd_homerun->location_len = strlen(browser->file);
|
||||
strncpy(hd_homerun->location, browser->file, hd_homerun->location_len);
|
||||
isFileAdded = nk_true;
|
||||
hd_homerun->is_homerun_browser_active = nk_false;
|
||||
break;
|
||||
}
|
||||
if (debug->is_debug_browser_active)
|
||||
{
|
||||
debug->elementary_stream_len = strlen(browser->file);
|
||||
strcpy(debug->elementary_stream, browser->file);
|
||||
isFileAdded = nk_true;
|
||||
debug->is_debug_browser_active = nk_false;
|
||||
break;
|
||||
}
|
||||
if (output->is_output_browser_active)
|
||||
{
|
||||
output->filename_len = strlen(browser->file);
|
||||
strcpy(output->filename, browser->file);
|
||||
isFileAdded = nk_true;
|
||||
output->is_output_browser_active = nk_false;
|
||||
break;
|
||||
}
|
||||
if (output->is_cap_browser_active)
|
||||
{
|
||||
output->cap_dictionary_len = strlen(browser->file);
|
||||
strcpy(output->cap_dictionary, browser->file);
|
||||
isFileAdded = nk_true;
|
||||
output->is_cap_browser_active = nk_false;
|
||||
break;
|
||||
}
|
||||
if (main_settings->is_file_browser_active)
|
||||
{
|
||||
if (main_settings->filename_count == 0)
|
||||
main_settings->filenames = (char **)calloc(2, sizeof(char *));
|
||||
else
|
||||
main_settings->filenames = (char **)realloc(main_settings->filenames, (main_settings->filename_count + 2) * sizeof(char *));
|
||||
|
||||
if (hd_homerun->is_homerun_browser_active)
|
||||
{
|
||||
hd_homerun->location_len = strlen(browser->file);
|
||||
strncpy(hd_homerun->location, browser->file, hd_homerun->location_len);
|
||||
isFileAdded = nk_true;
|
||||
hd_homerun->is_homerun_browser_active = nk_false;
|
||||
break;
|
||||
main_settings->filenames[main_settings->filename_count] = (char *)calloc((strlen(browser->file) + 5), sizeof(char));
|
||||
main_settings->filenames[main_settings->filename_count][0] = '\"';
|
||||
strcat(main_settings->filenames[main_settings->filename_count], browser->file);
|
||||
strcat(main_settings->filenames[main_settings->filename_count], "\"");
|
||||
main_settings->filename_count++;
|
||||
main_settings->filenames[main_settings->filename_count] = NULL;
|
||||
isFileAdded = nk_true;
|
||||
main_settings->is_file_browser_active = nk_false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (debug->is_debug_browser_active)
|
||||
{
|
||||
debug->elementary_stream_len = strlen(browser->file);
|
||||
strcpy(debug->elementary_stream, browser->file);
|
||||
isFileAdded = nk_true;
|
||||
debug->is_debug_browser_active = nk_false;
|
||||
break;
|
||||
}
|
||||
if (output->is_output_browser_active)
|
||||
{
|
||||
output->filename_len = strlen(browser->file);
|
||||
strcpy(output->filename, browser->file);
|
||||
isFileAdded = nk_true;
|
||||
output->is_output_browser_active = nk_false;
|
||||
break;
|
||||
}
|
||||
if (output->is_cap_browser_active)
|
||||
{
|
||||
output->cap_dictionary_len = strlen(browser->file);
|
||||
strcpy(output->cap_dictionary, browser->file);
|
||||
isFileAdded = nk_true;
|
||||
output->is_cap_browser_active = nk_false;
|
||||
break;
|
||||
}
|
||||
if (main_settings->is_file_browser_active)
|
||||
{
|
||||
if (main_settings->filename_count == 0)
|
||||
main_settings->filenames = (char**)calloc(2, sizeof(char*));
|
||||
else
|
||||
main_settings->filenames = (char**)realloc(main_settings->filenames, (main_settings->filename_count + 2) * sizeof(char*));
|
||||
|
||||
main_settings->filenames[main_settings->filename_count] = (char*)calloc((strlen(browser->file) + 5), sizeof(char));
|
||||
main_settings->filenames[main_settings->filename_count][0] = '\"';
|
||||
strcat(main_settings->filenames[main_settings->filename_count], browser->file);
|
||||
strcat(main_settings->filenames[main_settings->filename_count], "\"");
|
||||
main_settings->filename_count++;
|
||||
main_settings->filenames[main_settings->filename_count] = NULL;
|
||||
isFileAdded = nk_true;
|
||||
main_settings->is_file_browser_active = nk_false;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}}
|
||||
{size_t n = k + cols;
|
||||
nk_layout_row_dynamic(ctx, 20, (int)cols);
|
||||
for (; k < count && k < n; k++) {
|
||||
/* draw one row of labels */
|
||||
if (k < browser->dir_count) {
|
||||
nk_label(ctx, browser->directories[k], NK_TEXT_CENTERED);
|
||||
}
|
||||
{
|
||||
size_t n = k + cols;
|
||||
nk_layout_row_dynamic(ctx, 20, (int)cols);
|
||||
for (; k < count && k < n; k++)
|
||||
{
|
||||
/* draw one row of labels */
|
||||
if (k < browser->dir_count)
|
||||
{
|
||||
nk_label(ctx, browser->directories[k], NK_TEXT_CENTERED);
|
||||
}
|
||||
else
|
||||
{
|
||||
size_t t = k - browser->dir_count;
|
||||
nk_label(ctx, browser->files[t], NK_TEXT_CENTERED);
|
||||
}
|
||||
}
|
||||
else {
|
||||
size_t t = k - browser->dir_count;
|
||||
nk_label(ctx, browser->files[t], NK_TEXT_CENTERED);
|
||||
}
|
||||
}}
|
||||
}
|
||||
}
|
||||
|
||||
if (index != -1) {
|
||||
if (index != -1)
|
||||
{
|
||||
size_t n = strlen(browser->directory);
|
||||
strncpy(browser->directory + n, browser->directories[index], MAX_PATH_LEN - n);
|
||||
n = strlen(browser->directory);
|
||||
if (n < MAX_PATH_LEN - 1) {
|
||||
if (n < MAX_PATH_LEN - 1)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
browser->directory[n] = '\\';
|
||||
#else
|
||||
@@ -555,10 +579,9 @@ file_browser_run(struct file_browser *browser,
|
||||
file_browser_reload_directory_content(browser, browser->directory);
|
||||
}
|
||||
nk_group_end(ctx);
|
||||
|
||||
|
||||
}
|
||||
if (isFileAdded) {
|
||||
if (isFileAdded)
|
||||
{
|
||||
isFileAdded = nk_false;
|
||||
main_settings->scaleWindowForFileBrowser = nk_false;
|
||||
nk_popup_close(ctx);
|
||||
@@ -567,9 +590,9 @@ file_browser_run(struct file_browser *browser,
|
||||
nk_popup_end(ctx);
|
||||
return ret;
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
main_settings->scaleWindowForFileBrowser = nk_false;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -154,6 +154,6 @@ file_browser_run(struct file_browser *browser,
|
||||
struct hd_homerun_tab *hd_homerun);
|
||||
|
||||
struct nk_image
|
||||
icon_load(const char *filename);
|
||||
icon_load(char icon_data[], int len);
|
||||
|
||||
#endif
|
||||
|
||||
27786
src/GUI/icon_data.c
Normal file
@@ -24,8 +24,8 @@ void setup_network_settings(struct network_popup *network_settings)
|
||||
|
||||
void draw_network_popup(struct nk_context *ctx, struct network_popup *network_settings)
|
||||
{
|
||||
const float save_ok_ratio[] = { 0.8f,0.1f,0.1f };
|
||||
const float udp_tcp_ratio[] = { 0.45f,0.1f,0.45f };
|
||||
const float save_ok_ratio[] = {0.8f, 0.1f, 0.1f};
|
||||
const float udp_tcp_ratio[] = {0.45f, 0.1f, 0.45f};
|
||||
static char udp_ipv4_buffer[30];
|
||||
static int udp_ipv4_len[30];
|
||||
static char tcp_pass_buf[30];
|
||||
@@ -36,12 +36,12 @@ void draw_network_popup(struct nk_context *ctx, struct network_popup *network_se
|
||||
static int send_port_len[30];
|
||||
static char send_host_buf[30];
|
||||
static int send_host_len[30];
|
||||
const char network_attr[][30] = { "-udp port:", "-udp [host:]port:","-sendto host[:port]:","-tcp port:","-tcppassword password:", "-tcpdesc description:" };
|
||||
static struct nk_rect s = { 20,30,480,500 };
|
||||
if (nk_popup_begin(ctx, NK_POPUP_STATIC, "Network Settings", NK_WINDOW_CLOSABLE|NK_WINDOW_NO_SCROLLBAR, s))
|
||||
const char network_attr[][30] = {"-udp port:", "-udp [host:]port:", "-sendto host[:port]:", "-tcp port:", "-tcppassword password:", "-tcpdesc description:"};
|
||||
static struct nk_rect s = {20, 30, 480, 500};
|
||||
if (nk_popup_begin(ctx, NK_POPUP_STATIC, "Network Settings", NK_WINDOW_CLOSABLE | NK_WINDOW_NO_SCROLLBAR, s))
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 220, 1);
|
||||
if(nk_group_begin(ctx, "Receive", NK_WINDOW_TITLE ))
|
||||
if (nk_group_begin(ctx, "Receive", NK_WINDOW_TITLE))
|
||||
{
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 21, 3, udp_tcp_ratio);
|
||||
nk_spacing(ctx, 1);
|
||||
@@ -64,7 +64,7 @@ void draw_network_popup(struct nk_context *ctx, struct network_popup *network_se
|
||||
}
|
||||
|
||||
nk_layout_row_dynamic(ctx, 200, 1);
|
||||
if (nk_group_begin(ctx, "Send", NK_WINDOW_TITLE ))
|
||||
if (nk_group_begin(ctx, "Send", NK_WINDOW_TITLE))
|
||||
{
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 21, 3, udp_tcp_ratio);
|
||||
nk_spacing(ctx, 1);
|
||||
@@ -82,16 +82,18 @@ void draw_network_popup(struct nk_context *ctx, struct network_popup *network_se
|
||||
/*nk_layout_row_static(ctx, 20, 200, 2);
|
||||
nk_label(ctx, network_attr[5], NK_TEXT_LEFT);
|
||||
nk_edit_string(ctx, NK_EDIT_SIMPLE, text_buffer[5], &text_len[5], 50, nk_filter_default);*/
|
||||
|
||||
|
||||
//OK Button
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 27, 3, save_ok_ratio);
|
||||
nk_spacing(ctx, 1);
|
||||
if (nk_button_label(ctx, "Save")) {
|
||||
if (nk_button_label(ctx, "Save"))
|
||||
{
|
||||
network_settings->save_network_settings = nk_true;
|
||||
network_settings->show_network_settings = nk_false;
|
||||
nk_popup_close(ctx);
|
||||
}
|
||||
if (nk_button_label(ctx, "OK")) {
|
||||
if (nk_button_label(ctx, "OK"))
|
||||
{
|
||||
network_settings->save_network_settings = nk_false;
|
||||
network_settings->show_network_settings = nk_false;
|
||||
nk_popup_close(ctx);
|
||||
@@ -105,7 +107,7 @@ void draw_network_popup(struct nk_context *ctx, struct network_popup *network_se
|
||||
|
||||
void draw_getting_started_popup(struct nk_context *ctx, int *show_getting_started)
|
||||
{
|
||||
static struct nk_rect s = { 20,30,480,500 };
|
||||
static struct nk_rect s = {20, 30, 480, 500};
|
||||
if (nk_popup_begin(ctx, NK_POPUP_STATIC, "Getting Started", NK_WINDOW_CLOSABLE, s))
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 80, 1);
|
||||
@@ -118,15 +120,15 @@ void draw_getting_started_popup(struct nk_context *ctx, int *show_getting_starte
|
||||
|
||||
void draw_about_ccx_popup(struct nk_context *ctx, int *show_about_ccx, struct nk_user_font *droid_big, struct nk_user_font *droid_head)
|
||||
{
|
||||
const float ccx_ratio[] = { 0.3f,0.4f,0.3f };
|
||||
const float ok_ratio[] = { 0.9f,0.1f };
|
||||
static struct nk_rect s = { 20,30,480,500};
|
||||
if (nk_popup_begin(ctx, NK_POPUP_STATIC, "About CCExtractor", NK_WINDOW_CLOSABLE|NK_WINDOW_NO_SCROLLBAR, s))
|
||||
const float ccx_ratio[] = {0.3f, 0.4f, 0.3f};
|
||||
const float ok_ratio[] = {0.9f, 0.1f};
|
||||
static struct nk_rect s = {20, 30, 480, 500};
|
||||
if (nk_popup_begin(ctx, NK_POPUP_STATIC, "About CCExtractor", NK_WINDOW_CLOSABLE | NK_WINDOW_NO_SCROLLBAR, s))
|
||||
{
|
||||
nk_style_push_font(ctx, droid_big);
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 30, 3, ccx_ratio);
|
||||
nk_spacing(ctx, 1);
|
||||
nk_label_wrap(ctx, "About CCExtractor"/*, NK_TEXT_LEFT*/);
|
||||
nk_label_wrap(ctx, "About CCExtractor" /*, NK_TEXT_LEFT*/);
|
||||
nk_style_pop_font(ctx);
|
||||
|
||||
nk_layout_row_dynamic(ctx, 390, 1);
|
||||
@@ -204,7 +206,7 @@ void draw_about_ccx_popup(struct nk_context *ctx, int *show_about_ccx, struct nk
|
||||
nk_layout_row_dynamic(ctx, 20, 1);
|
||||
nk_label_wrap(ctx, "- Dish Network files");
|
||||
nk_layout_row_dynamic(ctx, 80, 1);
|
||||
nk_label_wrap(ctx, "Usually, if you record a TV show with your capture card and CCExtractor produces the expected result, it will work for your all recordings.If it doesn't, which means that your card uses a format CCExtractor can't handle, please contact me and we'll try to make it work.");
|
||||
nk_label_wrap(ctx, "Usually, if you record a TV show with your capture card and CCExtractor produces the expected result, it will work for your all recordings.If it doesn't, which means that your card uses a format CCExtractor can't handle, please contact me and we'll try to make it work.");
|
||||
|
||||
nk_style_push_font(ctx, droid_head);
|
||||
nk_layout_row_dynamic(ctx, 23, 1);
|
||||
@@ -230,13 +232,13 @@ void draw_about_ccx_popup(struct nk_context *ctx, int *show_about_ccx, struct nk
|
||||
nk_layout_row_dynamic(ctx, 23, 1);
|
||||
nk_label_wrap(ctx, "Send me an email: carlos@ccextractor.org");
|
||||
|
||||
|
||||
nk_group_end(ctx);
|
||||
}
|
||||
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 27, 2, ok_ratio);
|
||||
nk_spacing(ctx,1);
|
||||
if (nk_button_label(ctx, "OK")) {
|
||||
nk_spacing(ctx, 1);
|
||||
if (nk_button_label(ctx, "OK"))
|
||||
{
|
||||
*show_about_ccx = nk_false;
|
||||
nk_popup_close(ctx);
|
||||
}
|
||||
@@ -248,11 +250,11 @@ void draw_about_ccx_popup(struct nk_context *ctx, int *show_about_ccx, struct nk
|
||||
|
||||
void draw_progress_details_popup(struct nk_context *ctx, int *show_progress_details, struct main_tab *main_settings)
|
||||
{
|
||||
static struct nk_rect s = { 20,30,480,500 };
|
||||
static struct nk_rect s = {20, 30, 480, 500};
|
||||
if (nk_popup_begin(ctx, NK_POPUP_STATIC, "Progress Details of Extraction", NK_WINDOW_CLOSABLE, s))
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 20, 1);
|
||||
for( int i = 0; i < main_settings->activity_string_count; i++)
|
||||
for (int i = 0; i < main_settings->activity_string_count; i++)
|
||||
nk_label_wrap(ctx, main_settings->activity_string[i]);
|
||||
nk_popup_end(ctx);
|
||||
}
|
||||
@@ -262,15 +264,16 @@ void draw_progress_details_popup(struct nk_context *ctx, int *show_progress_deta
|
||||
|
||||
void draw_color_popup(struct nk_context *ctx, struct output_tab *output)
|
||||
{
|
||||
static struct nk_rect s = { 250,250,200,230 };
|
||||
if (nk_popup_begin(ctx, NK_POPUP_STATIC, "Color Picker", NK_WINDOW_TITLE |NK_WINDOW_NO_SCROLLBAR|NK_WINDOW_BORDER, s))
|
||||
static struct nk_rect s = {250, 250, 200, 230};
|
||||
if (nk_popup_begin(ctx, NK_POPUP_STATIC, "Color Picker", NK_WINDOW_TITLE | NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_BORDER, s))
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 160, 1);
|
||||
output->color_rgb = nk_color_picker(ctx, output->color_rgb, NK_RGBA);
|
||||
|
||||
|
||||
nk_layout_row_dynamic(ctx, 25, 3);
|
||||
nk_spacing(ctx, 1);
|
||||
if (nk_button_label(ctx, "OK")) {
|
||||
if (nk_button_label(ctx, "OK"))
|
||||
{
|
||||
show_color_from_picker = nk_true;
|
||||
output->color_popup = nk_false;
|
||||
nk_popup_close(ctx);
|
||||
@@ -283,23 +286,21 @@ void draw_color_popup(struct nk_context *ctx, struct output_tab *output)
|
||||
output->color_popup = nk_false;
|
||||
}
|
||||
|
||||
|
||||
void draw_thread_popup(struct nk_context *ctx, int *show_thread_popup)
|
||||
{
|
||||
static struct nk_rect s = { 100, 100, 300, 175 };
|
||||
static const float ratio[] = { 0.85f, 0.15f };
|
||||
static struct nk_rect s = {100, 100, 300, 175};
|
||||
static const float ratio[] = {0.85f, 0.15f};
|
||||
if (nk_popup_begin(ctx, NK_POPUP_STATIC, "File Read Error",
|
||||
NK_WINDOW_TITLE | NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_BORDER, s))
|
||||
NK_WINDOW_TITLE | NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_BORDER, s))
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 25, 1);
|
||||
nk_label(ctx, "Cannot read file.", NK_TEXT_CENTERED);
|
||||
nk_layout_row_dynamic(ctx, 60, 1);
|
||||
nk_label_wrap(ctx, "Make sure the directory isn't write protected OR you are running the program with write permissions.");
|
||||
|
||||
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 25, 2, ratio);
|
||||
nk_spacing(ctx, 1);
|
||||
if(nk_button_label(ctx, "OK"))
|
||||
if (nk_button_label(ctx, "OK"))
|
||||
{
|
||||
*show_thread_popup = nk_false;
|
||||
nk_popup_close(ctx);
|
||||
|
||||
@@ -8,13 +8,11 @@
|
||||
int preview(struct nk_context *ctx, int x, int y, int width, int height, struct main_tab *main_settings)
|
||||
{
|
||||
static int i;
|
||||
if (nk_begin(ctx, "Preview", nk_rect(x, y, width, height), NK_WINDOW_TITLE|NK_WINDOW_BACKGROUND))
|
||||
if (nk_begin(ctx, "Preview", nk_rect(x, y, width, height), NK_WINDOW_TITLE | NK_WINDOW_BACKGROUND))
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 20, 1);
|
||||
for( i = 0; i < main_settings->preview_string_count; i++)
|
||||
for (i = 0; i < main_settings->preview_string_count; i++)
|
||||
nk_label_wrap(ctx, main_settings->preview_string[i]);
|
||||
|
||||
|
||||
}
|
||||
nk_end(ctx);
|
||||
return !nk_window_is_closed(ctx, "Preview");
|
||||
|
||||
@@ -4,24 +4,24 @@
|
||||
#include "popups.h"
|
||||
|
||||
void load_data(FILE *file,
|
||||
struct main_tab* main_settings,
|
||||
struct input_tab* input,
|
||||
struct advanced_input_tab* advanced_input,
|
||||
struct output_tab* output,
|
||||
struct decoders_tab* decoders,
|
||||
struct credits_tab* credits,
|
||||
struct debug_tab* debug,
|
||||
struct hd_homerun_tab* hd_homerun,
|
||||
struct burned_subs_tab* burned_subs,
|
||||
struct network_popup* network_settings)
|
||||
struct main_tab *main_settings,
|
||||
struct input_tab *input,
|
||||
struct advanced_input_tab *advanced_input,
|
||||
struct output_tab *output,
|
||||
struct decoders_tab *decoders,
|
||||
struct credits_tab *credits,
|
||||
struct debug_tab *debug,
|
||||
struct hd_homerun_tab *hd_homerun,
|
||||
struct burned_subs_tab *burned_subs,
|
||||
struct network_popup *network_settings)
|
||||
{
|
||||
int null_int,r ,g, b;
|
||||
int null_int, r, g, b;
|
||||
char null_char[260];
|
||||
|
||||
//Read main_tab data
|
||||
fscanf(file, "port_or_files:%d\n", &main_settings->port_or_files);
|
||||
fscanf(file, "port_num_len:%d\n", &main_settings->port_num_len);
|
||||
if( main_settings->port_num_len > 0)
|
||||
if (main_settings->port_num_len > 0)
|
||||
fscanf(file, "port_num:%[^\n]\n", main_settings->port_num);
|
||||
else
|
||||
fscanf(file, "%[^\n]\n", null_char);
|
||||
@@ -34,7 +34,7 @@ void load_data(FILE *file,
|
||||
fscanf(file, "is_split:%d\n", &input->is_split);
|
||||
fscanf(file, "is_live_stream:%d\n", &input->is_live_stream);
|
||||
fscanf(file, "wait_data_sec_len:%d\n", &input->wait_data_sec_len);
|
||||
if(input->wait_data_sec_len > 0)
|
||||
if (input->wait_data_sec_len > 0)
|
||||
fscanf(file, "wait_data_sec:%[^\n]\n", input->wait_data_sec);
|
||||
else
|
||||
fscanf(file, "%[^\n]\n", null_char);
|
||||
@@ -48,17 +48,17 @@ void load_data(FILE *file,
|
||||
fscanf(file, "elementary_stream:%d\n", &input->elementary_stream);
|
||||
fscanf(file, "is_assume_mpeg:%d\n", &input->is_assume_mpeg);
|
||||
fscanf(file, "stream_type_len:%d\n", &input->stream_type_len);
|
||||
if( input->stream_type_len > 0)
|
||||
if (input->stream_type_len > 0)
|
||||
fscanf(file, "stream_type:%[^\n]\n", input->stream_type);
|
||||
else
|
||||
fscanf(file, "%[^\n]\n", null_char);
|
||||
fscanf(file, "stream_pid_len:%d\n", &input->stream_pid_len);
|
||||
if(input->stream_pid_len > 0)
|
||||
if (input->stream_pid_len > 0)
|
||||
fscanf(file, "stream_pid:%[^\n]\n", input->stream_pid);
|
||||
else
|
||||
fscanf(file, "%[^\n]\n", null_char);
|
||||
fscanf(file, "mpeg_type_len:%d\n", &input->mpeg_type_len);
|
||||
if(input->mpeg_type_len > 0)
|
||||
if (input->mpeg_type_len > 0)
|
||||
fscanf(file, "mpeg_type:%[^\n]\n", input->mpeg_type);
|
||||
else
|
||||
fscanf(file, "%[^\n]\n", null_char);
|
||||
@@ -66,7 +66,7 @@ void load_data(FILE *file,
|
||||
fscanf(file, "teletext_decoder:%d\n", &input->teletext_decoder);
|
||||
fscanf(file, "is_process_teletext_page:%d\n", &input->is_process_teletext_page);
|
||||
fscanf(file, "teletext_page_number_len:%d\n", &input->teletext_page_numer_len);
|
||||
if(input->teletext_page_numer_len)
|
||||
if (input->teletext_page_numer_len)
|
||||
fscanf(file, "teletext_page_number:%[^\n]\n", input->teletext_page_number);
|
||||
else
|
||||
fscanf(file, "%[^\n]\n", null_char);
|
||||
@@ -79,7 +79,7 @@ void load_data(FILE *file,
|
||||
fscanf(file, "is_multiple_program:%d\n", &advanced_input->is_multiple_program);
|
||||
fscanf(file, "multiple_program:%d\n", &advanced_input->multiple_program);
|
||||
fscanf(file, "prog_number_len:%d\n", &advanced_input->prog_number_len);
|
||||
if(advanced_input->prog_number_len)
|
||||
if (advanced_input->prog_number_len)
|
||||
fscanf(file, "prog_number:%[^\n]\n", advanced_input->prog_number);
|
||||
else
|
||||
fscanf(file, "%[^\n]\n", null_char);
|
||||
@@ -97,7 +97,7 @@ void load_data(FILE *file,
|
||||
fscanf(file, "type_select:%d\n", &output->type_select);
|
||||
fscanf(file, "is_filename:%d\n", &output->is_filename);
|
||||
fscanf(file, "filename_len:%d\n", &output->filename_len);
|
||||
if(output->filename_len > 0)
|
||||
if (output->filename_len > 0)
|
||||
fscanf(file, "filename:%[^\n]\n", output->filename);
|
||||
else
|
||||
fscanf(file, "%[^\n]\n", null_char);
|
||||
@@ -137,24 +137,23 @@ void load_data(FILE *file,
|
||||
fscanf(file, "channel:%d\n", &decoders->channel);
|
||||
fscanf(file, "is_708:%d\n", &decoders->is_708);
|
||||
fscanf(file, "services_len:%d\n", &decoders->services_len);
|
||||
if(decoders->services_len > 0)
|
||||
if (decoders->services_len > 0)
|
||||
fscanf(file, "services:%[^\n]\n", decoders->services);
|
||||
else
|
||||
fscanf(file, "%[^\n]\n", null_char);
|
||||
|
||||
fscanf(file, "teletext_dvb:%d\n", &decoders->teletext_dvb);
|
||||
fscanf(file, "min_distance_len:%d\n", &decoders->min_distance_len);
|
||||
if(decoders->min_distance_len > 0)
|
||||
if (decoders->min_distance_len > 0)
|
||||
fscanf(file, "min_distance:%[^\n]\n", decoders->min_distance);
|
||||
else
|
||||
fscanf(file, "%[^\n]\n", null_char);
|
||||
fscanf(file, "max_distance_len:%d\n", &decoders->max_distance_len);
|
||||
if(decoders->max_distance_len > 0)
|
||||
if (decoders->max_distance_len > 0)
|
||||
fscanf(file, "max_distance:%[^\n]\n", decoders->max_distance);
|
||||
else
|
||||
fscanf(file, "%[^\n]\n", null_char);
|
||||
|
||||
|
||||
//Read credits tab data
|
||||
fscanf(file, "is_start_text:%d\n", &credits->is_start_text);
|
||||
|
||||
@@ -163,25 +162,25 @@ void load_data(FILE *file,
|
||||
fscanf(file, "before_time_buffer:%[^\n]\n", credits->before_time_buffer);
|
||||
fscanf(file, "after_time_buffer:%[^\n]\n", credits->after_time_buffer);
|
||||
fscanf(file, "start_atmost_sec_len:%d\n", &credits->start_atmost_sec_len);
|
||||
if(credits->start_atmost_sec_len > 0)
|
||||
if (credits->start_atmost_sec_len > 0)
|
||||
fscanf(file, "start_atmost_sec:%[^\n]\n", credits->start_atmost_sec);
|
||||
else
|
||||
fscanf(file, "%[^\n]\n", null_char);
|
||||
fscanf(file, "start_atleast_sec_len:%d\n", &credits->start_atleast_sec_len);
|
||||
if(credits->start_atleast_sec_len > 0)
|
||||
if (credits->start_atleast_sec_len > 0)
|
||||
fscanf(file, "start_atleast_sec:%[^\n]\n", credits->start_atleast_sec);
|
||||
else
|
||||
fscanf(file, "%[^\n]\n",null_char);
|
||||
fscanf(file, "%[^\n]\n", null_char);
|
||||
|
||||
fscanf(file, "is_end_text:%d\n", &credits->is_end_text);
|
||||
fscanf(file, "end_atmost_sec_len:%d\n", &credits->end_atmost_sec_len);
|
||||
if(credits->end_atmost_sec_len > 0)
|
||||
if (credits->end_atmost_sec_len > 0)
|
||||
fscanf(file, "end_atmost_sec:%[^\n]\n", credits->end_atmost_sec);
|
||||
else
|
||||
fscanf(file, "%[^\n]\n", null_char);
|
||||
|
||||
fscanf(file, "end_atleast_sec_len:%d\n", &credits->end_atleast_sec_len);
|
||||
if(credits->end_atleast_sec_len > 0)
|
||||
if (credits->end_atleast_sec_len > 0)
|
||||
fscanf(file, "end_atleast_sec:%[^\n]\n", credits->end_atleast_sec);
|
||||
else
|
||||
fscanf(file, "%[^\n]\n", null_char);
|
||||
@@ -190,11 +189,10 @@ void load_data(FILE *file,
|
||||
fscanf(file, "end_text_len:%d\n", &credits->end_text_len);
|
||||
read_credits(file, credits);
|
||||
|
||||
|
||||
//Read debug tab data
|
||||
fscanf(file, "is_elementary_stream:%d\n", &debug->is_elementary_stream);
|
||||
fscanf(file, "elementary_stream_len:%d\n", &debug->elementary_stream_len);
|
||||
if(debug->elementary_stream_len > 0)
|
||||
if (debug->elementary_stream_len > 0)
|
||||
fscanf(file, "elementary_stream:%[^\n]\n", debug->elementary_stream);
|
||||
else
|
||||
fscanf(file, "%[^\n]\n", null_char);
|
||||
@@ -216,51 +214,49 @@ void load_data(FILE *file,
|
||||
|
||||
//Read HD Homerun Tab data
|
||||
fscanf(file, "location_len:%d\n", &hd_homerun->location_len);
|
||||
if(hd_homerun->location_len > 0)
|
||||
if (hd_homerun->location_len > 0)
|
||||
fscanf(file, "location:%[^\n]\n", hd_homerun->location);
|
||||
else
|
||||
fscanf(file, "%[^\n]\n", null_char);
|
||||
fscanf(file, "tuner_len:%d\n", &hd_homerun->tuner_len);
|
||||
if(hd_homerun->tuner_len >0)
|
||||
if (hd_homerun->tuner_len > 0)
|
||||
fscanf(file, "tuner:%[^\n]\n", hd_homerun->tuner);
|
||||
else
|
||||
fscanf(file, "%[^\n]\n", null_char);
|
||||
fscanf(file, "channel_len:%d\n", &hd_homerun->channel_len);
|
||||
if(hd_homerun->channel_len > 0)
|
||||
if (hd_homerun->channel_len > 0)
|
||||
fscanf(file, "channel:%[^\n]\n", hd_homerun->channel);
|
||||
else
|
||||
fscanf(file, "%[^\n]\n", null_char);
|
||||
fscanf(file, "program_len:%d\n", &hd_homerun->program_len);
|
||||
if(hd_homerun->program_len > 0)
|
||||
if (hd_homerun->program_len > 0)
|
||||
fscanf(file, "program:%[^\n]\n", hd_homerun->program);
|
||||
else
|
||||
fscanf(file, "%[^\n]\n", null_char);
|
||||
fscanf(file, "ipv4_address_len:%d\n", &hd_homerun->ipv4_address_len);
|
||||
if(hd_homerun->ipv4_address_len > 0)
|
||||
if (hd_homerun->ipv4_address_len > 0)
|
||||
fscanf(file, "ipv4_address:%[^\n]\n", hd_homerun->ipv4_address);
|
||||
else
|
||||
fscanf(file, "%[^\n]\n", null_char);
|
||||
fscanf(file, "port_number_len:%d\n", &hd_homerun->port_number_len);
|
||||
if(hd_homerun->port_number_len > 0)
|
||||
if (hd_homerun->port_number_len > 0)
|
||||
fscanf(file, "port_number:%[^\n]\n", hd_homerun->port_number);
|
||||
else
|
||||
fscanf(file, "%[^\n]\n", null_char);
|
||||
|
||||
|
||||
|
||||
//Read Burned Subs tab data
|
||||
fscanf(file, "is_burnded_subs:%d\n", &burned_subs->is_burned_subs);
|
||||
fscanf(file, "color_type:%d\n", &burned_subs->color_type);
|
||||
fscanf(file, "sub_color_select:%d\n", &burned_subs->subs_color_select);
|
||||
fscanf(file, "custom_hue_len:%d\n", &burned_subs->custom_hue_len);
|
||||
if(burned_subs->custom_hue_len > 0)
|
||||
if (burned_subs->custom_hue_len > 0)
|
||||
fscanf(file, "custom_hue:%[^\n]\n", burned_subs->custom_hue);
|
||||
else
|
||||
fscanf(file, "%[^\n]\n", null_char);
|
||||
|
||||
fscanf(file, "ocr_mode:%d\n", &burned_subs->ocr_mode);
|
||||
fscanf(file, "min_duration_len:%d\n", &burned_subs->min_duration_len);
|
||||
if(burned_subs->min_duration_len > 0)
|
||||
if (burned_subs->min_duration_len > 0)
|
||||
fscanf(file, "min_duration:%[^\n]\n", burned_subs->min_duration);
|
||||
else
|
||||
fscanf(file, "%[^\n]\n", null_char);
|
||||
@@ -291,22 +287,22 @@ void load_data(FILE *file,
|
||||
else
|
||||
fscanf(file, "send_port:%[^\n]\n", null_char);
|
||||
fscanf(file, "send_host_len:%d\n", &network_settings->send_host_len);
|
||||
if(network_settings->send_host_len > 0)
|
||||
if (network_settings->send_host_len > 0)
|
||||
fscanf(file, "send_host:%[^\n]\n", network_settings->send_host);
|
||||
fscanf(file, "send_host:%[^\n]\n", null_char);
|
||||
}
|
||||
|
||||
void save_data(FILE *file,
|
||||
struct main_tab* main_settings,
|
||||
struct input_tab* input,
|
||||
struct advanced_input_tab* advanced_input,
|
||||
struct output_tab* output,
|
||||
struct decoders_tab* decoders,
|
||||
struct credits_tab* credits,
|
||||
struct debug_tab* debug,
|
||||
struct hd_homerun_tab* hd_homerun,
|
||||
struct burned_subs_tab* burned_subs,
|
||||
struct network_popup* network_settings)
|
||||
struct main_tab *main_settings,
|
||||
struct input_tab *input,
|
||||
struct advanced_input_tab *advanced_input,
|
||||
struct output_tab *output,
|
||||
struct decoders_tab *decoders,
|
||||
struct credits_tab *credits,
|
||||
struct debug_tab *debug,
|
||||
struct hd_homerun_tab *hd_homerun,
|
||||
struct burned_subs_tab *burned_subs,
|
||||
struct network_popup *network_settings)
|
||||
{
|
||||
//Write main_tab data
|
||||
fprintf(file, "port_or_files:%d\n", main_settings->port_or_files);
|
||||
@@ -401,7 +397,6 @@ void save_data(FILE *file,
|
||||
fprintf(file, "max_distance_len:%d\n", decoders->max_distance_len);
|
||||
fprintf(file, "max_distance:%s\n", decoders->max_distance);
|
||||
|
||||
|
||||
//Write credits tab data
|
||||
fprintf(file, "is_start_text:%d\n", credits->is_start_text);
|
||||
|
||||
@@ -423,7 +418,6 @@ void save_data(FILE *file,
|
||||
fprintf(file, "end_text_len:%d\n", credits->end_text_len);
|
||||
write_credits(file, credits);
|
||||
|
||||
|
||||
//Write debug tab data
|
||||
fprintf(file, "is_elementary_stream:%d\n", debug->is_elementary_stream);
|
||||
fprintf(file, "elementary_stream_len:%d\n", debug->elementary_stream_len);
|
||||
@@ -458,8 +452,6 @@ void save_data(FILE *file,
|
||||
fprintf(file, "port_number_len:%d\n", hd_homerun->port_number_len);
|
||||
fprintf(file, "port_number:%s\n", hd_homerun->port_number);
|
||||
|
||||
|
||||
|
||||
//Write Burned Subs tab data
|
||||
fprintf(file, "is_burnded_subs:%d\n", burned_subs->is_burned_subs);
|
||||
fprintf(file, "color_type:%d\n", burned_subs->color_type);
|
||||
@@ -488,56 +480,55 @@ void save_data(FILE *file,
|
||||
fprintf(file, "send_port:%s\n", network_settings->send_port);
|
||||
fprintf(file, "send_host_len:%d\n", network_settings->send_host_len);
|
||||
fprintf(file, "send_host:%s\n", network_settings->send_host);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void write_credits(FILE* file, struct credits_tab* credits)
|
||||
void write_credits(FILE *file, struct credits_tab *credits)
|
||||
{
|
||||
//Number of newlines in end_text
|
||||
static int newlines_end;
|
||||
//Number of newlines in start_text
|
||||
static int newlines_start;
|
||||
int newline_char = 10; // '\n' is 10 in ascii encoding
|
||||
for(int i = 0; i < credits->start_text_len; i++)
|
||||
for (int i = 0; i < credits->start_text_len; i++)
|
||||
{
|
||||
if(credits->start_text[i] == newline_char)
|
||||
if (credits->start_text[i] == newline_char)
|
||||
newlines_start++;
|
||||
}
|
||||
|
||||
for(int i = 0; i < credits->end_text_len; i++)
|
||||
for (int i = 0; i < credits->end_text_len; i++)
|
||||
{
|
||||
if(credits->end_text[i] == newline_char)
|
||||
if (credits->end_text[i] == newline_char)
|
||||
newlines_end++;
|
||||
}
|
||||
|
||||
fprintf(file, "start_text:%d\n", newlines_start);
|
||||
if(credits->start_text_len > 0)
|
||||
if (credits->start_text_len > 0)
|
||||
fprintf(file, "%s\n", credits->start_text);
|
||||
fprintf(file, "end_text:%d\n", newlines_end);
|
||||
if(credits->end_text_len > 0)
|
||||
if (credits->end_text_len > 0)
|
||||
fprintf(file, "%s\n", credits->end_text);
|
||||
}
|
||||
|
||||
void read_credits(FILE* file, struct credits_tab* credits)
|
||||
void read_credits(FILE *file, struct credits_tab *credits)
|
||||
{
|
||||
//Number of newlines in end_text
|
||||
static int newlines_end;
|
||||
//Number of newlines in start_text
|
||||
static int newlines_start;
|
||||
static char buffer[1000], null_char[260];
|
||||
if(credits->start_text_len == 0)
|
||||
if (credits->start_text_len == 0)
|
||||
fscanf(file, "%[^\n]\n", null_char);
|
||||
else
|
||||
{
|
||||
fscanf(file, "start_text:%d\n", &newlines_start);
|
||||
for(int i = 0; i != newlines_start + 1; i++)
|
||||
for (int i = 0; i != newlines_start + 1; i++)
|
||||
{
|
||||
static char line[200];
|
||||
fscanf(file, "%[^\n]\n", line);
|
||||
if(!(i == newlines_start))
|
||||
if (!(i == newlines_start))
|
||||
strcat(line, "\n");
|
||||
if(strlen(buffer) > 0)
|
||||
if (strlen(buffer) > 0)
|
||||
strcat(buffer, line);
|
||||
else
|
||||
strcpy(buffer, line);
|
||||
@@ -548,18 +539,18 @@ void read_credits(FILE* file, struct credits_tab* credits)
|
||||
memset(buffer, 0, sizeof(buffer));
|
||||
}
|
||||
|
||||
if(credits->end_text_len == 0)
|
||||
if (credits->end_text_len == 0)
|
||||
fscanf(file, "%[^\n]\n", null_char);
|
||||
else
|
||||
{
|
||||
fscanf(file, "end_text:%d\n", &newlines_end);
|
||||
for(int i = 0; i != newlines_end + 1; i++)
|
||||
for (int i = 0; i != newlines_end + 1; i++)
|
||||
{
|
||||
static char line[200];
|
||||
fscanf(file, "%[^\n]\n", line);
|
||||
if(!(i == newlines_end))
|
||||
if (!(i == newlines_end))
|
||||
strcat(line, "\n");
|
||||
if(strlen(buffer) > 0)
|
||||
if (strlen(buffer) > 0)
|
||||
strcat(buffer, line);
|
||||
else
|
||||
strcpy(buffer, line);
|
||||
@@ -567,6 +558,4 @@ void read_credits(FILE* file, struct credits_tab* credits)
|
||||
memset(credits->end_text, 0, sizeof(credits->end_text));
|
||||
strcpy(credits->end_text, buffer);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
345
src/GUI/tabs.c
@@ -36,7 +36,7 @@ void setup_output_tab(struct output_tab *output)
|
||||
//Encoding
|
||||
output->encoding = UTF;
|
||||
output->is_bom = nk_false;
|
||||
|
||||
|
||||
//Capitalization
|
||||
output->is_cap_standard = nk_false;
|
||||
output->is_cap_file = nk_false;
|
||||
@@ -55,7 +55,7 @@ void setup_output_tab(struct output_tab *output)
|
||||
//Roll-up Captions
|
||||
output->onetime_or_realtime = ONETIME;
|
||||
output->roll_limit_select = 0;
|
||||
output->roll_limit = (char**)malloc(4 * sizeof(char *));
|
||||
output->roll_limit = (char **)malloc(4 * sizeof(char *));
|
||||
output->roll_limit[0] = "No Limit";
|
||||
output->roll_limit[1] = "1 Line";
|
||||
output->roll_limit[2] = "2 Lines";
|
||||
@@ -176,14 +176,13 @@ void setup_credits_tab(struct credits_tab *credits)
|
||||
credits->end_atleast_sec_len = strlen(credits->end_atleast_sec);
|
||||
strcpy(credits->end_atmost_sec, "3");
|
||||
credits->end_atmost_sec_len = strlen(credits->end_atmost_sec);
|
||||
|
||||
}
|
||||
|
||||
void setup_hd_homerun_tab(struct hd_homerun_tab *hd_homerun)
|
||||
{
|
||||
hd_homerun->is_homerun_browser_active = nk_false;
|
||||
hd_homerun->location_len = 0;
|
||||
hd_homerun->devices = (char**)malloc(3 * sizeof(char *));
|
||||
hd_homerun->devices = (char **)malloc(3 * sizeof(char *));
|
||||
hd_homerun->device_num = 0;
|
||||
strcpy(hd_homerun->tuner, "0");
|
||||
hd_homerun->tuner_len = strlen(hd_homerun->tuner);
|
||||
@@ -194,7 +193,7 @@ void setup_hd_homerun_tab(struct hd_homerun_tab *hd_homerun)
|
||||
void setup_burned_subs_tab(struct burned_subs_tab *burned_subs)
|
||||
{
|
||||
burned_subs->is_burned_subs = nk_false;
|
||||
burned_subs->subs_color = (char**)malloc(7 * sizeof(char *));
|
||||
burned_subs->subs_color = (char **)malloc(7 * sizeof(char *));
|
||||
burned_subs->subs_color[0] = "white";
|
||||
burned_subs->subs_color[1] = "yellow";
|
||||
burned_subs->subs_color[2] = "green";
|
||||
@@ -211,21 +210,20 @@ void setup_burned_subs_tab(struct burned_subs_tab *burned_subs)
|
||||
burned_subs->is_italic = nk_false;
|
||||
}
|
||||
|
||||
|
||||
/*Tab specific functions*/
|
||||
void draw_input_tab(struct nk_context *ctx, int *tab_screen_height, struct input_tab *input,
|
||||
struct decoders_tab *decoders)
|
||||
struct decoders_tab *decoders)
|
||||
{
|
||||
const float screenful_limit_ratio[] = { 0.47f, 0.3f };
|
||||
const float screenful_limit_ratio[] = {0.47f, 0.3f};
|
||||
static struct time from_time, until_time;
|
||||
const float stream_type_pid_ratio[] = { 0.7f,0.3f };
|
||||
const float mpeg_type_ratio[] = { 0.7f,0.3f };
|
||||
const float teletext_page_ratio[] = { 0.75f,0.25f };
|
||||
const float stream_teletext_ratio[] = { 0.5f, 0.501f };
|
||||
const float wait_data_ratio[] = { 0.6f, 0.25f, 0.15f };
|
||||
const float gen_type_ratio[] = { 0.3f, 0.7f };
|
||||
const float gen_time_ratio[] = { 0.6f ,0.401f};
|
||||
const char *split_type[] = { "Individual Files", "Parts of same video. Cut by generic tool", "Parts of same video. Cut by video tool" };
|
||||
const float stream_type_pid_ratio[] = {0.7f, 0.3f};
|
||||
const float mpeg_type_ratio[] = {0.7f, 0.3f};
|
||||
const float teletext_page_ratio[] = {0.75f, 0.25f};
|
||||
const float stream_teletext_ratio[] = {0.5f, 0.501f};
|
||||
const float wait_data_ratio[] = {0.6f, 0.25f, 0.15f};
|
||||
const float gen_type_ratio[] = {0.3f, 0.7f};
|
||||
const float gen_time_ratio[] = {0.6f, 0.401f};
|
||||
const char *split_type[] = {"Individual Files", "Parts of same video. Cut by generic tool", "Parts of same video. Cut by video tool"};
|
||||
static int split_num;
|
||||
*tab_screen_height = 472;
|
||||
|
||||
@@ -262,7 +260,8 @@ void draw_input_tab(struct nk_context *ctx, int *tab_screen_height, struct input
|
||||
nk_checkbox_label(ctx, "Process From: (HH:MM:SS)", &input->is_process_from);
|
||||
nk_layout_row_dynamic(ctx, 25, 1);
|
||||
|
||||
if (nk_combo_begin_label(ctx, input->from_time_buffer, nk_vec2(180, 250))) {
|
||||
if (nk_combo_begin_label(ctx, input->from_time_buffer, nk_vec2(180, 250)))
|
||||
{
|
||||
sprintf(input->from_time_buffer, "%02d:%02d:%02d", from_time.hours, from_time.minutes, from_time.seconds);
|
||||
nk_layout_row_dynamic(ctx, 25, 1);
|
||||
from_time.seconds = nk_propertyi(ctx, "#Seconds:", 0, from_time.seconds, 60, 1, 1);
|
||||
@@ -271,13 +270,13 @@ void draw_input_tab(struct nk_context *ctx, int *tab_screen_height, struct input
|
||||
nk_combo_end(ctx);
|
||||
}
|
||||
|
||||
|
||||
//Process Until
|
||||
nk_layout_row_dynamic(ctx, 20, 1);
|
||||
nk_checkbox_label(ctx, "Process Until: (HH:MM:SS)", &input->is_process_until);
|
||||
nk_layout_row_dynamic(ctx, 25, 1);
|
||||
|
||||
if (nk_combo_begin_label(ctx, input->until_time_buffer, nk_vec2(180, 250))) {
|
||||
if (nk_combo_begin_label(ctx, input->until_time_buffer, nk_vec2(180, 250)))
|
||||
{
|
||||
sprintf(input->until_time_buffer, "%02d:%02d:%02d", until_time.hours, until_time.minutes, until_time.seconds);
|
||||
nk_layout_row_dynamic(ctx, 25, 1);
|
||||
until_time.seconds = nk_propertyi(ctx, "#Seconds:", 0, until_time.seconds, 60, 1, 1);
|
||||
@@ -294,17 +293,20 @@ void draw_input_tab(struct nk_context *ctx, int *tab_screen_height, struct input
|
||||
if (nk_group_begin(ctx, "Elementary Stream", NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_TITLE | NK_WINDOW_BORDER))
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 20, 1);
|
||||
if (nk_option_label(ctx, "Auto", input->elementary_stream == AUTO_DETECT)) {
|
||||
if (nk_option_label(ctx, "Auto", input->elementary_stream == AUTO_DETECT))
|
||||
{
|
||||
input->elementary_stream = AUTO_DETECT;
|
||||
}
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 25, 2, stream_type_pid_ratio);
|
||||
if (nk_option_label(ctx, "Process stream of type:", input->elementary_stream == STREAM_TYPE)) {
|
||||
if (nk_option_label(ctx, "Process stream of type:", input->elementary_stream == STREAM_TYPE))
|
||||
{
|
||||
input->elementary_stream = STREAM_TYPE;
|
||||
}
|
||||
nk_edit_string(ctx, NK_EDIT_SIMPLE, input->stream_type, &input->stream_type_len, 9, nk_filter_decimal);
|
||||
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 25, 2, stream_type_pid_ratio);
|
||||
if (nk_option_label(ctx, "Process stream with PID:", input->elementary_stream == STREAM_PID)) {
|
||||
if (nk_option_label(ctx, "Process stream with PID:", input->elementary_stream == STREAM_PID))
|
||||
{
|
||||
input->elementary_stream = STREAM_PID;
|
||||
}
|
||||
nk_edit_string(ctx, NK_EDIT_SIMPLE, input->stream_pid, &input->stream_pid_len, 9, nk_filter_decimal);
|
||||
@@ -313,7 +315,7 @@ void draw_input_tab(struct nk_context *ctx, int *tab_screen_height, struct input
|
||||
nk_checkbox_label(ctx, "Assume MPEG type is:", &input->is_assume_mpeg);
|
||||
nk_edit_string(ctx, NK_EDIT_SIMPLE, input->mpeg_type, &input->mpeg_type_len, 9, nk_filter_decimal);
|
||||
|
||||
if(input->teletext_decoder == FORCE)
|
||||
if (input->teletext_decoder == FORCE)
|
||||
{
|
||||
input->elementary_stream = STREAM_PID;
|
||||
}
|
||||
@@ -323,22 +325,26 @@ void draw_input_tab(struct nk_context *ctx, int *tab_screen_height, struct input
|
||||
//Teletext Group
|
||||
if (nk_group_begin(ctx, "Teletext", NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_TITLE | NK_WINDOW_BORDER))
|
||||
{
|
||||
if(decoders->teletext_dvb == DVB){
|
||||
if (decoders->teletext_dvb == DVB)
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 40, 1);
|
||||
nk_label_colored_wrap(ctx, "Teletext is disabled in Decoders->Teletext or DVB.", nk_rgb(255, 56, 38));
|
||||
}
|
||||
else
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 20, 1);
|
||||
if (nk_option_label(ctx, "Auto", input->teletext_decoder == AUTO_DECODE)) {
|
||||
if (nk_option_label(ctx, "Auto", input->teletext_decoder == AUTO_DECODE))
|
||||
{
|
||||
input->teletext_decoder = AUTO_DECODE;
|
||||
}
|
||||
nk_layout_row_dynamic(ctx, 25, 1);
|
||||
if (nk_option_label(ctx, "Force Teletext decoder", input->teletext_decoder == FORCE)) {
|
||||
if (nk_option_label(ctx, "Force Teletext decoder", input->teletext_decoder == FORCE))
|
||||
{
|
||||
input->teletext_decoder = FORCE;
|
||||
}
|
||||
nk_layout_row_dynamic(ctx, 25, 1);
|
||||
if (nk_option_label(ctx, "Disable Teletext decoder", input->teletext_decoder == DISABLE)) {
|
||||
if (nk_option_label(ctx, "Disable Teletext decoder", input->teletext_decoder == DISABLE))
|
||||
{
|
||||
input->teletext_decoder = DISABLE;
|
||||
}
|
||||
|
||||
@@ -350,26 +356,24 @@ void draw_input_tab(struct nk_context *ctx, int *tab_screen_height, struct input
|
||||
nk_group_end(ctx);
|
||||
}
|
||||
|
||||
|
||||
//Screenfuls limit group
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 95, 2, stream_teletext_ratio);
|
||||
if (nk_group_begin(ctx, "'Screenfuls' limit", NK_WINDOW_BORDER | NK_WINDOW_TITLE | NK_WINDOW_NO_SCROLLBAR))
|
||||
{
|
||||
int screenful_limits = atoi(input->screenful_limit_buffer);
|
||||
|
||||
|
||||
nk_layout_row_dynamic(ctx, 20, 1);
|
||||
if (nk_option_label(ctx, "No limit", input->is_limit == NO_LIMIT))
|
||||
{
|
||||
input->is_limit = NO_LIMIT;
|
||||
}
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 25, 2, screenful_limit_ratio);
|
||||
if (nk_option_label(ctx, "Screenful Limit:", input->is_limit == LIMITED)) {
|
||||
if (nk_option_label(ctx, "Screenful Limit:", input->is_limit == LIMITED))
|
||||
{
|
||||
input->is_limit = LIMITED;
|
||||
}
|
||||
screenful_limits = nk_propertyi(ctx, "", 0, screenful_limits, 999, 1, 1);
|
||||
sprintf(input->screenful_limit_buffer, "%d", screenful_limits);
|
||||
|
||||
|
||||
|
||||
nk_group_end(ctx);
|
||||
}
|
||||
@@ -382,10 +386,12 @@ void draw_input_tab(struct nk_context *ctx, int *tab_screen_height, struct input
|
||||
{
|
||||
input->clock_input = AUTO;
|
||||
}
|
||||
if (nk_option_label(ctx, "GOP", input->clock_input == GOP)) {
|
||||
if (nk_option_label(ctx, "GOP", input->clock_input == GOP))
|
||||
{
|
||||
input->clock_input = GOP;
|
||||
}
|
||||
if (nk_option_label(ctx, "PTS", input->clock_input == PTS)) {
|
||||
if (nk_option_label(ctx, "PTS", input->clock_input == PTS))
|
||||
{
|
||||
input->clock_input = PTS;
|
||||
}
|
||||
nk_group_end(ctx);
|
||||
@@ -395,24 +401,24 @@ void draw_input_tab(struct nk_context *ctx, int *tab_screen_height, struct input
|
||||
void draw_advanced_input_tab(struct nk_context *ctx, int *tab_screen_height, struct advanced_input_tab *advanced_input)
|
||||
{
|
||||
*tab_screen_height = 472;
|
||||
const float prog_myth_ratio[] = { 0.5f, 0.5f };
|
||||
const float prog_num_ratio[] = { 0.67f, 0.03f, 0.3f };
|
||||
const float prog_myth_ratio[] = {0.5f, 0.5f};
|
||||
const float prog_num_ratio[] = {0.67f, 0.03f, 0.3f};
|
||||
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 125, 2, prog_myth_ratio);
|
||||
|
||||
//Multiple Programs Group
|
||||
if(nk_group_begin(ctx, "Multiple Programs", NK_WINDOW_BORDER|NK_WINDOW_NO_SCROLLBAR|NK_WINDOW_TITLE))
|
||||
if (nk_group_begin(ctx, "Multiple Programs", NK_WINDOW_BORDER | NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_TITLE))
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 25, 1);
|
||||
nk_checkbox_label(ctx, "File contains multiple programs", &advanced_input->is_multiple_program);
|
||||
|
||||
nk_layout_row_dynamic(ctx, 20, 1);
|
||||
if(nk_option_label(ctx, "Process first suitable program", advanced_input->multiple_program == FIRST_PROG))
|
||||
if (nk_option_label(ctx, "Process first suitable program", advanced_input->multiple_program == FIRST_PROG))
|
||||
{
|
||||
advanced_input->multiple_program = FIRST_PROG;
|
||||
}
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 25, 3, prog_num_ratio);
|
||||
if(nk_option_label(ctx, "Process program with #", advanced_input->multiple_program == PROG_NUM))
|
||||
if (nk_option_label(ctx, "Process program with #", advanced_input->multiple_program == PROG_NUM))
|
||||
{
|
||||
advanced_input->multiple_program = PROG_NUM;
|
||||
}
|
||||
@@ -423,22 +429,22 @@ void draw_advanced_input_tab(struct nk_context *ctx, int *tab_screen_height, str
|
||||
}
|
||||
|
||||
//Myth TV group
|
||||
if(nk_group_begin(ctx, "Myth TV", NK_WINDOW_TITLE|NK_WINDOW_BORDER|NK_WINDOW_NO_SCROLLBAR))
|
||||
if (nk_group_begin(ctx, "Myth TV", NK_WINDOW_TITLE | NK_WINDOW_BORDER | NK_WINDOW_NO_SCROLLBAR))
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 20, 1);
|
||||
if(nk_option_label(ctx, "Auto", advanced_input->set_myth == AUTO_MYTH))
|
||||
if (nk_option_label(ctx, "Auto", advanced_input->set_myth == AUTO_MYTH))
|
||||
{
|
||||
advanced_input->set_myth = AUTO_MYTH;
|
||||
}
|
||||
|
||||
nk_layout_row_dynamic(ctx, 20, 1);
|
||||
if(nk_option_label(ctx, "Force usage of Myth TV decoder", advanced_input->set_myth == FORCE_MYTH))
|
||||
if (nk_option_label(ctx, "Force usage of Myth TV decoder", advanced_input->set_myth == FORCE_MYTH))
|
||||
{
|
||||
advanced_input->set_myth = FORCE_MYTH;
|
||||
}
|
||||
|
||||
nk_layout_row_dynamic(ctx, 20, 1);
|
||||
if(nk_option_label(ctx, "Disable Myth TV decoder", advanced_input->set_myth == DISABLE_MYTH))
|
||||
if (nk_option_label(ctx, "Disable Myth TV decoder", advanced_input->set_myth == DISABLE_MYTH))
|
||||
{
|
||||
advanced_input->set_myth = DISABLE_MYTH;
|
||||
}
|
||||
@@ -448,7 +454,7 @@ void draw_advanced_input_tab(struct nk_context *ctx, int *tab_screen_height, str
|
||||
|
||||
//Miscellaneous group
|
||||
nk_layout_row_dynamic(ctx, 210, 1);
|
||||
if(nk_group_begin(ctx, "Miscellaneous", NK_WINDOW_TITLE|NK_WINDOW_BORDER|NK_WINDOW_NO_SCROLLBAR))
|
||||
if (nk_group_begin(ctx, "Miscellaneous", NK_WINDOW_TITLE | NK_WINDOW_BORDER | NK_WINDOW_NO_SCROLLBAR))
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 20, 1);
|
||||
nk_checkbox_label(ctx, "Use 90090 as MPEG clock frequency instead of 90000 (needed for some DVDs", &advanced_input->is_mpeg_90090);
|
||||
@@ -465,36 +471,35 @@ void draw_advanced_input_tab(struct nk_context *ctx, int *tab_screen_height, str
|
||||
nk_layout_row_dynamic(ctx, 20, 1);
|
||||
nk_checkbox_label(ctx, "Ignore broadcast date info (only affects Teletext in timed transcript with -datets)", &advanced_input->is_ignore_broadcast);
|
||||
|
||||
|
||||
nk_group_end(ctx);
|
||||
}
|
||||
}
|
||||
|
||||
void draw_output_tab(struct nk_context *ctx, int *tab_screen_height, struct output_tab *output, struct main_tab *main_settings)
|
||||
{
|
||||
const float roll_limit_ratio[] = { 0.55f, 0.45f };
|
||||
const float roll_limit_ratio[] = {0.55f, 0.45f};
|
||||
nk_flags active;
|
||||
static int len;
|
||||
static int cap_len;
|
||||
static int color_len = 6;
|
||||
const float gen_enc_ratio[] = { 0.701f, 0.302f };
|
||||
const float type_ratio[] = { 0.3f,0.7f };
|
||||
const float out_file_ratio[] = { 0.3f,0.53f,0.17f };
|
||||
const float cap_file_ratio[] = { 0.2f,0.63f,0.17f };
|
||||
const float delay_ratio[] = { 0.5f, 0.2f, 0.3f };
|
||||
const float color_roll_ratio[] = { 0.6f,0.401f };
|
||||
const float color_check_ratio[] = { 0.6f,0.23f,0.07f,0.1f };
|
||||
const float gen_enc_ratio[] = {0.701f, 0.302f};
|
||||
const float type_ratio[] = {0.3f, 0.7f};
|
||||
const float out_file_ratio[] = {0.3f, 0.53f, 0.17f};
|
||||
const float cap_file_ratio[] = {0.2f, 0.63f, 0.17f};
|
||||
const float delay_ratio[] = {0.5f, 0.2f, 0.3f};
|
||||
const float color_roll_ratio[] = {0.6f, 0.401f};
|
||||
const float color_check_ratio[] = {0.6f, 0.23f, 0.07f, 0.1f};
|
||||
*tab_screen_height = 472;
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 160, 2, gen_enc_ratio);
|
||||
|
||||
//General Group
|
||||
if (nk_group_begin(ctx, "General", NK_WINDOW_TITLE |NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_BORDER))
|
||||
if (nk_group_begin(ctx, "General", NK_WINDOW_TITLE | NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_BORDER))
|
||||
{
|
||||
int delay_secs = atoi(output->delay_sec_buffer);
|
||||
//Output Type
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 20, 2, type_ratio);
|
||||
nk_label(ctx, "Output Type:", NK_TEXT_LEFT);
|
||||
output->type_select = nk_combo(ctx, output->type, 13, output->type_select, 25, nk_vec2(225, 200));
|
||||
output->type_select = nk_combo(ctx, output->type, 13, output->type_select, 25, nk_vec2(225, 200));
|
||||
|
||||
//Output File
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 25, 3, out_file_ratio);
|
||||
@@ -512,7 +517,7 @@ void draw_output_tab(struct nk_context *ctx, int *tab_screen_height, struct outp
|
||||
delay_secs = nk_propertyi(ctx, "", 0, delay_secs, 1000, 1, 1);
|
||||
sprintf(output->delay_sec_buffer, "%d", delay_secs);
|
||||
nk_label(ctx, "seconds", NK_TEXT_LEFT);
|
||||
|
||||
|
||||
//Export XDS info
|
||||
nk_layout_row_dynamic(ctx, 25, 1);
|
||||
nk_checkbox_label(ctx, "Export XDS information (transcripts)", &output->is_export_xds);
|
||||
@@ -520,19 +525,22 @@ void draw_output_tab(struct nk_context *ctx, int *tab_screen_height, struct outp
|
||||
nk_group_end(ctx);
|
||||
}
|
||||
//Encoding Group
|
||||
if (nk_group_begin(ctx, "Encoding", NK_WINDOW_TITLE |NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_BORDER))
|
||||
if (nk_group_begin(ctx, "Encoding", NK_WINDOW_TITLE | NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_BORDER))
|
||||
{
|
||||
static int option = UTF;
|
||||
nk_layout_row_dynamic(ctx, 20, 1);
|
||||
if (nk_option_label(ctx, "Latin", output->encoding == LATIN)) {
|
||||
if (nk_option_label(ctx, "Latin", output->encoding == LATIN))
|
||||
{
|
||||
output->encoding = LATIN;
|
||||
}
|
||||
nk_layout_row_dynamic(ctx, 20, 1);
|
||||
if (nk_option_label(ctx, "Unicode", output->encoding == UNIC)) {
|
||||
if (nk_option_label(ctx, "Unicode", output->encoding == UNIC))
|
||||
{
|
||||
output->encoding = UNIC;
|
||||
}
|
||||
nk_layout_row_dynamic(ctx, 20, 1);
|
||||
if (nk_option_label(ctx, "UTF-8", output->encoding == UTF)) {
|
||||
if (nk_option_label(ctx, "UTF-8", output->encoding == UTF))
|
||||
{
|
||||
output->encoding = UTF;
|
||||
}
|
||||
|
||||
@@ -543,10 +551,9 @@ void draw_output_tab(struct nk_context *ctx, int *tab_screen_height, struct outp
|
||||
nk_group_end(ctx);
|
||||
}
|
||||
|
||||
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 100, 2, gen_enc_ratio);
|
||||
//Capitalization Group
|
||||
if(nk_group_begin(ctx, "Capitalization", NK_WINDOW_TITLE|NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_BORDER))
|
||||
if (nk_group_begin(ctx, "Capitalization", NK_WINDOW_TITLE | NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_BORDER))
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 20, 1);
|
||||
nk_checkbox_label(ctx, "Standard capitalization rules.", &output->is_cap_standard);
|
||||
@@ -564,14 +571,16 @@ void draw_output_tab(struct nk_context *ctx, int *tab_screen_height, struct outp
|
||||
}
|
||||
|
||||
//Line Endings
|
||||
if (nk_group_begin(ctx, "Line Endings:", NK_WINDOW_TITLE | NK_WINDOW_NO_SCROLLBAR |NK_WINDOW_BORDER))
|
||||
if (nk_group_begin(ctx, "Line Endings:", NK_WINDOW_TITLE | NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_BORDER))
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 20, 1);
|
||||
if (nk_option_label(ctx, "CRLF (Windows)", output->line_ending == CRLF)) {
|
||||
if (nk_option_label(ctx, "CRLF (Windows)", output->line_ending == CRLF))
|
||||
{
|
||||
output->line_ending = CRLF;
|
||||
}
|
||||
nk_layout_row_dynamic(ctx, 25, 1);
|
||||
if (nk_option_label(ctx, "LF (UNIX-like)", output->line_ending == LF)) {
|
||||
if (nk_option_label(ctx, "LF (UNIX-like)", output->line_ending == LF))
|
||||
{
|
||||
output->line_ending = LF;
|
||||
}
|
||||
|
||||
@@ -588,20 +597,22 @@ void draw_output_tab(struct nk_context *ctx, int *tab_screen_height, struct outp
|
||||
|
||||
nk_layout_row_dynamic(ctx, 20, 1);
|
||||
nk_checkbox_label(ctx, "Add dash (-) when speaker changes (for .srt)", &output->is_dash);
|
||||
|
||||
|
||||
nk_layout_row_dynamic(ctx, 20, 1);
|
||||
nk_checkbox_label(ctx, "Don't add typesetting tags(bold, italic, etc.)", &output->no_typesetting);
|
||||
|
||||
nk_layout_row_dynamic(ctx, 20, 1);
|
||||
if(nk_option_label(ctx, "Don't add color information", output->font_color == NO_COLOR)) {
|
||||
if (nk_option_label(ctx, "Don't add color information", output->font_color == NO_COLOR))
|
||||
{
|
||||
output->font_color = NO_COLOR;
|
||||
}
|
||||
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 20, 4, color_check_ratio);
|
||||
if (nk_option_label(ctx, "Default color (RRGGBB)#", output->font_color == DEFAULT_COLOR)) {
|
||||
if (nk_option_label(ctx, "Default color (RRGGBB)#", output->font_color == DEFAULT_COLOR))
|
||||
{
|
||||
output->font_color = DEFAULT_COLOR;
|
||||
}
|
||||
active = nk_edit_string(ctx, NK_EDIT_FIELD|NK_EDIT_SIG_ENTER, output->color_hex, &color_len, 7, nk_filter_hex);
|
||||
active = nk_edit_string(ctx, NK_EDIT_FIELD | NK_EDIT_SIG_ENTER, output->color_hex, &color_len, 7, nk_filter_hex);
|
||||
nk_label(ctx, "or", NK_TEXT_CENTERED);
|
||||
if (nk_button_color(ctx, output->color_rgb))
|
||||
output->color_popup = nk_true;
|
||||
@@ -617,17 +628,15 @@ void draw_output_tab(struct nk_context *ctx, int *tab_screen_height, struct outp
|
||||
printf("%d%d%d", output->color_rgb.r, output->color_rgb.g, output->color_rgb.b);
|
||||
}*/
|
||||
|
||||
|
||||
nk_group_end(ctx);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//Roll-up Captions Group
|
||||
if (nk_group_begin(ctx, "Roll-up Captions", NK_WINDOW_TITLE | NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_BORDER))
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 25, 1);
|
||||
if (nk_option_label(ctx, "Letters appear in realtime", output->onetime_or_realtime == REALTIME)) {
|
||||
if (nk_option_label(ctx, "Letters appear in realtime", output->onetime_or_realtime == REALTIME))
|
||||
{
|
||||
output->onetime_or_realtime = REALTIME;
|
||||
}
|
||||
nk_layout_row_dynamic(ctx, 25, 1);
|
||||
@@ -637,7 +646,8 @@ void draw_output_tab(struct nk_context *ctx, int *tab_screen_height, struct outp
|
||||
output->roll_limit_select = nk_combo(ctx, output->roll_limit, 4, output->roll_limit_select, 25, nk_vec2(80, 80));
|
||||
|
||||
nk_layout_row_dynamic(ctx, 20, 1);
|
||||
if (nk_option_label(ctx, "Letters appear line by line", output->onetime_or_realtime == ONETIME)) {
|
||||
if (nk_option_label(ctx, "Letters appear line by line", output->onetime_or_realtime == ONETIME))
|
||||
{
|
||||
output->onetime_or_realtime = ONETIME;
|
||||
}
|
||||
nk_layout_row_dynamic(ctx, 25, 1);
|
||||
@@ -645,23 +655,21 @@ void draw_output_tab(struct nk_context *ctx, int *tab_screen_height, struct outp
|
||||
|
||||
nk_group_end(ctx);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
void draw_decoders_tab(struct nk_context *ctx, int *tab_screen_height, struct decoders_tab *decoders)
|
||||
{
|
||||
*tab_screen_height = 472;
|
||||
const float field_channel_ratio[] = { 0.5f, 0.5f };
|
||||
const float services_ratio[] = { 0.3f, 0.002f, 0.2f };
|
||||
const float min_distance_ratio[] = { 0.45f, 0.01f, 0.2f };
|
||||
const float max_distance_ratio[] = { 0.73f, 0.01f, 0.2f };
|
||||
const float field_channel_ratio[] = {0.5f, 0.5f};
|
||||
const float services_ratio[] = {0.3f, 0.002f, 0.2f};
|
||||
const float min_distance_ratio[] = {0.45f, 0.01f, 0.2f};
|
||||
const float max_distance_ratio[] = {0.73f, 0.01f, 0.2f};
|
||||
|
||||
nk_layout_row_dynamic(ctx, 160, 1);
|
||||
if(nk_group_begin(ctx, "608 Decoder", NK_WINDOW_TITLE|NK_WINDOW_BORDER|NK_WINDOW_NO_SCROLLBAR))
|
||||
if (nk_group_begin(ctx, "608 Decoder", NK_WINDOW_TITLE | NK_WINDOW_BORDER | NK_WINDOW_NO_SCROLLBAR))
|
||||
{
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 85, 2, field_channel_ratio);
|
||||
if(nk_group_begin(ctx, "Field", NK_WINDOW_TITLE|NK_WINDOW_NO_SCROLLBAR))
|
||||
if (nk_group_begin(ctx, "Field", NK_WINDOW_TITLE | NK_WINDOW_NO_SCROLLBAR))
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 20, 1);
|
||||
nk_checkbox_label(ctx, "Extract captions from field 1", &decoders->is_field1);
|
||||
@@ -670,15 +678,15 @@ void draw_decoders_tab(struct nk_context *ctx, int *tab_screen_height, struct de
|
||||
|
||||
nk_group_end(ctx);
|
||||
}
|
||||
if(nk_group_begin(ctx, "Channel", NK_WINDOW_TITLE|NK_WINDOW_NO_SCROLLBAR))
|
||||
if (nk_group_begin(ctx, "Channel", NK_WINDOW_TITLE | NK_WINDOW_NO_SCROLLBAR))
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 20, 1);
|
||||
if(nk_option_label(ctx, "Extract captions from channel 1", decoders->channel == CHANNEL_1))
|
||||
if (nk_option_label(ctx, "Extract captions from channel 1", decoders->channel == CHANNEL_1))
|
||||
{
|
||||
decoders->channel = CHANNEL_1;
|
||||
}
|
||||
nk_layout_row_dynamic(ctx, 20, 1);
|
||||
if(nk_option_label(ctx, "Extract captions from channel 2", decoders->channel == CHANNEL_2))
|
||||
if (nk_option_label(ctx, "Extract captions from channel 2", decoders->channel == CHANNEL_2))
|
||||
{
|
||||
decoders->channel = CHANNEL_2;
|
||||
}
|
||||
@@ -687,15 +695,14 @@ void draw_decoders_tab(struct nk_context *ctx, int *tab_screen_height, struct de
|
||||
|
||||
nk_layout_row_dynamic(ctx, 40, 1);
|
||||
nk_label_wrap(ctx, "In general, if you want English subtitles you don't need to use these options. "
|
||||
"If you want the second language (usually "
|
||||
"Spanish), you may need to try other combinations.");
|
||||
|
||||
"If you want the second language (usually "
|
||||
"Spanish), you may need to try other combinations.");
|
||||
|
||||
nk_group_end(ctx);
|
||||
}
|
||||
|
||||
nk_layout_row_dynamic(ctx, 125, 1);
|
||||
if(nk_group_begin(ctx, "708 Decoder", NK_WINDOW_TITLE|NK_WINDOW_BORDER|NK_WINDOW_NO_SCROLLBAR))
|
||||
if (nk_group_begin(ctx, "708 Decoder", NK_WINDOW_TITLE | NK_WINDOW_BORDER | NK_WINDOW_NO_SCROLLBAR))
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 20, 1);
|
||||
nk_checkbox_label(ctx, "Enable 708 Decoder", &decoders->is_708);
|
||||
@@ -704,30 +711,32 @@ void draw_decoders_tab(struct nk_context *ctx, int *tab_screen_height, struct de
|
||||
nk_spacing(ctx, 1);
|
||||
nk_edit_string(ctx, NK_EDIT_SIMPLE, decoders->services, &decoders->services_len, 15, nk_filter_ascii);
|
||||
nk_layout_row_dynamic(ctx, 45, 1);
|
||||
nk_label_wrap(ctx, "The service list is a comma seperated list of services to process. "
|
||||
"Valid values: 1 to 63. Ranges are NOT supported.");
|
||||
nk_label_wrap(ctx, "The service list is a comma separated list of services to process. "
|
||||
"Valid values: 1 to 63. Ranges are NOT supported.");
|
||||
|
||||
nk_group_end(ctx);
|
||||
}
|
||||
|
||||
nk_layout_row_dynamic(ctx, 63, 1);
|
||||
if(nk_group_begin(ctx, "Teletext or DVB (if both are present)", NK_WINDOW_TITLE|NK_WINDOW_BORDER|NK_WINDOW_NO_SCROLLBAR))
|
||||
if (nk_group_begin(ctx, "Teletext or DVB (if both are present)", NK_WINDOW_TITLE | NK_WINDOW_BORDER | NK_WINDOW_NO_SCROLLBAR))
|
||||
{
|
||||
nk_layout_row_dynamic(ctx,20, 2);
|
||||
if(nk_option_label(ctx, "Teletext", decoders->teletext_dvb == TELETEXT)){
|
||||
nk_layout_row_dynamic(ctx, 20, 2);
|
||||
if (nk_option_label(ctx, "Teletext", decoders->teletext_dvb == TELETEXT))
|
||||
{
|
||||
decoders->teletext_dvb = TELETEXT;
|
||||
}
|
||||
if(nk_option_label(ctx, "DVB", decoders->teletext_dvb == DVB)){
|
||||
if (nk_option_label(ctx, "DVB", decoders->teletext_dvb == DVB))
|
||||
{
|
||||
decoders->teletext_dvb = DVB;
|
||||
}
|
||||
|
||||
nk_group_end(ctx);
|
||||
}
|
||||
|
||||
if(decoders->teletext_dvb == TELETEXT)
|
||||
if (decoders->teletext_dvb == TELETEXT)
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 95, 1);
|
||||
if(nk_group_begin(ctx, "Teletext line duplication", NK_WINDOW_TITLE|NK_WINDOW_BORDER|NK_WINDOW_NO_SCROLLBAR))
|
||||
if (nk_group_begin(ctx, "Teletext line duplication", NK_WINDOW_TITLE | NK_WINDOW_BORDER | NK_WINDOW_NO_SCROLLBAR))
|
||||
{
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 25, 3, min_distance_ratio);
|
||||
nk_label(ctx, "Minimum allowed distance (default 2)", NK_TEXT_LEFT);
|
||||
@@ -738,7 +747,6 @@ void draw_decoders_tab(struct nk_context *ctx, int *tab_screen_height, struct de
|
||||
nk_spacing(ctx, 1);
|
||||
nk_edit_string(ctx, NK_EDIT_SIMPLE, decoders->max_distance, &decoders->max_distance_len, 3, nk_filter_decimal);
|
||||
|
||||
|
||||
nk_group_end(ctx);
|
||||
}
|
||||
}
|
||||
@@ -747,14 +755,14 @@ void draw_decoders_tab(struct nk_context *ctx, int *tab_screen_height, struct de
|
||||
void draw_credits_tab(struct nk_context *ctx, int *tab_screen_height, struct credits_tab *credits)
|
||||
{
|
||||
static struct time before_time, after_time;
|
||||
const float start_time_ratio[] = { 0.005f, 0.26f, 0.18f, 0.1f, 0.25f, 0.18f };
|
||||
const float atleast_atmost_ratio[] = { 0.005f, 0.28, 0.1f, 0.36f, 0.1f, 0.1f };
|
||||
const float start_time_ratio[] = {0.005f, 0.26f, 0.18f, 0.1f, 0.25f, 0.18f};
|
||||
const float atleast_atmost_ratio[] = {0.005f, 0.28, 0.1f, 0.36f, 0.1f, 0.1f};
|
||||
static int start_atleast_int, start_atmost_int;
|
||||
*tab_screen_height = 472;
|
||||
|
||||
//Start Credits Group
|
||||
nk_layout_row_dynamic(ctx, 210, 1);
|
||||
if(nk_group_begin(ctx, "Start Credits", NK_WINDOW_TITLE|NK_WINDOW_BORDER|NK_WINDOW_NO_SCROLLBAR))
|
||||
if (nk_group_begin(ctx, "Start Credits", NK_WINDOW_TITLE | NK_WINDOW_BORDER | NK_WINDOW_NO_SCROLLBAR))
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 20, 1);
|
||||
nk_checkbox_label(ctx, "Enable, write below text as soon as possible.", &credits->is_start_text);
|
||||
@@ -766,8 +774,8 @@ void draw_credits_tab(struct nk_context *ctx, int *tab_screen_height, struct cre
|
||||
nk_spacing(ctx, 1);
|
||||
nk_checkbox_label(ctx, "Before (MM:SS)", &credits->is_before);
|
||||
|
||||
|
||||
if (nk_combo_begin_label(ctx, credits->before_time_buffer, nk_vec2(100, 100))) {
|
||||
if (nk_combo_begin_label(ctx, credits->before_time_buffer, nk_vec2(100, 100)))
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 25, 1);
|
||||
sprintf(credits->before_time_buffer, "%02d:%02d", before_time.minutes, before_time.seconds);
|
||||
before_time.seconds = nk_propertyi(ctx, "#S:", 0, before_time.seconds, 60, 1, 1);
|
||||
@@ -779,8 +787,8 @@ void draw_credits_tab(struct nk_context *ctx, int *tab_screen_height, struct cre
|
||||
|
||||
nk_checkbox_label(ctx, "After (MM:SS)", &credits->is_after);
|
||||
|
||||
|
||||
if (nk_combo_begin_label(ctx, credits->after_time_buffer, nk_vec2(100, 100))) {
|
||||
if (nk_combo_begin_label(ctx, credits->after_time_buffer, nk_vec2(100, 100)))
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 25, 1);
|
||||
sprintf(credits->after_time_buffer, "%02d:%02d", after_time.minutes, after_time.seconds);
|
||||
after_time.seconds = nk_propertyi(ctx, "#S:", 0, after_time.seconds, 60, 1, 1);
|
||||
@@ -801,13 +809,13 @@ void draw_credits_tab(struct nk_context *ctx, int *tab_screen_height, struct cre
|
||||
|
||||
//End Credits Group
|
||||
nk_layout_row_dynamic(ctx, 180, 1);
|
||||
if(nk_group_begin(ctx, "End Credits", NK_WINDOW_TITLE|NK_WINDOW_BORDER|NK_WINDOW_NO_SCROLLBAR))
|
||||
if (nk_group_begin(ctx, "End Credits", NK_WINDOW_TITLE | NK_WINDOW_BORDER | NK_WINDOW_NO_SCROLLBAR))
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 20, 1);
|
||||
nk_checkbox_label(ctx, "Enable, write below text after last caption and as close as possible to video end.", &credits->is_end_text);
|
||||
nk_layout_row_dynamic(ctx, 85, 1);
|
||||
nk_edit_string(ctx, NK_EDIT_BOX, credits->end_text, &credits->end_text_len, 1000, nk_filter_ascii);
|
||||
nk_layout_row(ctx,NK_DYNAMIC, 25, 6, atleast_atmost_ratio);
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 25, 6, atleast_atmost_ratio);
|
||||
nk_spacing(ctx, 1);
|
||||
nk_label(ctx, "Display credits at least", NK_TEXT_LEFT);
|
||||
nk_edit_string(ctx, NK_EDIT_SIMPLE, credits->end_atleast_sec, &credits->end_atleast_sec_len, 3, nk_filter_decimal);
|
||||
@@ -820,18 +828,18 @@ void draw_credits_tab(struct nk_context *ctx, int *tab_screen_height, struct cre
|
||||
}
|
||||
|
||||
void draw_debug_tab(struct nk_context *ctx, int *tab_screen_height,
|
||||
struct main_tab *main_settings,
|
||||
struct output_tab *output,
|
||||
struct debug_tab *debug)
|
||||
struct main_tab *main_settings,
|
||||
struct output_tab *output,
|
||||
struct debug_tab *debug)
|
||||
{
|
||||
*tab_screen_height = 472;
|
||||
const float stream_ratio[] = { 0.45f, 0.45f, 0.1f };
|
||||
const float stream_ratio[] = {0.45f, 0.45f, 0.1f};
|
||||
nk_layout_row_dynamic(ctx, 4, 1);
|
||||
nk_spacing(ctx, 1);
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 25, 3, stream_ratio);
|
||||
nk_checkbox_label(ctx, "Write elementary stream to this file", &debug->is_elementary_stream);
|
||||
nk_edit_string(ctx, NK_EDIT_SIMPLE, debug->elementary_stream, &debug->elementary_stream_len, 260, nk_filter_ascii);
|
||||
if(nk_button_label(ctx, "Browse"))
|
||||
if (nk_button_label(ctx, "Browse"))
|
||||
{
|
||||
debug->is_debug_browser_active = nk_true;
|
||||
main_settings->scaleWindowForFileBrowser = nk_true;
|
||||
@@ -858,14 +866,13 @@ void draw_debug_tab(struct nk_context *ctx, int *tab_screen_height,
|
||||
nk_layout_row_dynamic(ctx, 25, 1);
|
||||
nk_checkbox_label(ctx, "Print debug info for parse container files (only for ASF files at the moment).", &debug->is_debug_parsed);
|
||||
|
||||
if(!(strcmp(output->type[output->type_select], "bin")))
|
||||
if (!(strcmp(output->type[output->type_select], "bin")))
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 25, 1);
|
||||
nk_checkbox_label(ctx, "Disable sync code when there's a timeline gap.", &debug->is_disable_sync);
|
||||
|
||||
nk_layout_row_dynamic(ctx, 25, 1);
|
||||
nk_checkbox_label(ctx, "Don't remove trailing padding blocks.", &debug->is_no_padding);
|
||||
|
||||
}
|
||||
|
||||
nk_layout_row_dynamic(ctx, 25, 1);
|
||||
@@ -885,19 +892,19 @@ void draw_debug_tab(struct nk_context *ctx, int *tab_screen_height,
|
||||
}
|
||||
|
||||
void draw_hd_homerun_tab(struct nk_context *ctx, int *tab_screen_height,
|
||||
struct hd_homerun_tab *hd_homerun,
|
||||
struct main_tab *main_settings)
|
||||
struct hd_homerun_tab *hd_homerun,
|
||||
struct main_tab *main_settings)
|
||||
{
|
||||
*tab_screen_height = 472;
|
||||
int setup_device = nk_false;
|
||||
const float location_ratio[] = { 0.35f, 0.5f, 0.15f };
|
||||
const float devices_ratio[] = { 0.8f, 0.2f };
|
||||
const float tuner_ratio[] = { .35f, 0.4f, 0.13 };
|
||||
const float channel_ratio[] = { 0.35f, 0.4f };
|
||||
const float program_ratio[] = { 0.35f, 0.4f };
|
||||
const float done_ratio[] = { 0.45f, 0.1f };
|
||||
const float ipv4_ratio[] = { 0.35f, 0.4f};
|
||||
const float port_ratio[] = { 0.35f, 0.4f };
|
||||
const float location_ratio[] = {0.35f, 0.5f, 0.15f};
|
||||
const float devices_ratio[] = {0.8f, 0.2f};
|
||||
const float tuner_ratio[] = {.35f, 0.4f, 0.13};
|
||||
const float channel_ratio[] = {0.35f, 0.4f};
|
||||
const float program_ratio[] = {0.35f, 0.4f};
|
||||
const float done_ratio[] = {0.45f, 0.1f};
|
||||
const float ipv4_ratio[] = {0.35f, 0.4f};
|
||||
const float port_ratio[] = {0.35f, 0.4f};
|
||||
static int before_selected, after_selected;
|
||||
static int done = nk_false;
|
||||
#if HD_HOMERUN
|
||||
@@ -907,21 +914,21 @@ void draw_hd_homerun_tab(struct nk_context *ctx, int *tab_screen_height,
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 25, 3, location_ratio);
|
||||
nk_label(ctx, "'hdhomerun_config' utility*:", NK_TEXT_LEFT);
|
||||
nk_edit_string(ctx, NK_EDIT_SIMPLE, hd_homerun->location, &hd_homerun->location_len, 260, nk_filter_ascii);
|
||||
if(nk_button_label(ctx, "Browse"))
|
||||
if (nk_button_label(ctx, "Browse"))
|
||||
{
|
||||
hd_homerun->is_homerun_browser_active = nk_true;
|
||||
main_settings->scaleWindowForFileBrowser = nk_true;
|
||||
}
|
||||
nk_layout_row_dynamic(ctx, 40, 1);
|
||||
nk_label_wrap(ctx, "*Absolute location of 'hdhomerun_config' executable. Displaying this message means "
|
||||
"either utility is not installed or environment variables aren't set for proper detection.");
|
||||
"either utility is not installed or environment variables aren't set for proper detection.");
|
||||
|
||||
#endif
|
||||
nk_layout_row_dynamic(ctx, 120, 1);
|
||||
if(nk_group_begin(ctx, "Choose a device:", NK_WINDOW_TITLE|NK_WINDOW_BORDER))
|
||||
if (nk_group_begin(ctx, "Choose a device:", NK_WINDOW_TITLE | NK_WINDOW_BORDER))
|
||||
{
|
||||
|
||||
if(hd_homerun->device_num == 0)
|
||||
if (hd_homerun->device_num == 0)
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 20, 1);
|
||||
nk_label_wrap(ctx, "No devices found, yet. Please check your settings and try again.");
|
||||
@@ -929,22 +936,22 @@ void draw_hd_homerun_tab(struct nk_context *ctx, int *tab_screen_height,
|
||||
else
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 20, 1);
|
||||
for(int i = 0; i < hd_homerun->device_num; i++)
|
||||
for (int i = 0; i < hd_homerun->device_num; i++)
|
||||
{
|
||||
nk_selectable_label(ctx, hd_homerun->devices[i], NK_TEXT_LEFT, &hd_homerun->device_select[i]);
|
||||
if(hd_homerun->device_select[i])
|
||||
if (hd_homerun->device_select[i])
|
||||
{
|
||||
before_selected = i - 1;
|
||||
after_selected = i + 1;
|
||||
for( int j = 0; j <= before_selected; j++)
|
||||
for (int j = 0; j <= before_selected; j++)
|
||||
hd_homerun->device_select[j] = nk_false;
|
||||
for(int j = after_selected; j < hd_homerun->device_num; j++)
|
||||
for (int j = after_selected; j < hd_homerun->device_num; j++)
|
||||
hd_homerun->device_select[j] = nk_false;
|
||||
}
|
||||
}
|
||||
for(int i = 0; i < hd_homerun->device_num; i++)
|
||||
for (int i = 0; i < hd_homerun->device_num; i++)
|
||||
{
|
||||
if(hd_homerun->device_select[i] == nk_true)
|
||||
if (hd_homerun->device_select[i] == nk_true)
|
||||
{
|
||||
hd_homerun->selected = i;
|
||||
break;
|
||||
@@ -954,24 +961,22 @@ void draw_hd_homerun_tab(struct nk_context *ctx, int *tab_screen_height,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
nk_group_end(ctx);
|
||||
}
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 25, 2, devices_ratio);
|
||||
nk_spacing(ctx, 1);
|
||||
if(hd_homerun->selected == -1)
|
||||
if (hd_homerun->selected == -1)
|
||||
{
|
||||
if(nk_button_label(ctx, "Find Devices"))
|
||||
if (nk_button_label(ctx, "Find Devices"))
|
||||
{
|
||||
pthread_attr_init(&attr_find);
|
||||
|
||||
int err = pthread_create(&tid_find, &attr_find, find_hd_homerun_devices, hd_homerun);
|
||||
if(!err)
|
||||
if (!err)
|
||||
printf("Find Device thread created!\n");
|
||||
|
||||
}
|
||||
}
|
||||
if(hd_homerun->selected != -1 && done == nk_false)
|
||||
if (hd_homerun->selected != -1 && done == nk_false)
|
||||
{
|
||||
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 25, 3, tuner_ratio);
|
||||
@@ -986,7 +991,7 @@ void draw_hd_homerun_tab(struct nk_context *ctx, int *tab_screen_height,
|
||||
nk_label(ctx, "Program number for extraction:", NK_TEXT_LEFT);
|
||||
nk_edit_string(ctx, NK_EDIT_SIMPLE, hd_homerun->program, &hd_homerun->program_len, 10, nk_filter_decimal);
|
||||
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 25, 2,ipv4_ratio);
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 25, 2, ipv4_ratio);
|
||||
nk_label(ctx, "Target IPv4 address:", NK_TEXT_LEFT);
|
||||
nk_edit_string(ctx, NK_EDIT_SIMPLE, hd_homerun->ipv4_address, &hd_homerun->ipv4_address_len, 16, nk_filter_ascii);
|
||||
|
||||
@@ -994,18 +999,17 @@ void draw_hd_homerun_tab(struct nk_context *ctx, int *tab_screen_height,
|
||||
nk_label(ctx, "Target Port number:", NK_TEXT_LEFT);
|
||||
nk_edit_string(ctx, NK_EDIT_SIMPLE, hd_homerun->port_number, &hd_homerun->port_number_len, 7, nk_filter_decimal);
|
||||
|
||||
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 25, 2, done_ratio);
|
||||
nk_spacing(ctx, 1);
|
||||
if(nk_button_label(ctx, "Done"))
|
||||
if (nk_button_label(ctx, "Done"))
|
||||
{
|
||||
pthread_attr_init(&attr_setup);
|
||||
int err = pthread_create(&tid_setup, &attr_setup, setup_hd_homerun_device, hd_homerun);
|
||||
if(!err)
|
||||
printf("Setup Device thread created!\n");
|
||||
pthread_attr_init(&attr_setup);
|
||||
int err = pthread_create(&tid_setup, &attr_setup, setup_hd_homerun_device, hd_homerun);
|
||||
if (!err)
|
||||
printf("Setup Device thread created!\n");
|
||||
|
||||
pthread_join(tid_setup, NULL);
|
||||
done = nk_true;
|
||||
pthread_join(tid_setup, NULL);
|
||||
done = nk_true;
|
||||
}
|
||||
}
|
||||
if (done == nk_true)
|
||||
@@ -1015,19 +1019,16 @@ void draw_hd_homerun_tab(struct nk_context *ctx, int *tab_screen_height,
|
||||
nk_layout_row_dynamic(ctx, 20, 1);
|
||||
nk_label(ctx, "Please start CCExtractor with UDP settings if not started.", NK_TEXT_CENTERED);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
void draw_burned_subs_tab(struct nk_context *ctx, int *tab_screen_height, struct burned_subs_tab *burned_subs)
|
||||
{
|
||||
*tab_screen_height = 472;
|
||||
const float color_mode_ratio[] = { 0.65f, 0.351f};
|
||||
const float preset_ratio[] = { 0.4f, 0.5f };
|
||||
const float custom_ratio[] = { 0.4f, 0.5f};
|
||||
const float delay_ratio[] = { 0.4f, 0.2f, 0.2f };
|
||||
const float threshold_ratio[] = { 0.9f, 0.1f };
|
||||
const float color_mode_ratio[] = {0.65f, 0.351f};
|
||||
const float preset_ratio[] = {0.4f, 0.5f};
|
||||
const float custom_ratio[] = {0.4f, 0.5f};
|
||||
const float delay_ratio[] = {0.4f, 0.2f, 0.2f};
|
||||
const float threshold_ratio[] = {0.9f, 0.1f};
|
||||
static char buffer[5];
|
||||
|
||||
nk_layout_row_dynamic(ctx, 30, 1);
|
||||
@@ -1038,16 +1039,18 @@ void draw_burned_subs_tab(struct nk_context *ctx, int *tab_screen_height, struct
|
||||
#endif
|
||||
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 140, 2, color_mode_ratio);
|
||||
if(nk_group_begin(ctx, "Subtitle Color", NK_WINDOW_TITLE | NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_BORDER))
|
||||
if (nk_group_begin(ctx, "Subtitle Color", NK_WINDOW_TITLE | NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_BORDER))
|
||||
{
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 25, 2, preset_ratio);
|
||||
if(nk_option_label(ctx, "Preset color:", burned_subs->color_type == PRESET)){
|
||||
if (nk_option_label(ctx, "Preset color:", burned_subs->color_type == PRESET))
|
||||
{
|
||||
burned_subs->color_type = PRESET;
|
||||
}
|
||||
burned_subs->subs_color_select = nk_combo(ctx, burned_subs->subs_color, 7, burned_subs->subs_color_select, 25, nk_vec2(100, 100));
|
||||
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 25, 2, custom_ratio);
|
||||
if(nk_option_label(ctx, "Custom Hue:", burned_subs->color_type == CUSTOM)){
|
||||
if (nk_option_label(ctx, "Custom Hue:", burned_subs->color_type == CUSTOM))
|
||||
{
|
||||
burned_subs->color_type = CUSTOM;
|
||||
}
|
||||
nk_edit_string(ctx, NK_EDIT_SIMPLE, burned_subs->custom_hue, &burned_subs->custom_hue_len, 4, nk_filter_decimal);
|
||||
@@ -1059,29 +1062,32 @@ void draw_burned_subs_tab(struct nk_context *ctx, int *tab_screen_height, struct
|
||||
nk_group_end(ctx);
|
||||
}
|
||||
|
||||
if(nk_group_begin(ctx, "OCR mode", NK_WINDOW_TITLE|NK_WINDOW_NO_SCROLLBAR|NK_WINDOW_BORDER))
|
||||
if (nk_group_begin(ctx, "OCR mode", NK_WINDOW_TITLE | NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_BORDER))
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 25, 1);
|
||||
if(nk_option_label(ctx, "Frame - wise", burned_subs->ocr_mode == FRAME_WISE)){
|
||||
if (nk_option_label(ctx, "Frame - wise", burned_subs->ocr_mode == FRAME_WISE))
|
||||
{
|
||||
burned_subs->ocr_mode = FRAME_WISE;
|
||||
}
|
||||
nk_layout_row_dynamic(ctx, 25, 1);
|
||||
if(nk_option_label(ctx, "Word - wise", burned_subs->ocr_mode == WORD_WISE)){
|
||||
if (nk_option_label(ctx, "Word - wise", burned_subs->ocr_mode == WORD_WISE))
|
||||
{
|
||||
burned_subs->ocr_mode = WORD_WISE;
|
||||
}
|
||||
nk_layout_row_dynamic(ctx, 25, 1);
|
||||
if(nk_option_label(ctx, "Letter - wise", burned_subs->ocr_mode == LETTER_WISE)){
|
||||
if (nk_option_label(ctx, "Letter - wise", burned_subs->ocr_mode == LETTER_WISE))
|
||||
{
|
||||
burned_subs->ocr_mode = LETTER_WISE;
|
||||
}
|
||||
|
||||
if(burned_subs->is_italic)
|
||||
if (burned_subs->is_italic)
|
||||
{
|
||||
burned_subs->ocr_mode = WORD_WISE;
|
||||
}
|
||||
nk_group_end(ctx);
|
||||
}
|
||||
nk_layout_row_dynamic(ctx, 120, 1);
|
||||
if(nk_group_begin(ctx, "Minimum Subtitle Duration", NK_WINDOW_TITLE|NK_WINDOW_NO_SCROLLBAR|NK_WINDOW_BORDER))
|
||||
if (nk_group_begin(ctx, "Minimum Subtitle Duration", NK_WINDOW_TITLE | NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_BORDER))
|
||||
{
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 25, 3, delay_ratio);
|
||||
nk_label(ctx, "Set the minimum subtitle duration to:", NK_TEXT_LEFT);
|
||||
@@ -1094,10 +1100,10 @@ void draw_burned_subs_tab(struct nk_context *ctx, int *tab_screen_height, struct
|
||||
nk_group_end(ctx);
|
||||
}
|
||||
|
||||
if(!burned_subs->subs_color_select && burned_subs->color_type == PRESET)
|
||||
if (!burned_subs->subs_color_select && burned_subs->color_type == PRESET)
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 60, 1);
|
||||
if(nk_group_begin(ctx, "Luminance Threshold", NK_WINDOW_TITLE|NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_BORDER))
|
||||
if (nk_group_begin(ctx, "Luminance Threshold", NK_WINDOW_TITLE | NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_BORDER))
|
||||
{
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 20, 2, threshold_ratio);
|
||||
nk_slider_int(ctx, 0, &burned_subs->luminance_threshold, 100, 1);
|
||||
@@ -1109,7 +1115,7 @@ void draw_burned_subs_tab(struct nk_context *ctx, int *tab_screen_height, struct
|
||||
}
|
||||
|
||||
nk_layout_row_dynamic(ctx, 60, 1);
|
||||
if(nk_group_begin(ctx, "Confidence Threshold", NK_WINDOW_TITLE|NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_BORDER))
|
||||
if (nk_group_begin(ctx, "Confidence Threshold", NK_WINDOW_TITLE | NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_BORDER))
|
||||
{
|
||||
nk_layout_row(ctx, NK_DYNAMIC, 20, 2, threshold_ratio);
|
||||
nk_slider_int(ctx, 0, &burned_subs->confidence_threshold, 100, 1);
|
||||
@@ -1121,5 +1127,4 @@ void draw_burned_subs_tab(struct nk_context *ctx, int *tab_screen_height, struct
|
||||
|
||||
nk_layout_row_dynamic(ctx, 30, 1);
|
||||
nk_checkbox_label(ctx, "Enable italics detection.", &burned_subs->is_italic);
|
||||
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ static int
|
||||
terminal(struct nk_context *ctx, int x, int y, int width, int height, char *command)
|
||||
{
|
||||
if (nk_begin(ctx, "Terminal", nk_rect(x, y, width, height),
|
||||
NK_WINDOW_TITLE|NK_WINDOW_BACKGROUND ))
|
||||
NK_WINDOW_TITLE | NK_WINDOW_BACKGROUND))
|
||||
{
|
||||
nk_layout_row_dynamic(ctx, 60, 1);
|
||||
nk_label_wrap(ctx, command);
|
||||
|
||||
@@ -601,7 +601,7 @@ extern "C" {
|
||||
p = &dirp->data;
|
||||
}
|
||||
else {
|
||||
/* The very last entry has been processed or an error occured */
|
||||
/* The very last entry has been processed or an error occurred */
|
||||
FindClose(dirp->handle);
|
||||
dirp->handle = INVALID_HANDLE_VALUE;
|
||||
p = NULL;
|
||||
@@ -692,7 +692,7 @@ extern "C" {
|
||||
* to 1252 using chcp utility and use Lucida Console font, or (2) use
|
||||
* _cprintf function when writing to console. The _cprinf() will re-encode
|
||||
* ANSI strings to the console code page so many non-ASCII characters will
|
||||
* display correcly.
|
||||
* display correctly.
|
||||
*/
|
||||
static struct dirent*
|
||||
readdir(
|
||||
@@ -850,7 +850,7 @@ extern "C" {
|
||||
wcstr[n] = 0;
|
||||
}
|
||||
|
||||
/* Length of resuting multi-byte string WITH zero terminator */
|
||||
/* Length of resulting multi-byte string WITH zero terminator */
|
||||
if (pReturnValue) {
|
||||
*pReturnValue = n + 1;
|
||||
}
|
||||
|
||||
@@ -5,51 +5,51 @@ License: GPL 2.0
|
||||
*/
|
||||
#include "ccextractor.h"
|
||||
#include <stdio.h>
|
||||
#include <locale.h>
|
||||
|
||||
volatile int terminate_asap = 0;
|
||||
|
||||
struct ccx_s_options ccx_options;
|
||||
struct lib_ccx_ctx *signal_ctx;
|
||||
|
||||
void sigusr1_handler(int sig)
|
||||
{
|
||||
mprint("Caught SIGUSR1. Filename Change Requested\n");
|
||||
change_filename_requested = 1;
|
||||
mprint("Caught SIGUSR1. Filename Change Requested\n");
|
||||
change_filename_requested = 1;
|
||||
}
|
||||
|
||||
|
||||
void sigterm_handler(int sig)
|
||||
{
|
||||
printf("Received SIGTERM, terminating as soon as possible.\n");
|
||||
terminate_asap = 1;
|
||||
printf("Received SIGTERM, terminating as soon as possible.\n");
|
||||
terminate_asap = 1;
|
||||
}
|
||||
|
||||
|
||||
void sigint_handler(int sig)
|
||||
{
|
||||
if (ccx_options.print_file_reports)
|
||||
print_file_report(signal_ctx);
|
||||
if (ccx_options.print_file_reports)
|
||||
print_file_report(signal_ctx);
|
||||
|
||||
exit(EXIT_SUCCESS);
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
|
||||
void print_end_msg(void)
|
||||
{
|
||||
mprint("Issues? Open a ticket here\n");
|
||||
mprint("https://github.com/CCExtractor/ccextractor/issues\n");
|
||||
mprint("Issues? Open a ticket here\n");
|
||||
mprint("https://github.com/CCExtractor/ccextractor/issues\n");
|
||||
}
|
||||
|
||||
|
||||
int api_start(struct ccx_s_options api_options)
|
||||
{
|
||||
struct lib_ccx_ctx *ctx;
|
||||
struct lib_cc_decode *dec_ctx = NULL;
|
||||
int ret = 0, tmp;
|
||||
enum ccx_stream_mode_enum stream_mode;
|
||||
struct lib_ccx_ctx *ctx = NULL; // Context for libs
|
||||
struct lib_cc_decode *dec_ctx = NULL; // Context for decoder
|
||||
int ret = 0, tmp = 0;
|
||||
enum ccx_stream_mode_enum stream_mode = CCX_SM_ELEMENTARY_OR_NOT_FOUND;
|
||||
|
||||
#if defined(ENABLE_OCR) && defined(_WIN32)
|
||||
setMsgSeverity(LEPT_MSG_SEVERITY);
|
||||
setMsgSeverity(LEPT_MSG_SEVERITY);
|
||||
#endif
|
||||
#ifdef ENABLE_HARDSUBX
|
||||
if(api_options.hardsubx)
|
||||
if (api_options.hardsubx)
|
||||
{
|
||||
// Perform burned in subtitle extraction
|
||||
hardsubx(&api_options);
|
||||
@@ -57,98 +57,93 @@ int api_start(struct ccx_s_options api_options)
|
||||
}
|
||||
#endif
|
||||
|
||||
// Initialize CCExtractor libraries
|
||||
ctx = init_libraries(&api_options);
|
||||
#ifdef ENABLE_PYTHON
|
||||
int i=0;
|
||||
// Initialize CCExtractor libraries
|
||||
ctx = init_libraries(&api_options);
|
||||
|
||||
while(i<api_options.python_param_count)
|
||||
{
|
||||
free(api_options.python_params[i]);
|
||||
i++;
|
||||
}
|
||||
#endif
|
||||
if (!ctx && errno == ENOMEM)
|
||||
fatal (EXIT_NOT_ENOUGH_MEMORY, "Not enough memory, could not initialize libraries\n");
|
||||
else if (!ctx && errno == EINVAL)
|
||||
fatal (CCX_COMMON_EXIT_BUG_BUG, "Invalid option to CCextractor Library\n");
|
||||
else if (!ctx && errno == EPERM)
|
||||
fatal (CCX_COMMON_EXIT_FILE_CREATION_FAILED, "Unable to create output file: Operation not permitted.\n");
|
||||
else if (!ctx && errno == EACCES)
|
||||
fatal (CCX_COMMON_EXIT_FILE_CREATION_FAILED, "Unable to create output file: Permission denied\n");
|
||||
else if (!ctx)
|
||||
fatal (EXIT_NOT_CLASSIFIED, "Unable to create Library Context %d\n",errno);
|
||||
if (!ctx)
|
||||
{
|
||||
if (errno == ENOMEM)
|
||||
fatal(EXIT_NOT_ENOUGH_MEMORY, "Not enough memory, could not initialize libraries\n");
|
||||
else if (errno == EINVAL)
|
||||
fatal(CCX_COMMON_EXIT_BUG_BUG, "Invalid option to CCextractor Library\n");
|
||||
else if (errno == EPERM)
|
||||
fatal(CCX_COMMON_EXIT_FILE_CREATION_FAILED, "Unable to create output file: Operation not permitted.\n");
|
||||
else if (errno == EACCES)
|
||||
fatal(CCX_COMMON_EXIT_FILE_CREATION_FAILED, "Unable to create output file: Permission denied\n");
|
||||
else
|
||||
fatal(EXIT_NOT_CLASSIFIED, "Unable to create Library Context %d\n", errno);
|
||||
}
|
||||
|
||||
#ifdef WITH_LIBCURL
|
||||
curl_global_init(CURL_GLOBAL_ALL);
|
||||
curl_global_init(CURL_GLOBAL_ALL);
|
||||
|
||||
/* get a curl handle */
|
||||
curl = curl_easy_init();
|
||||
/* get a curl handle */
|
||||
curl = curl_easy_init();
|
||||
if (!curl)
|
||||
{
|
||||
curl_global_cleanup(); // Must be done even on init fail
|
||||
fatal (EXIT_NOT_CLASSIFIED, "Unable to init curl.");
|
||||
fatal(EXIT_NOT_CLASSIFIED, "Unable to init curl.");
|
||||
}
|
||||
#endif
|
||||
|
||||
int show_myth_banner = 0;
|
||||
int show_myth_banner = 0;
|
||||
|
||||
params_dump(ctx);
|
||||
params_dump(ctx);
|
||||
|
||||
// default teletext page
|
||||
if (tlt_config.page > 0) {
|
||||
// dec to BCD, magazine pages numbers are in BCD (ETSI 300 706)
|
||||
tlt_config.page = ((tlt_config.page / 100) << 8) | (((tlt_config.page / 10) % 10) << 4) | (tlt_config.page % 10);
|
||||
}
|
||||
// default teletext page
|
||||
if (tlt_config.page > 0)
|
||||
{
|
||||
// dec to BCD, magazine pages numbers are in BCD (ETSI 300 706)
|
||||
tlt_config.page = ((tlt_config.page / 100) << 8) | (((tlt_config.page / 10) % 10) << 4) | (tlt_config.page % 10);
|
||||
}
|
||||
|
||||
if (api_options.transcript_settings.xds)
|
||||
{
|
||||
if (api_options.write_format != CCX_OF_TRANSCRIPT)
|
||||
{
|
||||
api_options.transcript_settings.xds = 0;
|
||||
mprint ("Warning: -xds ignored, XDS can only be exported to transcripts at this time.\n");
|
||||
}
|
||||
}
|
||||
if (api_options.transcript_settings.xds)
|
||||
{
|
||||
if (api_options.write_format != CCX_OF_TRANSCRIPT)
|
||||
{
|
||||
api_options.transcript_settings.xds = 0;
|
||||
mprint("Warning: -xds ignored, XDS can only be exported to transcripts at this time.\n");
|
||||
}
|
||||
}
|
||||
|
||||
time_t start, final;
|
||||
time(&start);
|
||||
|
||||
time_t start, final;
|
||||
time(&start);
|
||||
|
||||
if (api_options.binary_concat)
|
||||
{
|
||||
ctx->total_inputsize=get_total_file_size(ctx);
|
||||
if (ctx->total_inputsize < 0)
|
||||
{
|
||||
switch (ctx->total_inputsize)
|
||||
{
|
||||
case -1*ENOENT:
|
||||
fatal(EXIT_NO_INPUT_FILES, "Failed to open input file: File does not exist.");
|
||||
case -1*EACCES:
|
||||
fatal(EXIT_READ_ERROR, "Failed to open input file: Unable to access");
|
||||
case -1*EINVAL:
|
||||
fatal(EXIT_READ_ERROR, "Failed to open input file: Invalid opening flag.");
|
||||
case -1*EMFILE:
|
||||
fatal(EXIT_TOO_MANY_INPUT_FILES, "Failed to open input file: Too many files are open.");
|
||||
default:
|
||||
fatal(EXIT_READ_ERROR, "Failed to open input file: Reason unknown");
|
||||
}
|
||||
}
|
||||
}
|
||||
if (api_options.binary_concat)
|
||||
{
|
||||
ctx->total_inputsize = get_total_file_size(ctx);
|
||||
if (ctx->total_inputsize < 0)
|
||||
{
|
||||
switch (ctx->total_inputsize)
|
||||
{
|
||||
case -1 * ENOENT:
|
||||
fatal(EXIT_NO_INPUT_FILES, "Failed to open one of the input file(s): File does not exist.");
|
||||
case -1 * EACCES:
|
||||
fatal(EXIT_READ_ERROR, "Failed to open input file: Unable to access");
|
||||
case -1 * EINVAL:
|
||||
fatal(EXIT_READ_ERROR, "Failed to open input file: Invalid opening flag.");
|
||||
case -1 * EMFILE:
|
||||
fatal(EXIT_TOO_MANY_INPUT_FILES, "Failed to open input file: Too many files are open.");
|
||||
default:
|
||||
fatal(EXIT_READ_ERROR, "Failed to open input file: Reason unknown");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef _WIN32
|
||||
signal_ctx = ctx;
|
||||
m_signal(SIGINT, sigint_handler);
|
||||
m_signal(SIGTERM, sigterm_handler);
|
||||
m_signal(SIGUSR1, sigusr1_handler);
|
||||
signal_ctx = ctx;
|
||||
m_signal(SIGINT, sigint_handler);
|
||||
m_signal(SIGTERM, sigterm_handler);
|
||||
m_signal(SIGUSR1, sigusr1_handler);
|
||||
#endif
|
||||
terminate_asap = 0;
|
||||
terminate_asap = 0;
|
||||
|
||||
#ifdef ENABLE_SHARING
|
||||
if (api_options.translate_enabled && ctx->num_input_files > 1)
|
||||
if (api_options.translate_enabled && ctx->num_input_files > 1)
|
||||
{
|
||||
mprint("[share] WARNING: simultaneous translation of several input files is not supported yet\n");
|
||||
api_options.translate_enabled = 0;
|
||||
api_options.sharing_enabled = 0;
|
||||
api_options.sharing_enabled = 0;
|
||||
}
|
||||
if (api_options.translate_enabled)
|
||||
{
|
||||
@@ -156,379 +151,314 @@ int api_start(struct ccx_s_options api_options)
|
||||
ccx_share_launch_translator(api_options.translate_langs, api_options.translate_key);
|
||||
}
|
||||
#endif //ENABLE_SHARING
|
||||
ret = 0;
|
||||
while (switch_to_next_file(ctx, 0))
|
||||
{
|
||||
prepare_for_new_file(ctx);
|
||||
ret = 0;
|
||||
while (switch_to_next_file(ctx, 0))
|
||||
{
|
||||
prepare_for_new_file(ctx);
|
||||
#ifdef ENABLE_SHARING
|
||||
if (api_options.sharing_enabled)
|
||||
if (api_options.sharing_enabled)
|
||||
ccx_share_start(ctx->basefilename);
|
||||
#endif //ENABLE_SHARING
|
||||
|
||||
stream_mode = ctx->demux_ctx->get_stream_mode(ctx->demux_ctx);
|
||||
// Disable sync check for raw formats - they have the right timeline.
|
||||
// Also true for bin formats, but -nosync might have created a
|
||||
// broken timeline for debug purposes.
|
||||
// Disable too in MP4, specs doesn't say that there can't be a jump
|
||||
switch (stream_mode)
|
||||
{
|
||||
case CCX_SM_MCPOODLESRAW:
|
||||
case CCX_SM_RCWT:
|
||||
case CCX_SM_MP4:
|
||||
stream_mode = ctx->demux_ctx->get_stream_mode(ctx->demux_ctx);
|
||||
// Disable sync check for raw formats - they have the right timeline.
|
||||
// Also true for bin formats, but -nosync might have created a
|
||||
// broken timeline for debug purposes.
|
||||
// Disable too in MP4, specs doesn't say that there can't be a jump
|
||||
switch (stream_mode)
|
||||
{
|
||||
case CCX_SM_MCPOODLESRAW:
|
||||
case CCX_SM_RCWT:
|
||||
case CCX_SM_MP4:
|
||||
#ifdef WTV_DEBUG
|
||||
case CCX_SM_HEX_DUMP:
|
||||
case CCX_SM_HEX_DUMP:
|
||||
#endif
|
||||
ccx_common_timing_settings.disable_sync_check = 1;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
/* -----------------------------------------------------------------
|
||||
MAIN LOOP
|
||||
----------------------------------------------------------------- */
|
||||
switch (stream_mode)
|
||||
{
|
||||
case CCX_SM_ELEMENTARY_OR_NOT_FOUND:
|
||||
if (!api_options.use_gop_as_pts) // If !0 then the user selected something
|
||||
api_options.use_gop_as_pts = 1; // Force GOP timing for ES
|
||||
ccx_common_timing_settings.is_elementary_stream = 1;
|
||||
case CCX_SM_TRANSPORT:
|
||||
case CCX_SM_PROGRAM:
|
||||
case CCX_SM_ASF:
|
||||
case CCX_SM_WTV:
|
||||
case CCX_SM_GXF:
|
||||
case CCX_SM_MXF:
|
||||
ccx_common_timing_settings.disable_sync_check = 1;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
/* -----------------------------------------------------------------
|
||||
MAIN LOOP
|
||||
----------------------------------------------------------------- */
|
||||
switch (stream_mode)
|
||||
{
|
||||
case CCX_SM_ELEMENTARY_OR_NOT_FOUND:
|
||||
if (!api_options.use_gop_as_pts) // If !0 then the user selected something
|
||||
api_options.use_gop_as_pts = 1; // Force GOP timing for ES
|
||||
ccx_common_timing_settings.is_elementary_stream = 1;
|
||||
case CCX_SM_TRANSPORT:
|
||||
case CCX_SM_PROGRAM:
|
||||
case CCX_SM_ASF:
|
||||
case CCX_SM_WTV:
|
||||
case CCX_SM_GXF:
|
||||
case CCX_SM_MXF:
|
||||
#ifdef ENABLE_FFMPEG
|
||||
case CCX_SM_FFMPEG:
|
||||
case CCX_SM_FFMPEG:
|
||||
#endif
|
||||
if (!api_options.use_gop_as_pts) // If !0 then the user selected something
|
||||
api_options.use_gop_as_pts = 0;
|
||||
if (api_options.ignore_pts_jumps)
|
||||
ccx_common_timing_settings.disable_sync_check = 1;
|
||||
mprint ("\rAnalyzing data in general mode\n");
|
||||
tmp = general_loop(ctx);
|
||||
if (!ret) ret = tmp;
|
||||
break;
|
||||
case CCX_SM_MCPOODLESRAW:
|
||||
mprint ("\rAnalyzing data in McPoodle raw mode\n");
|
||||
tmp = raw_loop(ctx);
|
||||
if (!ret) ret = tmp;
|
||||
break;
|
||||
case CCX_SM_RCWT:
|
||||
mprint ("\rAnalyzing data in CCExtractor's binary format\n");
|
||||
tmp = rcwt_loop(ctx);
|
||||
if (!ret) ret = tmp;
|
||||
break;
|
||||
case CCX_SM_MYTH:
|
||||
mprint ("\rAnalyzing data in MythTV mode\n");
|
||||
show_myth_banner = 1;
|
||||
tmp = myth_loop(ctx);
|
||||
if (!ret) ret = tmp;
|
||||
break;
|
||||
case CCX_SM_MP4:
|
||||
mprint ("\rAnalyzing data with GPAC (MP4 library)\n");
|
||||
close_input_file(ctx); // No need to have it open. GPAC will do it for us
|
||||
if (ctx->current_file == -1) // We don't have a file to open, must be stdin, and GPAC is incompatible with stdin
|
||||
{
|
||||
fatal (EXIT_INCOMPATIBLE_PARAMETERS, "MP4 requires an actual file, it's not possible to read from a stream, including stdin.\n");
|
||||
}
|
||||
if(api_options.extract_chapters)
|
||||
{
|
||||
tmp = dumpchapters(ctx, &ctx->mp4_cfg, ctx->inputfile[ctx->current_file]);
|
||||
}
|
||||
else
|
||||
{
|
||||
tmp = processmp4(ctx, &ctx->mp4_cfg, ctx->inputfile[ctx->current_file]);
|
||||
}
|
||||
if (api_options.print_file_reports)
|
||||
print_file_report(ctx);
|
||||
if (!ret) ret = tmp;
|
||||
break;
|
||||
case CCX_SM_MKV:
|
||||
mprint ("\rAnalyzing data in Matroska mode\n");
|
||||
tmp = matroska_loop(ctx);
|
||||
if (!ret) ret = tmp;
|
||||
break;
|
||||
if (!api_options.use_gop_as_pts) // If !0 then the user selected something
|
||||
api_options.use_gop_as_pts = 0;
|
||||
if (api_options.ignore_pts_jumps)
|
||||
ccx_common_timing_settings.disable_sync_check = 1;
|
||||
mprint("\rAnalyzing data in general mode\n");
|
||||
tmp = general_loop(ctx);
|
||||
if (!ret)
|
||||
ret = tmp;
|
||||
break;
|
||||
case CCX_SM_MCPOODLESRAW:
|
||||
mprint("\rAnalyzing data in McPoodle raw mode\n");
|
||||
tmp = raw_loop(ctx);
|
||||
if (!ret)
|
||||
ret = tmp;
|
||||
break;
|
||||
case CCX_SM_RCWT:
|
||||
mprint("\rAnalyzing data in CCExtractor's binary format\n");
|
||||
tmp = rcwt_loop(ctx);
|
||||
if (!ret)
|
||||
ret = tmp;
|
||||
break;
|
||||
case CCX_SM_MYTH:
|
||||
mprint("\rAnalyzing data in MythTV mode\n");
|
||||
show_myth_banner = 1;
|
||||
tmp = myth_loop(ctx);
|
||||
if (!ret)
|
||||
ret = tmp;
|
||||
break;
|
||||
case CCX_SM_MP4:
|
||||
mprint("\rAnalyzing data with GPAC (MP4 library)\n");
|
||||
close_input_file(ctx); // No need to have it open. GPAC will do it for us
|
||||
if (ctx->current_file == -1) // We don't have a file to open, must be stdin, and GPAC is incompatible with stdin
|
||||
{
|
||||
fatal(EXIT_INCOMPATIBLE_PARAMETERS, "MP4 requires an actual file, it's not possible to read from a stream, including stdin.\n");
|
||||
}
|
||||
if (api_options.extract_chapters)
|
||||
{
|
||||
tmp = dumpchapters(ctx, &ctx->mp4_cfg, ctx->inputfile[ctx->current_file]);
|
||||
}
|
||||
else
|
||||
{
|
||||
tmp = processmp4(ctx, &ctx->mp4_cfg, ctx->inputfile[ctx->current_file]);
|
||||
}
|
||||
if (api_options.print_file_reports)
|
||||
print_file_report(ctx);
|
||||
if (!ret)
|
||||
ret = tmp;
|
||||
break;
|
||||
case CCX_SM_MKV:
|
||||
mprint("\rAnalyzing data in Matroska mode\n");
|
||||
tmp = matroska_loop(ctx);
|
||||
if (!ret)
|
||||
ret = tmp;
|
||||
break;
|
||||
#ifdef WTV_DEBUG
|
||||
case CCX_SM_HEX_DUMP:
|
||||
case CCX_SM_HEX_DUMP:
|
||||
close_input_file(ctx); // process_hex will open it in text mode
|
||||
process_hex (ctx, ctx->inputfile[0]);
|
||||
process_hex(ctx, ctx->inputfile[0]);
|
||||
break;
|
||||
#endif
|
||||
case CCX_SM_AUTODETECT:
|
||||
fatal(CCX_COMMON_EXIT_BUG_BUG, "Cannot be reached!");
|
||||
break;
|
||||
}
|
||||
list_for_each_entry(dec_ctx, &ctx->dec_ctx_head, list, struct lib_cc_decode)
|
||||
{
|
||||
mprint("\n");
|
||||
dbg_print(CCX_DMT_DECODER_608, "\nTime stamps after last caption block was written:\n");
|
||||
dbg_print(CCX_DMT_DECODER_608, "GOP: %s \n", print_mstime_static(gop_time.ms) );
|
||||
case CCX_SM_AUTODETECT:
|
||||
fatal(CCX_COMMON_EXIT_BUG_BUG, "Cannot be reached!");
|
||||
break;
|
||||
}
|
||||
list_for_each_entry(dec_ctx, &ctx->dec_ctx_head, list, struct lib_cc_decode)
|
||||
{
|
||||
mprint("\n");
|
||||
dbg_print(CCX_DMT_DECODER_608, "\nTime stamps after last caption block was written:\n");
|
||||
dbg_print(CCX_DMT_DECODER_608, "GOP: %s \n", print_mstime_static(gop_time.ms));
|
||||
|
||||
dbg_print(CCX_DMT_DECODER_608, "GOP: %s (%+3dms incl.)\n",
|
||||
print_mstime_static((LLONG)(gop_time.ms
|
||||
-first_gop_time.ms
|
||||
+get_fts_max(dec_ctx->timing)-fts_at_gop_start)),
|
||||
(int)(get_fts_max(dec_ctx->timing)-fts_at_gop_start));
|
||||
// When padding is active the CC block time should be within
|
||||
// 1000/29.97 us of the differences.
|
||||
dbg_print(CCX_DMT_DECODER_608, "Max. FTS: %s (without caption blocks since then)\n",
|
||||
print_mstime_static(get_fts_max(dec_ctx->timing)));
|
||||
dbg_print(CCX_DMT_DECODER_608, "GOP: %s (%+3dms incl.)\n",
|
||||
print_mstime_static((LLONG)(gop_time.ms - first_gop_time.ms + get_fts_max(dec_ctx->timing) - fts_at_gop_start)),
|
||||
(int)(get_fts_max(dec_ctx->timing) - fts_at_gop_start));
|
||||
// When padding is active the CC block time should be within
|
||||
// 1000/29.97 us of the differences.
|
||||
dbg_print(CCX_DMT_DECODER_608, "Max. FTS: %s (without caption blocks since then)\n",
|
||||
print_mstime_static(get_fts_max(dec_ctx->timing)));
|
||||
|
||||
if (dec_ctx->codec == CCX_CODEC_ATSC_CC)
|
||||
{
|
||||
mprint ("\nTotal frames time: %s (%u frames at %.2ffps)\n",
|
||||
print_mstime_static( (LLONG)(total_frames_count*1000/current_fps) ),
|
||||
total_frames_count, current_fps);
|
||||
}
|
||||
if (dec_ctx->codec == CCX_CODEC_ATSC_CC)
|
||||
{
|
||||
mprint("\nTotal frames time: %s (%u frames at %.2ffps)\n",
|
||||
print_mstime_static((LLONG)(total_frames_count * 1000 / current_fps)),
|
||||
total_frames_count, current_fps);
|
||||
}
|
||||
|
||||
if (ctx->stat_hdtv)
|
||||
{
|
||||
mprint ("\rCC type 0: %d (%s)\n", dec_ctx->cc_stats[0], cc_types[0]);
|
||||
mprint ("CC type 1: %d (%s)\n", dec_ctx->cc_stats[1], cc_types[1]);
|
||||
mprint ("CC type 2: %d (%s)\n", dec_ctx->cc_stats[2], cc_types[2]);
|
||||
mprint ("CC type 3: %d (%s)\n", dec_ctx->cc_stats[3], cc_types[3]);
|
||||
}
|
||||
// Add one frame as fts_max marks the beginning of the last frame,
|
||||
// but we need the end.
|
||||
dec_ctx->timing->fts_global += dec_ctx->timing->fts_max + (LLONG) (1000.0/current_fps);
|
||||
// CFS: At least in Hauppage mode, cb_field can be responsible for ALL the
|
||||
// timing (cb_fields having a huge number and fts_now and fts_global being 0 all
|
||||
// the time), so we need to take that into account in fts_global before resetting
|
||||
// counters.
|
||||
if (cb_field1!=0)
|
||||
dec_ctx->timing->fts_global += cb_field1*1001/3;
|
||||
else if (cb_field2!=0)
|
||||
dec_ctx->timing->fts_global += cb_field2*1001/3;
|
||||
else
|
||||
dec_ctx->timing->fts_global += cb_708*1001/3;
|
||||
// Reset counters - This is needed if some captions are still buffered
|
||||
// and need to be written after the last file is processed.
|
||||
cb_field1 = 0; cb_field2 = 0; cb_708 = 0;
|
||||
dec_ctx->timing->fts_now = 0;
|
||||
dec_ctx->timing->fts_max = 0;
|
||||
if (dec_ctx->stat_hdtv)
|
||||
{
|
||||
mprint("\rCC type 0: %d (%s)\n", dec_ctx->cc_stats[0], cc_types[0]);
|
||||
mprint("CC type 1: %d (%s)\n", dec_ctx->cc_stats[1], cc_types[1]);
|
||||
mprint("CC type 2: %d (%s)\n", dec_ctx->cc_stats[2], cc_types[2]);
|
||||
mprint("CC type 3: %d (%s)\n", dec_ctx->cc_stats[3], cc_types[3]);
|
||||
}
|
||||
// Add one frame as fts_max marks the beginning of the last frame,
|
||||
// but we need the end.
|
||||
dec_ctx->timing->fts_global += dec_ctx->timing->fts_max + (LLONG)(1000.0 / current_fps);
|
||||
// CFS: At least in Hauppage mode, cb_field can be responsible for ALL the
|
||||
// timing (cb_fields having a huge number and fts_now and fts_global being 0 all
|
||||
// the time), so we need to take that into account in fts_global before resetting
|
||||
// counters.
|
||||
if (cb_field1 != 0)
|
||||
dec_ctx->timing->fts_global += cb_field1 * 1001 / 3;
|
||||
else if (cb_field2 != 0)
|
||||
dec_ctx->timing->fts_global += cb_field2 * 1001 / 3;
|
||||
else
|
||||
dec_ctx->timing->fts_global += cb_708 * 1001 / 3;
|
||||
// Reset counters - This is needed if some captions are still buffered
|
||||
// and need to be written after the last file is processed.
|
||||
cb_field1 = 0;
|
||||
cb_field2 = 0;
|
||||
cb_708 = 0;
|
||||
dec_ctx->timing->fts_now = 0;
|
||||
dec_ctx->timing->fts_max = 0;
|
||||
|
||||
#ifdef ENABLE_SHARING
|
||||
if (api_options.sharing_enabled)
|
||||
if (api_options.sharing_enabled)
|
||||
{
|
||||
ccx_share_stream_done(ctx->basefilename);
|
||||
ccx_share_stop();
|
||||
}
|
||||
#endif //ENABLE_SHARING
|
||||
|
||||
if (dec_ctx->total_pulldownframes)
|
||||
mprint ("incl. pulldown frames: %s (%u frames at %.2ffps)\n",
|
||||
print_mstime_static( (LLONG)(dec_ctx->total_pulldownframes*1000/current_fps) ),
|
||||
dec_ctx->total_pulldownframes, current_fps);
|
||||
if (dec_ctx->timing->pts_set >= 1 && dec_ctx->timing->min_pts != 0x01FFFFFFFFLL)
|
||||
{
|
||||
LLONG postsyncms = (LLONG) (dec_ctx->frames_since_last_gop*1000/current_fps);
|
||||
mprint ("\nMin PTS: %s\n",
|
||||
print_mstime_static( dec_ctx->timing->min_pts/(MPEG_CLOCK_FREQ/1000) - dec_ctx->timing->fts_offset));
|
||||
if (pts_big_change)
|
||||
mprint ("(Reference clock was reset at some point, Min PTS is approximated)\n");
|
||||
mprint ("Max PTS: %s\n",
|
||||
print_mstime_static( dec_ctx->timing->sync_pts/(MPEG_CLOCK_FREQ/1000) + postsyncms));
|
||||
if (dec_ctx->total_pulldownframes)
|
||||
mprint("incl. pulldown frames: %s (%u frames at %.2ffps)\n",
|
||||
print_mstime_static((LLONG)(dec_ctx->total_pulldownframes * 1000 / current_fps)),
|
||||
dec_ctx->total_pulldownframes, current_fps);
|
||||
if (dec_ctx->timing->pts_set >= 1 && dec_ctx->timing->min_pts != 0x01FFFFFFFFLL)
|
||||
{
|
||||
LLONG postsyncms = (LLONG)(dec_ctx->frames_since_last_gop * 1000 / current_fps);
|
||||
mprint("\nMin PTS: %s\n",
|
||||
print_mstime_static(dec_ctx->timing->min_pts / (MPEG_CLOCK_FREQ / 1000) - dec_ctx->timing->fts_offset));
|
||||
if (pts_big_change)
|
||||
mprint("(Reference clock was reset at some point, Min PTS is approximated)\n");
|
||||
mprint("Max PTS: %s\n",
|
||||
print_mstime_static(dec_ctx->timing->sync_pts / (MPEG_CLOCK_FREQ / 1000) + postsyncms));
|
||||
|
||||
mprint ("Length: %s\n",
|
||||
print_mstime_static( dec_ctx->timing->sync_pts/(MPEG_CLOCK_FREQ/1000) + postsyncms
|
||||
- dec_ctx->timing->min_pts/(MPEG_CLOCK_FREQ/1000) + dec_ctx->timing->fts_offset ));
|
||||
}
|
||||
mprint("Length: %s\n",
|
||||
print_mstime_static(dec_ctx->timing->sync_pts / (MPEG_CLOCK_FREQ / 1000) + postsyncms - dec_ctx->timing->min_pts / (MPEG_CLOCK_FREQ / 1000) + dec_ctx->timing->fts_offset));
|
||||
}
|
||||
|
||||
// dvr-ms files have invalid GOPs
|
||||
if (gop_time.inited && first_gop_time.inited && stream_mode != CCX_SM_ASF)
|
||||
{
|
||||
mprint("\nInitial GOP time: %s\n",
|
||||
print_mstime_static(first_gop_time.ms));
|
||||
mprint("Final GOP time: %s%+3dF\n",
|
||||
print_mstime_static(gop_time.ms),
|
||||
dec_ctx->frames_since_last_gop);
|
||||
mprint("Diff. GOP length: %s%+3dF",
|
||||
print_mstime_static(gop_time.ms - first_gop_time.ms),
|
||||
dec_ctx->frames_since_last_gop);
|
||||
mprint(" (%s)\n\n",
|
||||
print_mstime_static(gop_time.ms - first_gop_time.ms + (LLONG)((dec_ctx->frames_since_last_gop) * 1000 / 29.97)));
|
||||
}
|
||||
|
||||
// dvr-ms files have invalid GOPs
|
||||
if (gop_time.inited && first_gop_time.inited && stream_mode != CCX_SM_ASF)
|
||||
{
|
||||
mprint ("\nInitial GOP time: %s\n",
|
||||
print_mstime_static(first_gop_time.ms));
|
||||
mprint ("Final GOP time: %s%+3dF\n",
|
||||
print_mstime_static(gop_time.ms),
|
||||
dec_ctx->frames_since_last_gop);
|
||||
mprint ("Diff. GOP length: %s%+3dF",
|
||||
print_mstime_static(gop_time.ms - first_gop_time.ms),
|
||||
dec_ctx->frames_since_last_gop);
|
||||
mprint (" (%s)\n\n",
|
||||
print_mstime_static(gop_time.ms - first_gop_time.ms
|
||||
+(LLONG) ((dec_ctx->frames_since_last_gop)*1000/29.97)) );
|
||||
}
|
||||
if (dec_ctx->false_pict_header)
|
||||
mprint("Number of likely false picture headers (discarded): %d\n", dec_ctx->false_pict_header);
|
||||
if (dec_ctx->num_key_frames)
|
||||
mprint("Number of key frames: %d\n", dec_ctx->num_key_frames);
|
||||
|
||||
if (dec_ctx->false_pict_header)
|
||||
mprint ("Number of likely false picture headers (discarded): %d\n",dec_ctx->false_pict_header);
|
||||
if (dec_ctx->num_key_frames)
|
||||
mprint("Number of key frames: %d\n", dec_ctx->num_key_frames);
|
||||
if (dec_ctx->stat_numuserheaders)
|
||||
mprint("Total user data fields: %d\n", dec_ctx->stat_numuserheaders);
|
||||
if (dec_ctx->stat_dvdccheaders)
|
||||
mprint("DVD-type user data fields: %d\n", dec_ctx->stat_dvdccheaders);
|
||||
if (dec_ctx->stat_scte20ccheaders)
|
||||
mprint("SCTE-20 type user data fields: %d\n", dec_ctx->stat_scte20ccheaders);
|
||||
if (dec_ctx->stat_replay4000headers)
|
||||
mprint("ReplayTV 4000 user data fields: %d\n", dec_ctx->stat_replay4000headers);
|
||||
if (dec_ctx->stat_replay5000headers)
|
||||
mprint("ReplayTV 5000 user data fields: %d\n", dec_ctx->stat_replay5000headers);
|
||||
if (dec_ctx->stat_hdtv)
|
||||
mprint("HDTV type user data fields: %d\n", dec_ctx->stat_hdtv);
|
||||
if (dec_ctx->stat_dishheaders)
|
||||
mprint("Dish Network user data fields: %d\n", dec_ctx->stat_dishheaders);
|
||||
if (dec_ctx->stat_divicom)
|
||||
{
|
||||
mprint("CEA608/Divicom user data fields: %d\n", dec_ctx->stat_divicom);
|
||||
|
||||
if (dec_ctx->stat_numuserheaders)
|
||||
mprint("Total user data fields: %d\n", dec_ctx->stat_numuserheaders);
|
||||
if (dec_ctx->stat_dvdccheaders)
|
||||
mprint("DVD-type user data fields: %d\n", dec_ctx->stat_dvdccheaders);
|
||||
if (dec_ctx->stat_scte20ccheaders)
|
||||
mprint("SCTE-20 type user data fields: %d\n", dec_ctx->stat_scte20ccheaders);
|
||||
if (dec_ctx->stat_replay4000headers)
|
||||
mprint("ReplayTV 4000 user data fields: %d\n", dec_ctx->stat_replay4000headers);
|
||||
if (dec_ctx->stat_replay5000headers)
|
||||
mprint("ReplayTV 5000 user data fields: %d\n", dec_ctx->stat_replay5000headers);
|
||||
if (dec_ctx->stat_hdtv)
|
||||
mprint("HDTV type user data fields: %d\n", dec_ctx->stat_hdtv);
|
||||
if (dec_ctx->stat_dishheaders)
|
||||
mprint("Dish Network user data fields: %d\n", dec_ctx->stat_dishheaders);
|
||||
if (dec_ctx->stat_divicom)
|
||||
{
|
||||
mprint("CEA608/Divicom user data fields: %d\n", dec_ctx->stat_divicom);
|
||||
mprint("\n\nNOTE! The CEA 608 / Divicom standard encoding for closed\n");
|
||||
mprint("caption is not well understood!\n\n");
|
||||
mprint("Please submit samples to the developers.\n\n\n");
|
||||
}
|
||||
}
|
||||
|
||||
mprint("\n\nNOTE! The CEA 608 / Divicom standard encoding for closed\n");
|
||||
mprint("caption is not well understood!\n\n");
|
||||
mprint("Please submit samples to the developers.\n\n\n");
|
||||
}
|
||||
if (is_decoder_processed_enough(ctx) == CCX_TRUE)
|
||||
break;
|
||||
} // file loop
|
||||
close_input_file(ctx);
|
||||
|
||||
}
|
||||
prepare_for_new_file(ctx); // To reset counters used by handle_end_of_data()
|
||||
|
||||
if(is_decoder_processed_enough(ctx) == CCX_TRUE)
|
||||
break;
|
||||
} // file loop
|
||||
close_input_file(ctx);
|
||||
free((void *) ctx->extension);
|
||||
time(&final);
|
||||
|
||||
prepare_for_new_file (ctx); // To reset counters used by handle_end_of_data()
|
||||
|
||||
|
||||
time (&final);
|
||||
|
||||
long proc_time=(long) (final-start);
|
||||
mprint ("\rDone, processing time = %ld seconds\n", proc_time);
|
||||
long proc_time = (long)(final - start);
|
||||
mprint("\rDone, processing time = %ld seconds\n", proc_time);
|
||||
#if 0
|
||||
if (proc_time>0)
|
||||
if (proc_time > 0)
|
||||
{
|
||||
LLONG ratio=(get_fts_max()/10)/proc_time;
|
||||
unsigned s1=(unsigned) (ratio/100);
|
||||
unsigned s2=(unsigned) (ratio%100);
|
||||
mprint ("Performance (real length/process time) = %u.%02u\n",
|
||||
LLONG ratio = (get_fts_max() / 10) / proc_time;
|
||||
unsigned s1 = (unsigned)(ratio / 100);
|
||||
unsigned s2 = (unsigned)(ratio % 100);
|
||||
mprint("Performance (real length/process time) = %u.%02u\n",
|
||||
s1, s2);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (is_decoder_processed_enough(ctx) == CCX_TRUE)
|
||||
{
|
||||
mprint ("\rNote: Processing was canceled before all data was processed because\n");
|
||||
mprint ("\rone or more user-defined limits were reached.\n");
|
||||
}
|
||||
if (is_decoder_processed_enough(ctx) == CCX_TRUE)
|
||||
{
|
||||
mprint("\rNote: Processing was canceled before all data was processed because\n");
|
||||
mprint("\rone or more user-defined limits were reached.\n");
|
||||
}
|
||||
|
||||
#ifdef CURL
|
||||
if (curl)
|
||||
if (curl)
|
||||
curl_easy_cleanup(curl);
|
||||
curl_global_cleanup();
|
||||
curl_global_cleanup();
|
||||
#endif
|
||||
dinit_libraries(&ctx);
|
||||
dinit_libraries(&ctx);
|
||||
|
||||
if (!ret)
|
||||
mprint("\nNo captions were found in input.\n");
|
||||
if (!ret)
|
||||
mprint("\nNo captions were found in input.\n");
|
||||
|
||||
print_end_msg();
|
||||
print_end_msg();
|
||||
|
||||
if (show_myth_banner)
|
||||
{
|
||||
mprint("NOTICE: Due to the major rework in 0.49, we needed to change part of the timing\n");
|
||||
mprint("code in the MythTV's branch. Please report results to the address above. If\n");
|
||||
mprint("something is broken it will be fixed. Thanks\n");
|
||||
}
|
||||
return ret ? EXIT_OK : EXIT_NO_CAPTIONS;
|
||||
if (show_myth_banner)
|
||||
{
|
||||
mprint("NOTICE: Due to the major rework in 0.49, we needed to change part of the timing\n");
|
||||
mprint("code in the MythTV's branch. Please report results to the address above. If\n");
|
||||
mprint("something is broken it will be fixed. Thanks\n");
|
||||
}
|
||||
return ret ? EXIT_OK : EXIT_NO_CAPTIONS;
|
||||
}
|
||||
|
||||
struct ccx_s_options* api_init_options()
|
||||
struct ccx_s_options *api_init_options()
|
||||
{
|
||||
init_options(&ccx_options);
|
||||
return &ccx_options;
|
||||
init_options(&ccx_options);
|
||||
return &ccx_options;
|
||||
}
|
||||
|
||||
void check_configuration_file(struct ccx_s_options api_options)
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
parse_configuration(&api_options);
|
||||
}
|
||||
|
||||
#ifdef PYTHON_API
|
||||
int compile_params(struct ccx_s_options *api_options,int argc)
|
||||
{
|
||||
//adding the parameter ./ccextractor to the list of python_params for further parsing
|
||||
api_options->python_params = realloc(api_options->python_params, (api_options->python_param_count+1) * sizeof *api_options->python_params);
|
||||
api_options->python_params[api_options->python_param_count] = malloc(strlen("./ccextractor")+1);
|
||||
strcpy(api_options->python_params[api_options->python_param_count], "./ccextractor");
|
||||
api_options->python_param_count++;
|
||||
|
||||
char* temp = api_options->python_params[api_options->python_param_count-1];
|
||||
for (int i = api_options->python_param_count-1; i > 0; i--)
|
||||
api_options->python_params[i] = api_options->python_params[i-1];
|
||||
api_options->python_params[0] = temp;
|
||||
|
||||
int ret = parse_parameters (api_options, api_options->python_param_count, api_options->python_params);
|
||||
api_options->messages_target = CCX_MESSAGES_QUIET;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void api_add_param(struct ccx_s_options* api_options,char* arg)
|
||||
{
|
||||
api_options->python_params = realloc(api_options->python_params, (api_options->python_param_count+1) * sizeof *api_options->python_params);
|
||||
api_options->python_params[api_options->python_param_count] = malloc(strlen(arg)+1);
|
||||
strcpy(api_options->python_params[api_options->python_param_count], arg);
|
||||
api_options->python_param_count++;
|
||||
}
|
||||
|
||||
void py_callback(char *line, int encoding)
|
||||
{
|
||||
assert ( PyFunction_Check(py_callback_func) );
|
||||
PyObject* args = Py_BuildValue("(si)",line,encoding);
|
||||
PyObject_CallObject((PyObject*)py_callback_func, args);
|
||||
}
|
||||
|
||||
/*
|
||||
* Helper function to print the i-th param submitted by the user.
|
||||
* Helpful for debugging
|
||||
*/
|
||||
char * api_param(struct ccx_s_options* api_options, int count)
|
||||
{
|
||||
return api_options->python_params[count];
|
||||
}
|
||||
|
||||
/*
|
||||
* Helper function to get the total number of params provided by the user.
|
||||
* Helpful for debugging
|
||||
*/
|
||||
int api_param_count(struct ccx_s_options* api_options)
|
||||
{
|
||||
return api_options->python_param_count;
|
||||
}
|
||||
#endif // PYTHON_API
|
||||
|
||||
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
struct ccx_s_options* api_options = api_init_options();
|
||||
check_configuration_file(*api_options);
|
||||
#ifdef PYTHON_API
|
||||
for(int i = 1; i < argc; i++)
|
||||
api_add_param(api_options,argv[i]);
|
||||
#endif
|
||||
|
||||
#ifdef PYTHON_API
|
||||
int compile_ret = compile_params(api_options,argc);
|
||||
#else
|
||||
int compile_ret = parse_parameters (api_options, argc, argv);
|
||||
#endif
|
||||
|
||||
if (compile_ret == EXIT_NO_INPUT_FILES)
|
||||
{
|
||||
print_usage ();
|
||||
fatal (EXIT_NO_INPUT_FILES, "(This help screen was shown because there were no input files)\n");
|
||||
}
|
||||
else if (compile_ret == EXIT_WITH_HELP)
|
||||
{
|
||||
return EXIT_OK;
|
||||
}
|
||||
else if (compile_ret != EXIT_OK)
|
||||
{
|
||||
exit(compile_ret);
|
||||
}
|
||||
|
||||
int start_ret = api_start(*api_options);
|
||||
return start_ret;
|
||||
setlocale(LC_ALL, ""); // Supports non-English CCs
|
||||
|
||||
struct ccx_s_options *api_options = api_init_options();
|
||||
parse_configuration(api_options);
|
||||
// If "ccextractor.cnf" is present, takes options from it.
|
||||
// See docs/ccextractor.cnf.sample for more info.
|
||||
|
||||
int compile_ret = parse_parameters(api_options, argc, argv);
|
||||
|
||||
if (compile_ret == EXIT_NO_INPUT_FILES)
|
||||
{
|
||||
print_usage();
|
||||
fatal(EXIT_NO_INPUT_FILES, "(This help screen was shown because there were no input files)\n");
|
||||
}
|
||||
else if (compile_ret == EXIT_WITH_HELP)
|
||||
{
|
||||
return EXIT_OK;
|
||||
}
|
||||
else if (compile_ret != EXIT_OK)
|
||||
{
|
||||
exit(compile_ret);
|
||||
}
|
||||
|
||||
int start_ret = api_start(*api_options);
|
||||
return start_ret;
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_OCR
|
||||
#include <allheaders.h>
|
||||
#include <leptonica/allheaders.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
@@ -28,25 +28,12 @@ CURLcode res;
|
||||
#define LEPT_MSG_SEVERITY L_SEVERITY_NONE
|
||||
#endif
|
||||
|
||||
#ifdef PYTHON_API
|
||||
#include "Python.h"
|
||||
#include "funcobject.h"
|
||||
|
||||
PyObject* py_callback_func;
|
||||
void api_add_param(struct ccx_s_options* api_options,char* arg);
|
||||
int compile_params(struct ccx_s_options *api_options,int argc);
|
||||
void py_callback(char *line, int encoding);
|
||||
int api_param_count(struct ccx_s_options* api_options);
|
||||
char * api_param(struct ccx_s_options* api_options, int count);
|
||||
#endif
|
||||
|
||||
|
||||
struct ccx_s_options ccx_options;
|
||||
struct lib_ccx_ctx *signal_ctx;
|
||||
extern struct ccx_s_options ccx_options;
|
||||
extern struct lib_ccx_ctx *signal_ctx;
|
||||
//volatile int terminate_asap = 0;
|
||||
|
||||
struct ccx_s_options* api_init_options();
|
||||
void check_configuration_file(struct ccx_s_options api_options);
|
||||
|
||||
int api_start(struct ccx_s_options api_options);
|
||||
|
||||
|
||||
|
||||
@@ -1,309 +0,0 @@
|
||||
/*
|
||||
* GPAC - Multimedia Framework C SDK
|
||||
*
|
||||
* Authors: Jean Le Feuvre
|
||||
* Copyright (c) Telecom ParisTech 2006-2012
|
||||
* All rights reserved
|
||||
*
|
||||
* This file is part of GPAC / ISO Media File Format sub-project
|
||||
*
|
||||
* GPAC is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* GPAC is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <gpac/internal/isomedia_dev.h>
|
||||
|
||||
#ifndef GPAC_DISABLE_ISOM
|
||||
|
||||
void ilst_del(GF_Box *s)
|
||||
{
|
||||
GF_ItemListBox *ptr = (GF_ItemListBox *)s;
|
||||
if (ptr == NULL) return;
|
||||
gf_free(ptr);
|
||||
}
|
||||
|
||||
GF_Err ilst_Read(GF_Box *s, GF_BitStream *bs)
|
||||
{
|
||||
GF_Err e;
|
||||
u32 sub_type;
|
||||
GF_Box *a;
|
||||
GF_ItemListBox *ptr = (GF_ItemListBox *)s;
|
||||
while (ptr->size) {
|
||||
/*if no ilst type coded, break*/
|
||||
sub_type = gf_bs_peek_bits(bs, 32, 0);
|
||||
if (sub_type) {
|
||||
e = gf_isom_box_parse(&a, bs);
|
||||
if (e) return e;
|
||||
ISOM_DECREASE_SIZE(ptr, a->size);
|
||||
gf_list_add(ptr->other_boxes, a);
|
||||
} else {
|
||||
gf_bs_read_u32(bs);
|
||||
ISOM_DECREASE_SIZE(ptr, 4);
|
||||
}
|
||||
}
|
||||
return GF_OK;
|
||||
}
|
||||
|
||||
GF_Box *ilst_New()
|
||||
{
|
||||
ISOM_DECL_BOX_ALLOC(GF_ItemListBox, GF_ISOM_BOX_TYPE_ILST);
|
||||
tmp->other_boxes = gf_list_new();
|
||||
return (GF_Box *)tmp;
|
||||
}
|
||||
|
||||
#ifndef GPAC_DISABLE_ISOM_WRITE
|
||||
|
||||
GF_Err ilst_Write(GF_Box *s, GF_BitStream *bs)
|
||||
{
|
||||
GF_Err e;
|
||||
// GF_ItemListBox *ptr = (GF_ItemListBox *)s;
|
||||
|
||||
e = gf_isom_box_write_header(s, bs);
|
||||
if (e) return e;
|
||||
|
||||
return GF_OK;
|
||||
}
|
||||
|
||||
|
||||
GF_Err ilst_Size(GF_Box *s)
|
||||
{
|
||||
return GF_OK;
|
||||
}
|
||||
|
||||
#endif /*GPAC_DISABLE_ISOM_WRITE*/
|
||||
|
||||
void ilst_item_del(GF_Box *s)
|
||||
{
|
||||
GF_ListItemBox *ptr = (GF_ListItemBox *) s;
|
||||
if (ptr == NULL) return;
|
||||
if (ptr->data != NULL) {
|
||||
if (ptr->data->data) gf_free(ptr->data->data);
|
||||
gf_free(ptr->data);
|
||||
}
|
||||
gf_free(ptr);
|
||||
}
|
||||
|
||||
GF_Err ilst_item_Read(GF_Box *s,GF_BitStream *bs)
|
||||
{
|
||||
GF_Err e;
|
||||
u32 sub_type;
|
||||
GF_Box *a = NULL;
|
||||
GF_ListItemBox *ptr = (GF_ListItemBox *)s;
|
||||
|
||||
/*iTunes way: there's a data atom containing the data*/
|
||||
sub_type = gf_bs_peek_bits(bs, 32, 4);
|
||||
if (sub_type == GF_ISOM_BOX_TYPE_DATA ) {
|
||||
e = gf_isom_box_parse(&a, bs);
|
||||
if (e) return e;
|
||||
ISOM_DECREASE_SIZE(ptr, a->size);
|
||||
|
||||
if (a && ptr->data) gf_isom_box_del((GF_Box *) ptr->data);
|
||||
ptr->data = (GF_DataBox *)a;
|
||||
}
|
||||
/*QT way*/
|
||||
else {
|
||||
ptr->data->type = 0;
|
||||
ptr->data->dataSize = gf_bs_read_u16(bs);
|
||||
gf_bs_read_u16(bs);
|
||||
ptr->data->data = (char *) gf_malloc(sizeof(char)*(ptr->data->dataSize + 1));
|
||||
gf_bs_read_data(bs, ptr->data->data, ptr->data->dataSize);
|
||||
ptr->data->data[ptr->data->dataSize] = 0;
|
||||
ISOM_DECREASE_SIZE(ptr, ptr->data->dataSize);
|
||||
}
|
||||
return GF_OK;
|
||||
}
|
||||
|
||||
GF_Box *ilst_item_New(u32 type)
|
||||
{
|
||||
ISOM_DECL_BOX_ALLOC(GF_ListItemBox, type);
|
||||
|
||||
tmp->data = (GF_DataBox *)gf_isom_box_new(GF_ISOM_BOX_TYPE_DATA);
|
||||
|
||||
if (tmp->data == NULL) {
|
||||
gf_free(tmp);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return (GF_Box *)tmp;
|
||||
}
|
||||
|
||||
#ifndef GPAC_DISABLE_ISOM_WRITE
|
||||
|
||||
GF_Err ilst_item_Write(GF_Box *s, GF_BitStream *bs)
|
||||
{
|
||||
GF_Err e;
|
||||
GF_ListItemBox *ptr = (GF_ListItemBox *) s;
|
||||
|
||||
e = gf_isom_box_write_header(s, bs);
|
||||
if (e) return e;
|
||||
|
||||
/*iTune way*/
|
||||
if (ptr->data->type) return gf_isom_box_write((GF_Box* )ptr->data, bs);
|
||||
/*QT way*/
|
||||
gf_bs_write_u16(bs, ptr->data->dataSize);
|
||||
gf_bs_write_u16(bs, 0);
|
||||
gf_bs_write_data(bs, ptr->data->data, ptr->data->dataSize);
|
||||
return GF_OK;
|
||||
}
|
||||
|
||||
GF_Err ilst_item_Size(GF_Box *s)
|
||||
{
|
||||
GF_Err e;
|
||||
GF_ListItemBox *ptr = (GF_ListItemBox *)s;
|
||||
|
||||
/*iTune way*/
|
||||
if (ptr->data && ptr->data->type) {
|
||||
e = gf_isom_box_size((GF_Box *)ptr->data);
|
||||
if (e) return e;
|
||||
ptr->size += ptr->data->size;
|
||||
}
|
||||
/*QT way*/
|
||||
else if (ptr->data) {
|
||||
ptr->size += ptr->data->dataSize + 4;
|
||||
}
|
||||
return GF_OK;
|
||||
}
|
||||
|
||||
#endif /*GPAC_DISABLE_ISOM_WRITE*/
|
||||
|
||||
void databox_del(GF_Box *s)
|
||||
{
|
||||
GF_DataBox *ptr = (GF_DataBox *) s;
|
||||
if (ptr == NULL) return;
|
||||
if (ptr->data)
|
||||
gf_free(ptr->data);
|
||||
gf_free(ptr);
|
||||
|
||||
}
|
||||
|
||||
GF_Err databox_Read(GF_Box *s,GF_BitStream *bs)
|
||||
{
|
||||
GF_DataBox *ptr = (GF_DataBox *)s;
|
||||
|
||||
ptr->reserved = gf_bs_read_int(bs, 32);
|
||||
ISOM_DECREASE_SIZE(ptr, 4);
|
||||
|
||||
if (ptr->size) {
|
||||
ptr->dataSize = (u32) ptr->size;
|
||||
ptr->data = (char*)gf_malloc(ptr->dataSize * sizeof(ptr->data[0]) + 1);
|
||||
if (ptr->data == NULL) return GF_OUT_OF_MEM;
|
||||
ptr->data[ptr->dataSize] = 0;
|
||||
gf_bs_read_data(bs, ptr->data, ptr->dataSize);
|
||||
}
|
||||
|
||||
return GF_OK;
|
||||
}
|
||||
|
||||
GF_Box *databox_New()
|
||||
{
|
||||
ISOM_DECL_BOX_ALLOC(GF_DataBox, GF_ISOM_BOX_TYPE_DATA);
|
||||
|
||||
return (GF_Box *)tmp;
|
||||
}
|
||||
|
||||
#ifndef GPAC_DISABLE_ISOM_WRITE
|
||||
|
||||
GF_Err databox_Write(GF_Box *s, GF_BitStream *bs)
|
||||
{
|
||||
GF_Err e;
|
||||
GF_DataBox *ptr = (GF_DataBox *) s;
|
||||
|
||||
e = gf_isom_full_box_write(s, bs);
|
||||
if (e) return e;
|
||||
gf_bs_write_int(bs, ptr->reserved, 32);
|
||||
if(ptr->data != NULL && ptr->dataSize > 0) {
|
||||
gf_bs_write_data(bs, ptr->data, ptr->dataSize);
|
||||
}
|
||||
return GF_OK;
|
||||
}
|
||||
|
||||
GF_Err databox_Size(GF_Box *s)
|
||||
{
|
||||
GF_DataBox *ptr = (GF_DataBox *)s;
|
||||
|
||||
ptr->size += 4;
|
||||
if(ptr->data != NULL && ptr->dataSize > 0) {
|
||||
ptr->size += ptr->dataSize;
|
||||
}
|
||||
return GF_OK;
|
||||
}
|
||||
|
||||
#endif /*GPAC_DISABLE_ISOM_WRITE*/
|
||||
|
||||
GF_MetaBox *gf_isom_apple_get_meta_extensions(GF_ISOFile *mov)
|
||||
{
|
||||
u32 i;
|
||||
GF_MetaBox *meta;
|
||||
GF_UserDataMap *map;
|
||||
|
||||
if (!mov || !mov->moov) return NULL;
|
||||
|
||||
if (!mov->moov->udta) return NULL;
|
||||
map = udta_getEntry(mov->moov->udta, GF_ISOM_BOX_TYPE_META, NULL);
|
||||
if (!map) return NULL;
|
||||
|
||||
for(i = 0; i < gf_list_count(map->other_boxes); i++) {
|
||||
meta = (GF_MetaBox*)gf_list_get(map->other_boxes, i);
|
||||
|
||||
if(meta != NULL && meta->handler != NULL && meta->handler->handlerType == GF_ISOM_HANDLER_TYPE_MDIR) return meta;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#ifndef GPAC_DISABLE_ISOM_WRITE
|
||||
GF_MetaBox *gf_isom_apple_create_meta_extensions(GF_ISOFile *mov)
|
||||
{
|
||||
GF_Err e;
|
||||
u32 i;
|
||||
GF_MetaBox *meta;
|
||||
GF_UserDataMap *map;
|
||||
|
||||
if (!mov || !mov->moov) return NULL;
|
||||
|
||||
if (!mov->moov->udta) {
|
||||
e = moov_AddBox((GF_Box*)mov->moov, gf_isom_box_new(GF_ISOM_BOX_TYPE_UDTA));
|
||||
if (e) return NULL;
|
||||
}
|
||||
|
||||
map = udta_getEntry(mov->moov->udta, GF_ISOM_BOX_TYPE_META, NULL);
|
||||
if (map) {
|
||||
for(i = 0; i < gf_list_count(map->other_boxes); i++) {
|
||||
meta = (GF_MetaBox*)gf_list_get(map->other_boxes, i);
|
||||
|
||||
if(meta != NULL && meta->handler != NULL && meta->handler->handlerType == GF_ISOM_HANDLER_TYPE_MDIR) return meta;
|
||||
}
|
||||
}
|
||||
|
||||
meta = (GF_MetaBox *)gf_isom_box_new(GF_ISOM_BOX_TYPE_META);
|
||||
|
||||
if(meta != NULL) {
|
||||
meta->handler = (GF_HandlerBox *)gf_isom_box_new(GF_ISOM_BOX_TYPE_HDLR);
|
||||
if(meta->handler == NULL) {
|
||||
gf_isom_box_del((GF_Box *)meta);
|
||||
return NULL;
|
||||
}
|
||||
meta->handler->handlerType = GF_ISOM_HANDLER_TYPE_MDIR;
|
||||
if (!meta->other_boxes) meta->other_boxes = gf_list_new();
|
||||
gf_list_add(meta->other_boxes, gf_isom_box_new(GF_ISOM_BOX_TYPE_ILST));
|
||||
udta_AddBox((GF_Box *)mov->moov->udta, (GF_Box *)meta);
|
||||
}
|
||||
|
||||
return meta;
|
||||
}
|
||||
#endif /*GPAC_DISABLE_ISOM_WRITE*/
|
||||
|
||||
|
||||
#endif /*GPAC_DISABLE_ISOM*/
|
||||