New upstream release.
Debian Janitor
2 years ago
0 | name: Build and run tests | |
1 | on: [push, pull_request] | |
2 | env: | |
3 | app_id: inputstream.adaptive | |
4 | ||
5 | jobs: | |
6 | build: | |
7 | runs-on: ${{ matrix.os }} | |
8 | strategy: | |
9 | fail-fast: false | |
10 | matrix: | |
11 | include: | |
12 | - os: ubuntu-18.04 | |
13 | CC: gcc | |
14 | CXX: g++ | |
15 | - os: ubuntu-18.04 | |
16 | CC: clang | |
17 | CXX: clang++ | |
18 | - os: macos-10.15 | |
19 | steps: | |
20 | - name: Checkout Kodi repo | |
21 | uses: actions/checkout@v2 | |
22 | with: | |
23 | repository: xbmc/xbmc | |
24 | ref: Matrix | |
25 | path: xbmc | |
26 | - name: Checkout inputstream.adaptive repo | |
27 | uses: actions/checkout@v2 | |
28 | with: | |
29 | path: ${{ env.app_id }} | |
30 | - name: Configure | |
31 | env: | |
32 | CC: ${{ matrix.CC }} | |
33 | CXX: ${{ matrix.CXX }} | |
34 | run: | | |
35 | cd ${app_id} && mkdir -p build && cd build | |
36 | cmake -DADDONS_TO_BUILD=${app_id} -DADDON_SRC_PREFIX=${{ github.workspace }} -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/xbmc/addons -DPACKAGE_ZIP=1 ${{ github.workspace }}/xbmc/cmake/addons | |
37 | - name: Build | |
38 | env: | |
39 | CC: ${{ matrix.CC }} | |
40 | CXX: ${{ matrix.CXX }} | |
41 | run: | | |
42 | cd ${app_id}/build | |
43 | make | |
44 | - name: Run tests | |
45 | run: | | |
46 | cd ${app_id}/build/${app_id}-prefix/src/${app_id}-build | |
47 | make CTEST_OUTPUT_ON_FAILURE=1 GTEST_COLOR=1 test |
0 | name: Changelog and Release | |
1 | # Update the changelog and news(optionally), bump the version, and create a release | |
2 | # | |
3 | # The release is created on the given branch, release and tag name format will be <version>-<branch> and | |
4 | # the body of the release will be created from the changelog.txt or news element in the addon.xml.in | |
5 | # | |
6 | # options: | |
7 | # - version_type: 'minor' / 'micro' # whether to do a minor or micro version bump | |
8 | # - changelog_text: string to add to the changelog and news | |
9 | # - update_news: 'true' / 'false' # whether to update the news in the addon.xml.in | |
10 | # - add_date: 'true' / 'false' # Add date to version number in changelog and news. ie. v1.0.1 (2021-7-17) | |
11 | ||
12 | on: | |
13 | workflow_dispatch: | |
14 | inputs: | |
15 | version_type: | |
16 | description: 'Create a ''minor'' or ''micro'' release?' | |
17 | required: true | |
18 | default: 'minor' | |
19 | changelog_text: | |
20 | description: 'Input the changes you''d like to add to the changelogs. Your text should be encapsulated in "''s with line feeds represented by literal \n''s. ie. "This is the first change\nThis is the second change"' | |
21 | required: true | |
22 | default: '' | |
23 | update_news: | |
24 | description: 'Update news in addon.xml.in? [true|false]' | |
25 | required: true | |
26 | default: 'true' | |
27 | add_date: | |
28 | description: 'Add date to version number in changelog and news. ie. "v1.0.1 (2021-7-17)" [true|false]' | |
29 | required: true | |
30 | default: 'true' | |
31 | ||
32 | jobs: | |
33 | default: | |
34 | runs-on: ubuntu-latest | |
35 | name: Changelog and Release | |
36 | ||
37 | steps: | |
38 | ||
39 | # Checkout the current repository into a directory (repositories name) | |
40 | - name: Checkout Repository | |
41 | uses: actions/checkout@v2 | |
42 | with: | |
43 | fetch-depth: 0 | |
44 | path: ${{ github.event.repository.name }} | |
45 | ||
46 | # Checkout the required scripts from kodi-pvr/pvr-scripts into the 'scripts' directory | |
47 | - name: Checkout Scripts | |
48 | uses: actions/checkout@v2 | |
49 | with: | |
50 | fetch-depth: 0 | |
51 | repository: kodi-pvr/pvr-scripts | |
52 | path: scripts | |
53 | ||
54 | # Install all dependencies required by the following steps | |
55 | # - libxml2-utils, xmlstarlet: reading news and version from addon.xml.in | |
56 | - name: Install dependencies | |
57 | run: | | |
58 | sudo apt-get install libxml2-utils xmlstarlet | |
59 | ||
60 | # Setup python version 3.9 | |
61 | - name: Set up Python | |
62 | uses: actions/setup-python@v2 | |
63 | with: | |
64 | python-version: '3.9' | |
65 | ||
66 | # Run the python script to increment the version, changelog and news | |
67 | - name: Increment version and update changelogs | |
68 | run: | | |
69 | arguments= | |
70 | if [[ ${{ github.event.inputs.update_news }} == true ]] ; | |
71 | then | |
72 | arguments=$(echo $arguments && echo --update-news) | |
73 | fi | |
74 | if [[ ${{ github.event.inputs.add_date }} == true ]] ; | |
75 | then | |
76 | arguments=$(echo $arguments && echo --add-date) | |
77 | fi | |
78 | python3 ../scripts/changelog_and_release.py ${{ github.event.inputs.version_type }} ${{ github.event.inputs.changelog_text }} $arguments | |
79 | working-directory: ${{ github.event.repository.name }} | |
80 | ||
81 | # Create the variables required by the following steps | |
82 | # - steps.required-variables.outputs.changes: latest entry in the changelog.txt (if exists), or addon.xml.in news element | |
83 | # - steps.required-variables.outputs.version: version element from addon.xml.in | |
84 | # - steps.required-variables.outputs.branch: branch of the triggering ref | |
85 | # - steps.required-variables.outputs.today: today's date in format '%Y-%m-%d' | |
86 | - name: Get required variables | |
87 | id: required-variables | |
88 | run: | | |
89 | changes=$(cat "$(find . -name changelog.txt)" | awk -v RS= 'NR==1') | |
90 | if [ -z "$changes" ] ; | |
91 | then | |
92 | changes=$(xmlstarlet fo -R "$(find . -name addon.xml.in)" | xmlstarlet sel -t -v 'string(/addon/extension/news)' | awk -v RS= 'NR==1') | |
93 | fi | |
94 | changes="${changes//'%'/'%25'}" | |
95 | changes="${changes//$'\n'/'%0A'}" | |
96 | changes="${changes//$'\r'/'%0D'}" | |
97 | changes="${changes//$'\\n'/'%0A'}" | |
98 | changes="${changes//$'\\r'/'%0D'}" | |
99 | echo ::set-output name=changes::$changes | |
100 | version=$(xmlstarlet fo -R "$(find . -name addon.xml.in)" | xmlstarlet sel -t -v 'string(/addon/@version)') | |
101 | echo ::set-output name=version::$version | |
102 | branch=$(echo ${GITHUB_REF#refs/heads/}) | |
103 | echo ::set-output name=branch::$branch | |
104 | echo ::set-output name=today::$(date +'%Y-%m-%d') | |
105 | working-directory: ${{ github.event.repository.name }} | |
106 | ||
107 | # Create a commit of the incremented version and changelog, news changes | |
108 | # Commit message (add_date=false): changelog and version v{steps.required-variables.outputs.version} | |
109 | # Commit message (add_date=true): changelog and version v{steps.required-variables.outputs.version} ({steps.required-variables.outputs.today}) | |
110 | - name: Commit changes | |
111 | run: | | |
112 | git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com" | |
113 | git config --local user.name "github-actions[bot]" | |
114 | commit_message="changelog and version v${{ steps.required-variables.outputs.version }}" | |
115 | if [[ ${{ github.event.inputs.add_date }} == true ]] ; | |
116 | then | |
117 | commit_message="$commit_message (${{ steps.required-variables.outputs.today }})" | |
118 | fi | |
119 | git commit -m "$commit_message" -a | |
120 | working-directory: ${{ github.event.repository.name }} | |
121 | ||
122 | # Push the commit(s) created above to the triggering branch | |
123 | - name: Push changes | |
124 | uses: ad-m/github-push-action@master | |
125 | with: | |
126 | branch: ${{ github.ref }} | |
127 | directory: ${{ github.event.repository.name }} | |
128 | ||
129 | # Sleep for 60 seconds to allow for any delays in the push | |
130 | - name: Sleep for 60 seconds | |
131 | run: sleep 60s | |
132 | shell: bash | |
133 | ||
134 | # Create a release at {steps.required-variables.outputs.branch} | |
135 | # - tag and release name format: {steps.required-variables.outputs.version}-{steps.required-variables.outputs.branch} ie. 1.0.0-Matrix | |
136 | # - release body: {steps.required-variables.outputs.changes} | |
137 | - name: Create Release | |
138 | id: create-release | |
139 | uses: actions/create-release@v1 | |
140 | env: | |
141 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
142 | with: | |
143 | tag_name: ${{ steps.required-variables.outputs.version }}-${{ steps.required-variables.outputs.branch }} | |
144 | release_name: ${{ steps.required-variables.outputs.version }}-${{ steps.required-variables.outputs.branch }} | |
145 | body: ${{ steps.required-variables.outputs.changes }} | |
146 | draft: false | |
147 | prerelease: false | |
148 | commitish: ${{ steps.required-variables.outputs.branch }} |
0 | name: Increment version when languages are updated | |
1 | ||
2 | on: | |
3 | push: | |
4 | branches: [ Matrix, Nexus ] | |
5 | paths: | |
6 | - '**resource.language.**strings.po' | |
7 | ||
8 | jobs: | |
9 | default: | |
10 | if: github.repository == 'xbmc/inputstream.adaptive' | |
11 | runs-on: ubuntu-latest | |
12 | name: Increment add-on version when languages are updated | |
13 | ||
14 | steps: | |
15 | ||
16 | - name: Checkout Repository | |
17 | uses: actions/checkout@v2 | |
18 | with: | |
19 | fetch-depth: 0 | |
20 | path: ${{ github.event.repository.name }} | |
21 | ||
22 | - name: Checkout Scripts | |
23 | uses: actions/checkout@v2 | |
24 | with: | |
25 | fetch-depth: 0 | |
26 | repository: xbmc/weblate-supplementary-scripts | |
27 | path: scripts | |
28 | ||
29 | - name: Set up Python | |
30 | uses: actions/setup-python@v2 | |
31 | with: | |
32 | python-version: '3.9' | |
33 | ||
34 | - name: Get changed files | |
35 | uses: trilom/file-changes-action@v1.2.4 | |
36 | ||
37 | - name: Increment add-on version | |
38 | run: | | |
39 | python3 ../scripts/binary/increment_version.py $HOME/files.json -c -n -d | |
40 | working-directory: ${{ github.event.repository.name }} | |
41 | ||
42 | - name: Install dependencies | |
43 | run: | | |
44 | sudo apt-get install libxml2-utils xmlstarlet | |
45 | ||
46 | - name: Get required variables | |
47 | id: required-variables | |
48 | run: | | |
49 | version=$(xmlstarlet fo -R "$(find . -name addon.xml.in)" | xmlstarlet sel -t -v 'string(/addon/@version)') | |
50 | echo ::set-output name=version::$version | |
51 | working-directory: ${{ github.event.repository.name }} | |
52 | ||
53 | - name: Create PR for incrementing add-on versions | |
54 | uses: peter-evans/create-pull-request@v3.10.0 | |
55 | with: | |
56 | commit-message: Add-on version incremented to ${{ steps.required-variables.outputs.version }} from Weblate | |
57 | title: Add-on version incremented to ${{ steps.required-variables.outputs.version }} from Weblate | |
58 | body: Add-on version incremented triggered by ${{ github.sha }} | |
59 | branch: inc-ver | |
60 | delete-branch: true | |
61 | path: ./${{ github.event.repository.name }} |
0 | name: Make Release | |
1 | # Create a release on the given branch | |
2 | # Release and tag name format will be <version>-<branch> | |
3 | # The body of the release will be created from the changelog.txt or news element in the addon.xml.in | |
4 | ||
5 | on: workflow_dispatch | |
6 | ||
7 | jobs: | |
8 | default: | |
9 | runs-on: ubuntu-latest | |
10 | name: Make Release | |
11 | ||
12 | steps: | |
13 | ||
14 | # Checkout the current repository into a directory (repositories name) | |
15 | - name: Checkout Repository | |
16 | uses: actions/checkout@v2 | |
17 | with: | |
18 | fetch-depth: 0 | |
19 | path: ${{ github.event.repository.name }} | |
20 | ||
21 | # Install all dependencies required by the following steps | |
22 | # - libxml2-utils, xmlstarlet: reading news and version from addon.xml.in | |
23 | - name: Install dependencies | |
24 | run: | | |
25 | sudo apt-get install libxml2-utils xmlstarlet | |
26 | ||
27 | # Create the variables required by the following steps | |
28 | # - steps.required-variables.outputs.changes: latest entry in the changelog.txt (if exists), or addon.xml.in news element | |
29 | # - steps.required-variables.outputs.version: version element from addon.xml.in | |
30 | # - steps.required-variables.outputs.branch: branch of the triggering ref | |
31 | - name: Get required variables | |
32 | id: required-variables | |
33 | run: | | |
34 | changes=$(cat "$(find . -name changelog.txt)" | awk -v RS= 'NR==1') | |
35 | if [ -z "$changes" ] ; | |
36 | then | |
37 | changes=$(xmlstarlet fo -R "$(find . -name addon.xml.in)" | xmlstarlet sel -t -v 'string(/addon/extension/news)' | awk -v RS= 'NR==1') | |
38 | fi | |
39 | changes="${changes//'%'/'%25'}" | |
40 | changes="${changes//$'\n'/'%0A'}" | |
41 | changes="${changes//$'\r'/'%0D'}" | |
42 | changes="${changes//$'\\n'/'%0A'}" | |
43 | changes="${changes//$'\\r'/'%0D'}" | |
44 | echo ::set-output name=changes::$changes | |
45 | version=$(xmlstarlet fo -R "$(find . -name addon.xml.in)" | xmlstarlet sel -t -v 'string(/addon/@version)') | |
46 | echo ::set-output name=version::$version | |
47 | branch=$(echo ${GITHUB_REF#refs/heads/}) | |
48 | echo ::set-output name=branch::$branch | |
49 | working-directory: ${{ github.event.repository.name }} | |
50 | ||
51 | # Create a release at {steps.required-variables.outputs.branch} | |
52 | # - tag and release name format: {steps.required-variables.outputs.version}-{steps.required-variables.outputs.branch} ie. 1.0.0-Matrix | |
53 | # - release body: {steps.required-variables.outputs.changes} | |
54 | - name: Create Release | |
55 | id: create-release | |
56 | uses: actions/create-release@v1 | |
57 | env: | |
58 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
59 | with: | |
60 | tag_name: ${{ steps.required-variables.outputs.version }}-${{ steps.required-variables.outputs.branch }} | |
61 | release_name: ${{ steps.required-variables.outputs.version }}-${{ steps.required-variables.outputs.branch }} | |
62 | body: ${{ steps.required-variables.outputs.changes }} | |
63 | draft: false | |
64 | prerelease: false | |
65 | commitish: ${{ steps.required-variables.outputs.branch }} |
0 | name: Sync addon metadata translations | |
1 | ||
2 | on: | |
3 | push: | |
4 | branches: [ Matrix, Nexus ] | |
5 | paths: | |
6 | - '**addon.xml.in' | |
7 | - '**resource.language.**strings.po' | |
8 | ||
9 | jobs: | |
10 | default: | |
11 | if: github.repository == 'xbmc/inputstream.adaptive' | |
12 | runs-on: ubuntu-latest | |
13 | ||
14 | strategy: | |
15 | ||
16 | fail-fast: false | |
17 | matrix: | |
18 | python-version: [ 3.9 ] | |
19 | ||
20 | steps: | |
21 | ||
22 | - name: Checkout repository | |
23 | uses: actions/checkout@v2 | |
24 | with: | |
25 | path: project | |
26 | ||
27 | - name: Checkout sync_addon_metadata_translations repository | |
28 | uses: actions/checkout@v2 | |
29 | with: | |
30 | repository: xbmc/sync_addon_metadata_translations | |
31 | path: sync_addon_metadata_translations | |
32 | ||
33 | - name: Set up Python ${{ matrix.python-version }} | |
34 | uses: actions/setup-python@v2 | |
35 | with: | |
36 | python-version: ${{ matrix.python-version }} | |
37 | ||
38 | - name: Install dependencies | |
39 | run: | | |
40 | python -m pip install --upgrade pip | |
41 | python -m pip install sync_addon_metadata_translations/ | |
42 | ||
43 | - name: Run sync-addon-metadata-translations | |
44 | run: | | |
45 | sync-addon-metadata-translations | |
46 | working-directory: ./project | |
47 | ||
48 | - name: Create PR for sync-addon-metadata-translations changes | |
49 | uses: peter-evans/create-pull-request@v3.10.0 | |
50 | with: | |
51 | commit-message: Sync of addon metadata translations | |
52 | title: Sync of addon metadata translations | |
53 | body: Sync of addon metadata translations triggered by ${{ github.sha }} | |
54 | branch: amt-sync | |
55 | delete-branch: true | |
56 | path: ./project | |
57 | reviewers: gade01 |
0 | # build artifacts | |
1 | build/ | |
2 | inputstream.*/addon.xml | |
3 | ||
4 | # Debian build files | |
5 | debian/changelog | |
6 | debian/files | |
7 | debian/*.log | |
8 | debian/*.substvars | |
9 | debian/.debhelper/ | |
10 | debian/tmp/ | |
11 | debian/kodi-pvr-*/ | |
12 | obj-x86_64-linux-gnu/ | |
13 | ||
14 | # commonly used editors | |
15 | # vim | |
16 | *.swp | |
17 | ||
18 | # Eclipse | |
19 | *.project | |
20 | *.cproject | |
21 | .classpath | |
22 | *.sublime-* | |
23 | .settings/ | |
24 | ||
25 | # KDevelop 4 | |
26 | *.kdev4 | |
27 | ||
28 | # gedit | |
29 | *~ | |
30 | ||
31 | # CLion | |
32 | /.idea | |
33 | ||
34 | # clion | |
35 | .idea/ | |
36 | ||
37 | # to prevent add after a "git format-patch VALUE" and "git add ." call | |
38 | /*.patch | |
39 | ||
40 | # Visual Studio Code | |
41 | .vscode | |
42 | ||
43 | # to prevent add if project code opened by Visual Studio over CMake file | |
44 | .vs/ | |
45 | ||
46 | #testfiles | |
47 | *.mpd_current⏎ |
0 | # inputstream.adaptive (2.6.14) | |
0 | # inputstream.adaptive | |
1 | 1 | |
2 | 2 | This is an adaptive file addon for kodi's new InputStream Interface. |
3 | 3 | |
18 | 18 | - URL to paste into strm file: http://rdmedia.bbc.co.uk/dash/ondemand/testcard/1/client_manifest-events-multilang.mpd |
19 | 19 | |
20 | 20 | ##### Decrypting: |
21 | Decrypting is not implemented. But it is prepared! | |
22 | Decrypting takes place in separate decrypter shared libraries, wich are identified by the inputstream.mpd.licensetype listitem property. | |
23 | Only one shared decrypter library can be active during playing decrypted media. Building decrypter libraries do not require kodi sources. | |
21 | Decrypting is not implemented. But it is prepared! | |
22 | Decrypting takes place in separate decrypter shared libraries, wich are identified by the inputstream.mpd.licensetype listitem property. | |
23 | Only one shared decrypter library can be active during playing decrypted media. Building decrypter libraries do not require kodi sources. | |
24 | 24 | Simply check out the sources of this addon and you are able to build decrypters including full access to existing decrypters implemented in bento4. |
25 | 25 | |
26 | 26 | ##### Bandwidth and resolution: |
27 | When using inputstream.adaptive the first time, the selection of stream quality / stream resolution is done with a guess of 4MBit/s. This default value will be updated at the time you watch your first movie by measuring the download speed of the media streams. | |
28 | Always you start a new video, the average bandwidth of the previous media watched will be taken to calculate the initial stream representation from the set of existing qualities. | |
29 | If this leads to problems in your environment, you can override / adjust this value using Min. bandwidth in the inputstream.adaptive settings dialog. Setting Min. bandwidth e.g. to 10.000.000, the media selection will never be done with a bandwidth value below | |
30 | this value. | |
31 | Currently the complete media is played with the selection from this initial step, adaptive stream changes during a running video is still under development. | |
27 | When using inputstream.adaptive the first time, the selection of stream quality / stream resolution is done with a guess of 4MBit/s. This default value will be updated at the time you watch your first movie by measuring the download speed of the media streams. | |
28 | Always you start a new video, the average bandwidth of the previous media watched will be taken to calculate the initial stream representation from the set of existing qualities. | |
29 | If this leads to problems in your environment, you can override / adjust this value using Min. bandwidth in the inputstream.adaptive settings dialog. Setting Min. bandwidth e.g. to 10.000.000, the media selection will never be done with a bandwidth value below | |
30 | this value. | |
31 | Currently the complete media is played with the selection from this initial step, adaptive stream changes during a running video is still under development. | |
32 | 32 | There is a new Max. resolution select field in the inputstream.adaptive settings dialog. |
33 | 33 | Auto will select the best resolution matching to your videoplayer display rect without any limits. |
34 | If your display resolution is 720p, you will not be able to watch 1080p videos if there are video representations available closer to 720p. | |
34 | If your display resolution is 720p, you will not be able to watch 1080p videos if there are video representations available closer to 720p. | |
35 | 35 | |
36 | 36 | |
37 | 37 | ##### TODO's: |
38 | - Adaptive bitrate switching is prepared but currently not yet activated | |
38 | - Adaptive bitrate switching is prepared but currently not yet activated | |
39 | 39 | - Automatic / fixed video stream selection depending on max. visible display rect (some work has to be done at the inputstream interface). |
40 | - There will be many dash mpd, smoothstream or hls manifest types currently not supported - must be extended. | |
40 | - There will be many dash mpd, smoothstream or hls manifest types currently not supported - must be extended. | |
41 | 41 | |
42 | 42 | ##### Notes: |
43 | 43 | - This addon uses threads to download segments. The memory consumption is the sum of single segment from each stream currently playing. Refering to known streams it is < 10MB for 720p videos. |
44 | 44 | |
45 | 45 | ##### Credits: |
46 | [@fernetmenta](github.com/fernetmenta) Best support I ever got regarding streams / codecs and kodi internals. | |
47 | [@notspiff](https://github.com/notspiff) Thanks for your ideas / tipps regarding kodi file system | |
48 | [bento4 library](https://www.bento4.com/) For me the best library choice for mp4 streams. Well written and extensible! | |
49 | ||
50 | ##### Continuous integration: | |
51 | [Travis CI build state:](https://travis-ci.org/peak3d) ![alt tag](https://travis-ci.org/peak3d/inputstream.adaptive.svg?branch=master) | |
52 | [Appveyor:](https://ci.appveyor.com/project/peak3d) ![alt tag](https://ci.appveyor.com/api/projects/status/ah9s8usgxhangq7o?svg=true) | |
46 | [@peak3d](https://github.com/peak3d) Original author / creator. Superstar! | |
47 | [@fernetmenta](https://github.com/fernetmenta) Best support regarding streams / codecs and kodi internals. | |
48 | [@notspiff](https://github.com/notspiff) Ideas / tips regarding kodi file system. | |
49 | [bento4 library](https://www.bento4.com/) Great library for mp4 streams. Well written and extensible! |
0 | kodi-inputstream-adaptive (2.6.23-1) UNRELEASED; urgency=low | |
1 | ||
2 | * New upstream release. | |
3 | ||
4 | -- Debian Janitor <janitor@jelmer.uk> Wed, 11 Aug 2021 13:41:47 -0000 | |
5 | ||
0 | 6 | kodi-inputstream-adaptive (2.6.14+ds1-1) unstable; urgency=medium |
1 | 7 | |
2 | 8 | * New upstream version 2.6.14+ds1 (Closes: #988862) |
0 | 0 | <?xml version="1.0" encoding="UTF-8"?> |
1 | 1 | <addon |
2 | 2 | id="inputstream.adaptive" |
3 | version="2.6.14" | |
3 | version="2.6.23" | |
4 | 4 | name="InputStream Adaptive" |
5 | 5 | provider-name="peak3d"> |
6 | 6 | <requires>@ADDON_DEPENDS@</requires> |
9 | 9 | name="adaptive" |
10 | 10 | extension="" |
11 | 11 | tags="true" |
12 | listitemprops="license_type|license_key|license_data|license_flags|manifest_type|server_certificate|stream_headers|manifest_update_parameter|original_audio_language|media_renewal_url|media_renewal_time|max_bandwidth|play_timeshift_buffer" | |
12 | listitemprops="license_type|license_key|license_data|license_flags|manifest_type|server_certificate|stream_headers|manifest_update_parameter|original_audio_language|max_bandwidth|play_timeshift_buffer|pre_init_data" | |
13 | 13 | library_@PLATFORM@="@LIBRARY_FILENAME@"/> |
14 | 14 | <extension point="xbmc.addon.metadata"> |
15 | <summary lang="en_GB">InputStream client for adaptive streams</summary> | |
16 | <summary lang="es_ES">Cliente InputStream para flujo de datos adaptativos</summary> | |
17 | <description lang="en_GB">InputStream client for adaptive streams</description> | |
18 | <description lang="es_ES">Cliente InputStream para flujo de datos adaptativos</description> | |
19 | 15 | <platform>@PLATFORM@</platform> |
20 | 16 | <news> |
17 | v2.6.23 (2021-08-06) | |
18 | - Translations from weblate - de_de, ja_jp, ko_kr | |
19 | - [Android] use multiple drm sessions (solves stuttering) | |
20 | - [DASH] allow for misaligned segs in SegmentTimeline | |
21 | ||
22 | v2.6.22 (2021-07-18) | |
23 | - Automation test release | |
24 | ||
25 | v2.6.21 (2021-07-18) | |
26 | - Automation test release | |
27 | ||
28 | v2.6.20 (2021-07-17) | |
29 | Translations updates from Weblate | |
30 | - de_de, el_gr, es_es, fr_fr, he_il, hi_in, hr_hr, hu_hu, it_it, ja_jp, ko_kr, nl_nl, pl_pl, ro_ro, ru_ru, sk_sk, sv_se | |
31 | ||
32 | v2.6.19 (2021-07-17) | |
33 | - Translations updates from Weblate | |
34 | - af_za, am_et, ar_sa, ast_es, az_az, be_by, bg_bg, bs_ba, ca_es, cs_cz, cy_gb, da_dk, de_de, el_gr, en_au, en_gb, en_nz, en_us, eo, es_ar, es_es, es_mx, et_ee, eu_es, fa_af, fa_ir, fi_fi, fo_fo, fr_ca, fr_fr, gl_es, he_il, hi_in, hr_hr, hu_hu, hy_am, id_id, is_is, it_it, ja_jp, kn_in, ko_kr, lt_lt, lv_lv, ml_in, mn_mn, mt_mt, my_mm, nb_no, nl_nl, os_os, pl_pl, pt_br, pt_pt, ro_md, ro_ro, ru_ru, scn, si_lk, sk_sk, sq_al, sr_rs, sr_rs@latin, sv_se, szl, ta_in, tg_tj, th_th, tr_tr, uk_ua, uz_uz, vi_vn, zh_cn, zh_tw | |
35 | ||
36 | v2.6.18 (2021-07-13) | |
37 | - Add support to pre-initialise DRM | |
38 | - Fix intermittent crash when stopping Widevine videos | |
39 | ||
40 | v2.6.17 (2021-06-20) | |
41 | - Fix decrypt errors on non-Android platforms | |
42 | - [DASH] fix representation base urls | |
43 | - Don't use filecache for subtitle downloads | |
44 | ||
45 | v2.6.16 (2021-05-21) | |
46 | - Allow download retries for VOD | |
47 | - [DASH] fix for minimumUpdatePeriod=0 | |
48 | - [DASH] remove media_renewal_url and media_renewal_time | |
49 | - License renewal for widevine | |
50 | - [HLS] Fix SSD being deleted with multiple encrypted streams | |
51 | - Overhaul manifest redirect logic | |
52 | - fix seeking into separate chapters/resume time | |
53 | - fix HEVC extra data crash | |
54 | - improve settings | |
55 | ||
56 | v2.6.15 (2021-05-18) | |
57 | - [HLS] support webvtt subtitle extensions | |
58 | - [DASH] fix segmentTemplate calculation | |
59 | - [HEVC] use constant frame rate if average is 0 | |
60 | - [HLS] don't reset pts on new periods | |
61 | - Don't remove secure decoder cap if not requested in manifest_type | |
62 | - [Android] fallback to widevine L3 if L1 provisioning fails | |
63 | ||
21 | 64 | v2.6.14 (2021-04-22) |
22 | 65 | - Don't overwrite manifest headers with stream headers |
23 | 66 | - Stream headers default to manifest headers |
162 | 205 | v2.3.14 (2019-02-10) |
163 | 206 | - Add WebM container parser |
164 | 207 | </news> |
208 | <summary lang="de_DE">InputStream-Client für adaptive Streams</summary> | |
209 | <summary lang="en_GB">InputStream client for adaptive streams</summary> | |
210 | <summary lang="es_ES">Cliente InputStream para flujo de datos adaptativos</summary> | |
211 | <summary lang="ko_KR">가변 스트림을 위한 InputStream 클라이언트</summary> | |
212 | <summary lang="pl_PL">Klient InputStream dla strumieni adaptacyjnych</summary> | |
213 | <description lang="de_DE">InputStream-Client für adaptive Streams</description> | |
214 | <description lang="en_GB">InputStream client for adaptive streams</description> | |
215 | <description lang="es_ES">Cliente InputStream para flujo de datos adaptativos</description> | |
216 | <description lang="ko_KR">가변 스트림을 위한 InputStream 클라이언트</description> | |
217 | <description lang="pl_PL">Klient InputStream dla strumieni adaptacyjnych</description> | |
165 | 218 | </extension> |
166 | 219 | </addon> |
0 | 1.0.8 | |
1 | - Fix missing brackets when calculating livestream - start | |
2 | 1.0.7 | |
3 | - ServerCertificate / SSD version bump -> 6 | |
4 | 1.0.6 | |
5 | - allow some frames to fail decrypting | |
6 | 1.0.5 | |
7 | - normalize livestream's timestamp values | |
8 | 1.0.4 | |
9 | - Parse BaseUrl from top mpd level | |
10 | 1.0.3 | |
11 | - Start livestreams 12 secs before "now" | |
12 | 1.0.2 | |
13 | - Fix live-streams by using 64-bit for frame-duration transformation | |
14 | 1.0.1 | |
15 | - bumb to force update | |
16 | 1.0.0 | |
17 | - initial release |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: af_za\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n != 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: am_et\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n > 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: ar_sa\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: ast_es\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n != 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: az_az\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n != 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: be_by\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: bg_bg\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n != 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: bs_ba\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: ca_es\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n != 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: cs_cz\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: cy_gb\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=6; plural=(n==0) ? 0 : (n==1) ? 1 : (n==2) ? 2 : (n==3) ? 3 :(n==6) ? 4 : 5;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: da_dk\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n != 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
3 | 3 | # Addon Provider: peak3d |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | ||
6 | "Report-Msgid-Bugs-To: translations@kodi.tv\n" | |
7 | "PO-Revision-Date: 2021-07-18 08:48+0000\n" | |
8 | "Last-Translator: Kai Sommerfeld <kai.sommerfeld@gmx.com>\n" | |
9 | "Language-Team: German <https://kodi.weblate.cloud/projects/kodi-add-ons-videoplayer-inputstream/inputstream-adaptive/de_de/>\n" | |
10 | "Language: de_de\n" | |
7 | 11 | "MIME-Version: 1.0\n" |
8 | 12 | "Content-Type: text/plain; charset=UTF-8\n" |
9 | 13 | "Content-Transfer-Encoding: 8bit\n" |
10 | "Language-Team: German\n" | |
11 | "Language: de\n" | |
12 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" | |
14 | "Plural-Forms: nplurals=2; plural=n != 1;\n" | |
15 | "X-Generator: Weblate 4.7.1\n" | |
16 | ||
17 | msgctxt "Addon Summary" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "InputStream-Client für adaptive Streams" | |
20 | ||
21 | msgctxt "Addon Description" | |
22 | msgid "InputStream client for adaptive streams" | |
23 | msgstr "InputStream-Client für adaptive Streams" | |
13 | 24 | |
14 | 25 | msgctxt "#30100" |
15 | 26 | msgid "General" |
28 | 39 | # Absolute path to the folder containing the decrypters |
29 | 40 | msgctxt "#30103" |
30 | 41 | msgid "Decrypter path" |
31 | msgstr "Decrypter Pfad" | |
42 | msgstr "Decrypter-Pfad" | |
32 | 43 | |
33 | 44 | # Maximum Resolution |
34 | 45 | msgctxt "#30110" |
35 | 46 | msgid "Max. Resolution general decoder" |
36 | msgstr "Max. Auflösung allgemeiner Dekoder" | |
47 | msgstr "Max. Auflösung allgemeiner Decoder" | |
37 | 48 | |
38 | 49 | msgctxt "#30111" |
39 | 50 | msgid "Stream Selection" |
40 | msgstr "Streamauswahl" | |
51 | msgstr "Stream-Auswahl" | |
41 | 52 | |
42 | 53 | msgctxt "#30112" |
43 | 54 | msgid "Media" |
46 | 57 | # Maximum allowed resolution if decoded through secure path |
47 | 58 | msgctxt "#30113" |
48 | 59 | msgid "Max. Resolution secure decoder" |
49 | msgstr "Max. Auflösung sicherer Dekoder" | |
60 | msgstr "Max. Auflösung sicherer Decoder" | |
50 | 61 | |
51 | 62 | # Select streams without respecting HDCP status |
52 | 63 | msgctxt "#30114" |
53 | 64 | msgid "Override HDCP status" |
54 | msgstr "Überschreibe HDCP Status" | |
65 | msgstr "HDCP-Status überschreiben" | |
55 | 66 | |
56 | 67 | # Do not respect display resolution when selecting streams |
57 | 68 | msgctxt "#30115" |
58 | 69 | msgid "Ignore Display Resolution" |
59 | msgstr "Ignoriere Bildschirmauflösung" | |
70 | msgstr "Bildschirmauflösung ignorieren" | |
60 | 71 | |
61 | 72 | msgctxt "#30120" |
62 | 73 | msgid "Expert" |
64 | 75 | |
65 | 76 | msgctxt "#30121" |
66 | 77 | msgid "Enable Pre-Release Features" |
67 | msgstr "Pre-Release Features aktivieren" | |
78 | msgstr "Experimentelle Features aktivieren" | |
79 | ||
80 | msgctxt "#30122" | |
81 | msgid "Don't use secure decoder if possible" | |
82 | msgstr "Wenn möglich, sicheren Decoder nicht verwenden" | |
68 | 83 | |
69 | 84 | msgctxt "#30150" |
70 | 85 | msgid "Max" |
96 | 111 | |
97 | 112 | msgctxt "#30157" |
98 | 113 | msgid "All" |
99 | msgstr "Alles" | |
114 | msgstr "Alle" | |
100 | 115 | |
101 | 116 | msgctxt "#30158" |
102 | 117 | msgid "Audio" |
113 | 128 | |
114 | 129 | msgctxt "#30161" |
115 | 130 | msgid "Video + Subtitles" |
116 | msgstr "Video + Untertitel" | |
131 | msgstr "Video und Untertitel" |
3 | 3 | # Addon Provider: peak3d |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | ||
6 | "Language-Team: Greek (Greece)\n" | |
7 | "Language: en\n" | |
7 | 8 | "MIME-Version: 1.0\n" |
8 | 9 | "Content-Type: text/plain; charset=UTF-8\n" |
9 | 10 | "Content-Transfer-Encoding: 8bit\n" |
10 | "Language-Team: Greek (Greece)\n" | |
11 | "Language: en\n" | |
12 | 11 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
13 | 20 | |
14 | 21 | msgctxt "#30100" |
15 | 22 | msgid "General" |
66 | 73 | msgid "Enable Pre-Release Features" |
67 | 74 | msgstr "Ενεργοποίηση χαρακτηριστικών προ-εκδόσεων" |
68 | 75 | |
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
69 | 80 | msgctxt "#30150" |
70 | 81 | msgid "Max" |
71 | 82 | msgstr "Μέγιστο" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: en_au\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n != 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
10 | 10 | "Language-Team: English\n" |
11 | 11 | "Language: en\n" |
12 | 12 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" |
13 | ||
14 | msgctxt "Addon Summary" | |
15 | msgid "InputStream client for adaptive streams" | |
16 | msgstr "" | |
17 | ||
18 | msgctxt "Addon Description" | |
19 | msgid "InputStream client for adaptive streams" | |
20 | msgstr "" | |
13 | 21 | |
14 | 22 | msgctxt "#30100" |
15 | 23 | msgid "General" |
66 | 74 | msgid "Enable Pre-Release Features" |
67 | 75 | msgstr "" |
68 | 76 | |
77 | msgctxt "#30122" | |
78 | msgid "Don't use secure decoder if possible" | |
79 | msgstr "" | |
80 | ||
69 | 81 | msgctxt "#30150" |
70 | 82 | msgid "Max" |
71 | 83 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: en_nz\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n != 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: en_us\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n != 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: eo\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n != 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: es_ar\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n != 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
3 | 3 | # Addon Provider: peak3d |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | ||
7 | 6 | "Last-Translator: roliverosc\n" |
7 | "Language-Team: Spanish\n" | |
8 | "Language: es\n" | |
8 | 9 | "MIME-Version: 1.0\n" |
9 | 10 | "Content-Type: text/plain; charset=UTF-8\n" |
10 | 11 | "Content-Transfer-Encoding: 8bit\n" |
11 | "Language-Team: Spanish\n" | |
12 | "Language: es\n" | |
13 | 12 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" |
13 | ||
14 | msgctxt "Addon Summary" | |
15 | msgid "InputStream client for adaptive streams" | |
16 | msgstr "Cliente InputStream para flujo de datos adaptativos" | |
17 | ||
18 | msgctxt "Addon Description" | |
19 | msgid "InputStream client for adaptive streams" | |
20 | msgstr "Cliente InputStream para flujo de datos adaptativos" | |
14 | 21 | |
15 | 22 | msgctxt "#30100" |
16 | 23 | msgid "General" |
67 | 74 | msgid "Enable Pre-Release Features" |
68 | 75 | msgstr "Habilitar funciones Pre-releases" |
69 | 76 | |
77 | msgctxt "#30122" | |
78 | msgid "Don't use secure decoder if possible" | |
79 | msgstr "" | |
80 | ||
70 | 81 | msgctxt "#30150" |
71 | 82 | msgid "Max" |
72 | 83 | msgstr "Máximo" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: es_mx\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n != 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: et_ee\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n != 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: eu_es\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n != 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: fa_af\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n > 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: fa_ir\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n > 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: fi_fi\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n != 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: fo_fo\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n != 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: fr_ca\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n > 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
3 | 3 | # Addon Provider: peak3d |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | ||
6 | "Language-Team: Français\n" | |
7 | "Language: fr\n" | |
7 | 8 | "MIME-Version: 1.0\n" |
8 | 9 | "Content-Type: text/plain; charset=UTF-8\n" |
9 | 10 | "Content-Transfer-Encoding: 8bit\n" |
10 | "Language-Team: Français\n" | |
11 | "Language: fr\n" | |
12 | 11 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
13 | 20 | |
14 | 21 | msgctxt "#30100" |
15 | 22 | msgid "General" |
66 | 73 | msgid "Enable Pre-Release Features" |
67 | 74 | msgstr "Activer les fonctions exprérimentales" |
68 | 75 | |
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
69 | 80 | msgctxt "#30150" |
70 | 81 | msgid "Max" |
71 | 82 | msgstr "Maximum" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: gl_es\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n != 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
3 | 3 | # Addon Provider: peak3d |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | ||
6 | "Language-Team: Hebrew\n" | |
7 | "Language: he_IL\n" | |
7 | 8 | "MIME-Version: 1.0\n" |
8 | 9 | "Content-Type: text/plain; charset=UTF-8\n" |
9 | 10 | "Content-Transfer-Encoding: 8bit\n" |
10 | "Language-Team: Hebrew\n" | |
11 | "Language: he_IL\n" | |
12 | 11 | "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==2 ? 1 : n>10 && n%10==0 ? 2 : 3);\n" |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
13 | 20 | |
14 | 21 | msgctxt "#30100" |
15 | 22 | msgid "General" |
66 | 73 | msgid "Enable Pre-Release Features" |
67 | 74 | msgstr "הפעלת תכונות שטרם שוחררו" |
68 | 75 | |
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
69 | 80 | msgctxt "#30150" |
70 | 81 | msgid "Max" |
71 | 82 | msgstr "מקסימום" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Report-Msgid-Bugs-To: translations@kodi.tv\n" | |
7 | "PO-Revision-Date: 2021-07-17 10:36+0000\n" | |
8 | "Last-Translator: Christian Gade <gade@kodi.tv>\n" | |
9 | "Language-Team: Hindi (India) <https://kodi.weblate.cloud/projects/kodi-add-ons-videoplayer-inputstream/inputstream-adaptive/hi_in/>\n" | |
10 | "Language: hi_in\n" | |
11 | "MIME-Version: 1.0\n" | |
12 | "Content-Type: text/plain; charset=UTF-8\n" | |
13 | "Content-Transfer-Encoding: 8bit\n" | |
14 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" | |
15 | "X-Generator: Weblate 4.7.1\n" | |
16 | ||
17 | msgctxt "Addon Summary" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "Addon Description" | |
22 | msgid "InputStream client for adaptive streams" | |
23 | msgstr "" | |
24 | ||
25 | msgctxt "#30100" | |
26 | msgid "General" | |
27 | msgstr "सामान्य" | |
28 | ||
29 | # The minimum bandwidth which should not be deceeded. | |
30 | msgctxt "#30101" | |
31 | msgid "Min. Bandwidth (Bit/s)" | |
32 | msgstr "न्यूनतम बैंडविड्थ (बिट/सेकंड)" | |
33 | ||
34 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
35 | msgctxt "#30102" | |
36 | msgid "Max. Bandwidth (Bit/s)" | |
37 | msgstr "अधिकतम बैंडविड्थ (बिट/सेकंड)" | |
38 | ||
39 | # Absolute path to the folder containing the decrypters | |
40 | msgctxt "#30103" | |
41 | msgid "Decrypter path" | |
42 | msgstr "डिक्रिप्ट पथ" | |
43 | ||
44 | # Maximum Resolution | |
45 | msgctxt "#30110" | |
46 | msgid "Max. Resolution general decoder" | |
47 | msgstr "अधिकतम उत्तमता सामान्य विकोडक" | |
48 | ||
49 | msgctxt "#30111" | |
50 | msgid "Stream Selection" | |
51 | msgstr "वीडियो उत्तमता चयन" | |
52 | ||
53 | msgctxt "#30112" | |
54 | msgid "Media" | |
55 | msgstr "संचार माध्यम" | |
56 | ||
57 | # Maximum allowed resolution if decoded through secure path | |
58 | msgctxt "#30113" | |
59 | msgid "Max. Resolution secure decoder" | |
60 | msgstr "अधिकतम उत्तमता सुरक्षित विकोडक" | |
61 | ||
62 | # Select streams without respecting HDCP status | |
63 | msgctxt "#30114" | |
64 | msgid "Override HDCP status" | |
65 | msgstr "रद्द/बदले HDCP स्थिति" | |
66 | ||
67 | # Do not respect display resolution when selecting streams | |
68 | msgctxt "#30115" | |
69 | msgid "Ignore Display Resolution" | |
70 | msgstr "नज़रअंदाज़ करे प्रदर्शित रेसोलुशन" | |
71 | ||
72 | msgctxt "#30120" | |
73 | msgid "Expert" | |
74 | msgstr "विशेषज्ञ" | |
75 | ||
76 | msgctxt "#30121" | |
77 | msgid "Enable Pre-Release Features" | |
78 | msgstr "पूर्व-रिलीज़ सुविधाएँ सक्षम करें" | |
79 | ||
80 | msgctxt "#30122" | |
81 | msgid "Don't use secure decoder if possible" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30150" | |
85 | msgid "Max" | |
86 | msgstr "ज़्यादा से ज़्यादा" | |
87 | ||
88 | msgctxt "#30151" | |
89 | msgid "480p" | |
90 | msgstr "480p" | |
91 | ||
92 | msgctxt "#30152" | |
93 | msgid "640p" | |
94 | msgstr "640p" | |
95 | ||
96 | msgctxt "#30153" | |
97 | msgid "720p" | |
98 | msgstr "720p" | |
99 | ||
100 | msgctxt "#30154" | |
101 | msgid "1080p" | |
102 | msgstr "1080p" | |
103 | ||
104 | msgctxt "#30155" | |
105 | msgid "Automatically select streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30156" | |
109 | msgid "Manually select all streams" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30157" | |
113 | msgid "All" | |
114 | msgstr "सब" | |
115 | ||
116 | msgctxt "#30158" | |
117 | msgid "Audio" | |
118 | msgstr "ऑडियो" | |
119 | ||
120 | msgctxt "#30159" | |
121 | msgid "Video" | |
122 | msgstr "वीडियो" | |
123 | ||
124 | # Show all video streams | |
125 | msgctxt "#30160" | |
126 | msgid "Manually select video stream" | |
127 | msgstr "" | |
128 | ||
129 | msgctxt "#30161" | |
130 | msgid "Video + Subtitles" | |
131 | msgstr "" |
12 | 12 | "MIME-Version: 1.0\n" |
13 | 13 | "Content-Type: text/plain; charset=UTF-8\n" |
14 | 14 | "Content-Transfer-Encoding: 8bit\n" |
15 | "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" | |
16 | "%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" | |
15 | "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" | |
17 | 16 | "X-Generator: Poedit 2.3\n" |
17 | ||
18 | msgctxt "Addon Summary" | |
19 | msgid "InputStream client for adaptive streams" | |
20 | msgstr "" | |
21 | ||
22 | msgctxt "Addon Description" | |
23 | msgid "InputStream client for adaptive streams" | |
24 | msgstr "" | |
18 | 25 | |
19 | 26 | msgctxt "#30100" |
20 | 27 | msgid "General" |
71 | 78 | msgid "Enable Pre-Release Features" |
72 | 79 | msgstr "Omogući eksperimentalne značajke" |
73 | 80 | |
81 | msgctxt "#30122" | |
82 | msgid "Don't use secure decoder if possible" | |
83 | msgstr "" | |
84 | ||
74 | 85 | msgctxt "#30150" |
75 | 86 | msgid "Max" |
76 | 87 | msgstr "Maks" |
3 | 3 | # Addon Provider: peak3d |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | ||
6 | "Language-Team: Hungarian\n" | |
7 | "Language: hu\n" | |
7 | 8 | "MIME-Version: 1.0\n" |
8 | 9 | "Content-Type: text/plain; charset=UTF-8\n" |
9 | 10 | "Content-Transfer-Encoding: 8bit\n" |
10 | "Language-Team: Hungarian\n" | |
11 | "Language: hu\n" | |
12 | 11 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
13 | 20 | |
14 | 21 | msgctxt "#30100" |
15 | 22 | msgid "General" |
66 | 73 | msgid "Enable Pre-Release Features" |
67 | 74 | msgstr "Kiadás előtti funkciók engedélyezése" |
68 | 75 | |
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
69 | 80 | msgctxt "#30150" |
70 | 81 | msgid "Max" |
71 | 82 | msgstr "Max" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: hy_am\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n > 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: id_id\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=1; plural=0;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | ||
7 | "MIME-Version: 1.0\n" | |
8 | "Content-Type: text/plain; charset=UTF-8\n" | |
9 | "Content-Transfer-Encoding: 8bit\n" | |
10 | "Language-Team: Hindi\n" | |
11 | "Language: hi\n" | |
12 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" | |
13 | ||
14 | msgctxt "#30100" | |
15 | msgid "General" | |
16 | msgstr "सामान्य" | |
17 | ||
18 | # The minimum bandwidth which should not be deceeded. | |
19 | msgctxt "#30101" | |
20 | msgid "Min. Bandwidth (Bit/s)" | |
21 | msgstr "न्यूनतम बैंडविड्थ (बिट/सेकंड)" | |
22 | ||
23 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
24 | msgctxt "#30102" | |
25 | msgid "Max. Bandwidth (Bit/s)" | |
26 | msgstr "अधिकतम बैंडविड्थ (बिट/सेकंड)" | |
27 | ||
28 | # Absolute path to the folder containing the decrypters | |
29 | msgctxt "#30103" | |
30 | msgid "Decrypter path" | |
31 | msgstr "डिक्रिप्ट पथ" | |
32 | ||
33 | # Maximum Resolution | |
34 | msgctxt "#30110" | |
35 | msgid "Max. Resolution general decoder" | |
36 | msgstr "अधिकतम उत्तमता सामान्य विकोडक" | |
37 | ||
38 | msgctxt "#30111" | |
39 | msgid "Stream Selection" | |
40 | msgstr "वीडियो उत्तमता चयन" | |
41 | ||
42 | msgctxt "#30112" | |
43 | msgid "Media" | |
44 | msgstr "संचार माध्यम" | |
45 | ||
46 | # Maximum allowed resolution if decoded through secure path | |
47 | msgctxt "#30113" | |
48 | msgid "Max. Resolution secure decoder" | |
49 | msgstr "अधिकतम उत्तमता सुरक्षित विकोडक" | |
50 | ||
51 | # Select streams without respecting HDCP status | |
52 | msgctxt "#30114" | |
53 | msgid "Override HDCP status" | |
54 | msgstr "रद्द/बदले HDCP स्थिति " | |
55 | ||
56 | # Do not respect display resolution when selecting streams | |
57 | msgctxt "#30115" | |
58 | msgid "Ignore Display Resolution" | |
59 | msgstr "नज़रअंदाज़ करे प्रदर्शित रेसोलुशन" | |
60 | ||
61 | msgctxt "#30120" | |
62 | msgid "Expert" | |
63 | msgstr "विशेषज्ञ" | |
64 | ||
65 | msgctxt "#30121" | |
66 | msgid "Enable Pre-Release Features" | |
67 | msgstr "पूर्व-रिलीज़ सुविधाएँ सक्षम करें" | |
68 | ||
69 | msgctxt "#30150" | |
70 | msgid "Max" | |
71 | msgstr "ज़्यादा से ज़्यादा" | |
72 | ||
73 | msgctxt "#30151" | |
74 | msgid "480p" | |
75 | msgstr "480p" | |
76 | ||
77 | msgctxt "#30152" | |
78 | msgid "640p" | |
79 | msgstr "640p" | |
80 | ||
81 | msgctxt "#30153" | |
82 | msgid "720p" | |
83 | msgstr "720p" | |
84 | ||
85 | msgctxt "#30154" | |
86 | msgid "1080p" | |
87 | msgstr "1080p" | |
88 | ||
89 | msgctxt "#30155" | |
90 | msgid "Automatically select streams" | |
91 | msgstr "" | |
92 | ||
93 | msgctxt "#30156" | |
94 | msgid "Manually select all streams" | |
95 | msgstr "" | |
96 | ||
97 | msgctxt "#30157" | |
98 | msgid "All" | |
99 | msgstr "सब" | |
100 | ||
101 | msgctxt "#30158" | |
102 | msgid "Audio" | |
103 | msgstr "ऑडियो" | |
104 | ||
105 | msgctxt "#30159" | |
106 | msgid "Video" | |
107 | msgstr "वीडियो" | |
108 | ||
109 | # Show all video streams | |
110 | msgctxt "#30160" | |
111 | msgid "Manually select video stream" | |
112 | msgstr "" | |
113 | ||
114 | msgctxt "#30161" | |
115 | msgid "Video + Subtitles" | |
116 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: is_is\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n % 10 != 1 || n % 100 == 11;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
3 | 3 | # Addon Provider: peak3d |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | ||
6 | "Language-Team: Italian\n" | |
7 | "Language: it\n" | |
7 | 8 | "MIME-Version: 1.0\n" |
8 | 9 | "Content-Type: text/plain; charset=UTF-8\n" |
9 | 10 | "Content-Transfer-Encoding: 8bit\n" |
10 | "Language-Team: Italian\n" | |
11 | "Language: it\n" | |
12 | 11 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
13 | 20 | |
14 | 21 | msgctxt "#30100" |
15 | 22 | msgid "General" |
66 | 73 | msgid "Enable Pre-Release Features" |
67 | 74 | msgstr "Abilita le funzionalità Pre-Release" |
68 | 75 | |
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
69 | 80 | msgctxt "#30150" |
70 | 81 | msgid "Max" |
71 | 82 | msgstr "Massima" |
3 | 3 | # Addon Provider: peak3d |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | ||
6 | "Language-Team: Japanese\n" | |
7 | "Language: ja\n" | |
7 | 8 | "MIME-Version: 1.0\n" |
8 | 9 | "Content-Type: text/plain; charset=UTF-8\n" |
9 | 10 | "Content-Transfer-Encoding: 8bit\n" |
10 | "Language-Team: Japanese\n" | |
11 | "Language: ja\n" | |
12 | 11 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
13 | 20 | |
14 | 21 | msgctxt "#30100" |
15 | 22 | msgid "General" |
66 | 73 | msgid "Enable Pre-Release Features" |
67 | 74 | msgstr "プレリリース機能を使う。" |
68 | 75 | |
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "可能な限りセキュアデコーダを使わない" | |
79 | ||
69 | 80 | msgctxt "#30150" |
70 | 81 | msgid "Max" |
71 | 82 | msgstr "最大" |
88 | 99 | |
89 | 100 | msgctxt "#30155" |
90 | 101 | msgid "Automatically select streams" |
91 | msgstr "" | |
102 | msgstr "自動選択" | |
92 | 103 | |
93 | 104 | msgctxt "#30156" |
94 | 105 | msgid "Manually select all streams" |
95 | msgstr "" | |
106 | msgstr "手動選択" | |
96 | 107 | |
97 | 108 | msgctxt "#30157" |
98 | 109 | msgid "All" |
109 | 120 | # Show all video streams |
110 | 121 | msgctxt "#30160" |
111 | 122 | msgid "Manually select video stream" |
112 | msgstr "" | |
123 | msgstr "ビデオストリーム手動選択" | |
113 | 124 | |
114 | 125 | msgctxt "#30161" |
115 | 126 | msgid "Video + Subtitles" |
116 | msgstr "" | |
127 | msgstr "ビデオと字幕" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: kn_in\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n > 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
3 | 3 | # Addon Provider: peak3d |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | ||
6 | "Report-Msgid-Bugs-To: translations@kodi.tv\n" | |
7 | "PO-Revision-Date: 2021-08-01 09:42+0000\n" | |
8 | "Last-Translator: Joe Baek <aalive1@gmail.com>\n" | |
9 | "Language-Team: Korean <https://kodi.weblate.cloud/projects/kodi-add-ons-videoplayer-inputstream/inputstream-adaptive/ko_kr/>\n" | |
10 | "Language: ko_kr\n" | |
7 | 11 | "MIME-Version: 1.0\n" |
8 | 12 | "Content-Type: text/plain; charset=UTF-8\n" |
9 | 13 | "Content-Transfer-Encoding: 8bit\n" |
10 | "Language-Team: Korean\n" | |
11 | "Language: ko\n" | |
12 | 14 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" |
15 | "X-Generator: Weblate 4.7.2\n" | |
16 | ||
17 | msgctxt "Addon Summary" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "가변 스트림을 위한 InputStream 클라이언트" | |
20 | ||
21 | msgctxt "Addon Description" | |
22 | msgid "InputStream client for adaptive streams" | |
23 | msgstr "가변 스트림을 위한 InputStream 클라이언트" | |
13 | 24 | |
14 | 25 | msgctxt "#30100" |
15 | 26 | msgid "General" |
64 | 75 | |
65 | 76 | msgctxt "#30121" |
66 | 77 | msgid "Enable Pre-Release Features" |
67 | msgstr "" | |
78 | msgstr "공개 전 기능 활성화" | |
79 | ||
80 | msgctxt "#30122" | |
81 | msgid "Don't use secure decoder if possible" | |
82 | msgstr "가능하면 보안 복호화기 사용 않음" | |
68 | 83 | |
69 | 84 | msgctxt "#30150" |
70 | 85 | msgid "Max" |
88 | 103 | |
89 | 104 | msgctxt "#30155" |
90 | 105 | msgid "Automatically select streams" |
91 | msgstr "" | |
106 | msgstr "자동으로 스트림 선택" | |
92 | 107 | |
93 | 108 | msgctxt "#30156" |
94 | 109 | msgid "Manually select all streams" |
95 | msgstr "" | |
110 | msgstr "수동으로 모든 스트림 선택" | |
96 | 111 | |
97 | 112 | msgctxt "#30157" |
98 | 113 | msgid "All" |
109 | 124 | # Show all video streams |
110 | 125 | msgctxt "#30160" |
111 | 126 | msgid "Manually select video stream" |
112 | msgstr "" | |
127 | msgstr "수동으로 비디오 스트림 선택" | |
113 | 128 | |
114 | 129 | msgctxt "#30161" |
115 | 130 | msgid "Video + Subtitles" |
116 | msgstr "" | |
131 | msgstr "비디오 + 자막" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: lt_lt\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=3; plural=(n % 10 == 1 && (n % 100 < 11 || n % 100 > 19)) ? 0 : ((n % 10 >= 2 && n % 10 <= 9 && (n % 100 < 11 || n % 100 > 19)) ? 1 : 2);\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: lv_lv\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 <= 19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: ml_in\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n != 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: mn_mn\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n != 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: mt_mt\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=4; plural=n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: my_mm\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=1; plural=0;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: nb_no\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n != 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
3 | 3 | # Addon Provider: peak3d |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | ||
6 | "Language-Team: Dutch\n" | |
7 | "Language: nl\n" | |
7 | 8 | "MIME-Version: 1.0\n" |
8 | 9 | "Content-Type: text/plain; charset=UTF-8\n" |
9 | 10 | "Content-Transfer-Encoding: 8bit\n" |
10 | "Language-Team: Dutch\n" | |
11 | "Language: nl\n" | |
12 | 11 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
13 | 20 | |
14 | 21 | msgctxt "#30100" |
15 | 22 | msgid "General" |
66 | 73 | msgid "Enable Pre-Release Features" |
67 | 74 | msgstr "Pre-release features inschakelen" |
68 | 75 | |
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
69 | 80 | msgctxt "#30150" |
70 | 81 | msgid "Max" |
71 | 82 | msgstr "Max" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: os_os\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n != 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
3 | 3 | # Addon Provider: peak3d |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | ||
6 | "Report-Msgid-Bugs-To: translations@kodi.tv\n" | |
7 | "PO-Revision-Date: 2021-07-17 20:22+0000\n" | |
8 | "Last-Translator: Christian Gade <gade@kodi.tv>\n" | |
9 | "Language-Team: Polish <https://kodi.weblate.cloud/projects/kodi-add-ons-videoplayer-inputstream/inputstream-adaptive/pl_pl/>\n" | |
10 | "Language: pl_pl\n" | |
7 | 11 | "MIME-Version: 1.0\n" |
8 | 12 | "Content-Type: text/plain; charset=UTF-8\n" |
9 | 13 | "Content-Transfer-Encoding: 8bit\n" |
10 | "Language-Team: Polish\n" | |
11 | "Language: pl\n" | |
12 | 14 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" |
15 | "X-Generator: Weblate 4.7.1\n" | |
16 | ||
17 | msgctxt "Addon Summary" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "Klient InputStream dla strumieni adaptacyjnych" | |
20 | ||
21 | msgctxt "Addon Description" | |
22 | msgid "InputStream client for adaptive streams" | |
23 | msgstr "Klient InputStream dla strumieni adaptacyjnych" | |
13 | 24 | |
14 | 25 | msgctxt "#30100" |
15 | 26 | msgid "General" |
66 | 77 | msgid "Enable Pre-Release Features" |
67 | 78 | msgstr "Włącz funkcje wydań niestabilnych" |
68 | 79 | |
80 | msgctxt "#30122" | |
81 | msgid "Don't use secure decoder if possible" | |
82 | msgstr "Nie używaj bezpiecznego dekodera, jeśli to możliwe" | |
83 | ||
69 | 84 | msgctxt "#30150" |
70 | 85 | msgid "Max" |
71 | 86 | msgstr "Maks" |
88 | 103 | |
89 | 104 | msgctxt "#30155" |
90 | 105 | msgid "Automatically select streams" |
91 | msgstr "" | |
106 | msgstr "Automatycznie wybieraj strumienie" | |
92 | 107 | |
93 | 108 | msgctxt "#30156" |
94 | 109 | msgid "Manually select all streams" |
95 | msgstr "" | |
110 | msgstr "Ręcznie wybieraj wszystkie strumienie" | |
96 | 111 | |
97 | 112 | msgctxt "#30157" |
98 | 113 | msgid "All" |
109 | 124 | # Show all video streams |
110 | 125 | msgctxt "#30160" |
111 | 126 | msgid "Manually select video stream" |
112 | msgstr "" | |
127 | msgstr "Ręcznie wybieraj strumień wideo" | |
113 | 128 | |
114 | 129 | msgctxt "#30161" |
115 | 130 | msgid "Video + Subtitles" |
116 | msgstr "" | |
131 | msgstr "Wideo + napisy" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: pt_br\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n > 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: pt_pt\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n > 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: ro_md\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=3; plural=(n == 1) ? 0 : ((n == 0 || n % 100 >= 2 && n % 100 <= 19) ? 1 : 2);\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
3 | 3 | # Addon Provider: peak3d |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | ||
6 | "Last-Translator: tmihai20\n" | |
7 | "Language-Team: Romanian (Romania)\n" | |
8 | "Language: ro\n" | |
7 | 9 | "MIME-Version: 1.0\n" |
8 | 10 | "Content-Type: text/plain; charset=UTF-8\n" |
9 | 11 | "Content-Transfer-Encoding: 8bit\n" |
10 | "Last-Translator: tmihai20\n" | |
11 | "Language-Team: Romanian (Romania)\n" | |
12 | "Language: ro\n" | |
13 | 12 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" |
13 | ||
14 | msgctxt "Addon Summary" | |
15 | msgid "InputStream client for adaptive streams" | |
16 | msgstr "" | |
17 | ||
18 | msgctxt "Addon Description" | |
19 | msgid "InputStream client for adaptive streams" | |
20 | msgstr "" | |
14 | 21 | |
15 | 22 | msgctxt "#30100" |
16 | 23 | msgid "General" |
67 | 74 | msgid "Enable Pre-Release Features" |
68 | 75 | msgstr "Activează caracteristici experimentale" |
69 | 76 | |
77 | msgctxt "#30122" | |
78 | msgid "Don't use secure decoder if possible" | |
79 | msgstr "" | |
80 | ||
70 | 81 | msgctxt "#30150" |
71 | 82 | msgid "Max" |
72 | 83 | msgstr "Maxim" |
3 | 3 | # Addon Provider: peak3d |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | ||
6 | "Language-Team: Russian\n" | |
7 | "Language: ru\n" | |
7 | 8 | "MIME-Version: 1.0\n" |
8 | 9 | "Content-Type: text/plain; charset=UTF-8\n" |
9 | 10 | "Content-Transfer-Encoding: 8bit\n" |
10 | "Language-Team: Russian\n" | |
11 | "Language: ru\n" | |
12 | 11 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
13 | 20 | |
14 | 21 | msgctxt "#30100" |
15 | 22 | msgid "General" |
66 | 73 | msgid "Enable Pre-Release Features" |
67 | 74 | msgstr "Включить предрелизные возможности" |
68 | 75 | |
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
69 | 80 | msgctxt "#30150" |
70 | 81 | msgid "Max" |
71 | 82 | msgstr "Макс" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: scn\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n != 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: si_lk\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n > 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
3 | 3 | # Addon Provider: peak3d |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | ||
6 | "Last-Translator: Matej Moško <kamosko@panakrala.sk>\n" | |
7 | "Language-Team: Slovak\n" | |
8 | "Language: sk_SK\n" | |
7 | 9 | "MIME-Version: 1.0\n" |
8 | 10 | "Content-Type: text/plain; charset=UTF-8\n" |
9 | 11 | "Content-Transfer-Encoding: 8bit\n" |
10 | "Last-Translator: Matej Moško <kamosko@panakrala.sk>\n" | |
11 | "Language-Team: Slovak\n" | |
12 | "Language: sk_SK\n" | |
13 | 12 | "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n>=2 && n<=4 ? 1 : 2);\n" |
13 | ||
14 | msgctxt "Addon Summary" | |
15 | msgid "InputStream client for adaptive streams" | |
16 | msgstr "" | |
17 | ||
18 | msgctxt "Addon Description" | |
19 | msgid "InputStream client for adaptive streams" | |
20 | msgstr "" | |
14 | 21 | |
15 | 22 | msgctxt "#30100" |
16 | 23 | msgid "General" |
67 | 74 | msgid "Enable Pre-Release Features" |
68 | 75 | msgstr "Povoliť Experimentálne Funkcie" |
69 | 76 | |
77 | msgctxt "#30122" | |
78 | msgid "Don't use secure decoder if possible" | |
79 | msgstr "" | |
80 | ||
70 | 81 | msgctxt "#30150" |
71 | 82 | msgid "Max" |
72 | 83 | msgstr "Maximum" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: sq_al\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n != 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: sr_rs\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: sr_Latn\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
3 | 3 | # Addon Provider: peak3d |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | ||
6 | "Language-Team: Swedish (Sweden)\n" | |
7 | "Language: sv_SE\n" | |
7 | 8 | "MIME-Version: 1.0\n" |
8 | 9 | "Content-Type: text/plain; charset=UTF-8\n" |
9 | 10 | "Content-Transfer-Encoding: 8bit\n" |
10 | "Language-Team: Swedish (Sweden)\n" | |
11 | "Language: sv_SE\n" | |
12 | 11 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
13 | 20 | |
14 | 21 | msgctxt "#30100" |
15 | 22 | msgid "General" |
66 | 73 | msgid "Enable Pre-Release Features" |
67 | 74 | msgstr "Aktivera förhandsutgivningsfunktioner" |
68 | 75 | |
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
69 | 80 | msgctxt "#30150" |
70 | 81 | msgid "Max" |
71 | 82 | msgstr "Högsta" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: szl\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: ta_in\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n != 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: tg_tj\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=1; plural=0;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: th_th\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=1; plural=0;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: tr_tr\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n != 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: uk_ua\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: uz_uz\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n != 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: vi_vn\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=1; plural=0;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: zh_cn\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n != 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
0 | # Kodi Media Center language file | |
1 | # Addon Name: Inputstream.adaptive | |
2 | # Addon id: inputstream.adaptive | |
3 | # Addon Provider: peak3d | |
4 | msgid "" | |
5 | msgstr "" | |
6 | "Language-Team: none\n" | |
7 | "Language: zh_tw\n" | |
8 | "MIME-Version: 1.0\n" | |
9 | "Content-Type: text/plain; charset=UTF-8\n" | |
10 | "Content-Transfer-Encoding: 8bit\n" | |
11 | "Plural-Forms: nplurals=2; plural=n != 1;\n" | |
12 | ||
13 | msgctxt "Addon Summary" | |
14 | msgid "InputStream client for adaptive streams" | |
15 | msgstr "" | |
16 | ||
17 | msgctxt "Addon Description" | |
18 | msgid "InputStream client for adaptive streams" | |
19 | msgstr "" | |
20 | ||
21 | msgctxt "#30100" | |
22 | msgid "General" | |
23 | msgstr "" | |
24 | ||
25 | # The minimum bandwidth which should not be deceeded. | |
26 | msgctxt "#30101" | |
27 | msgid "Min. Bandwidth (Bit/s)" | |
28 | msgstr "" | |
29 | ||
30 | # The maximum bandwidth which should not be exceeded. 0=unlimited | |
31 | msgctxt "#30102" | |
32 | msgid "Max. Bandwidth (Bit/s)" | |
33 | msgstr "" | |
34 | ||
35 | # Absolute path to the folder containing the decrypters | |
36 | msgctxt "#30103" | |
37 | msgid "Decrypter path" | |
38 | msgstr "" | |
39 | ||
40 | # Maximum Resolution | |
41 | msgctxt "#30110" | |
42 | msgid "Max. Resolution general decoder" | |
43 | msgstr "" | |
44 | ||
45 | msgctxt "#30111" | |
46 | msgid "Stream Selection" | |
47 | msgstr "" | |
48 | ||
49 | msgctxt "#30112" | |
50 | msgid "Media" | |
51 | msgstr "" | |
52 | ||
53 | # Maximum allowed resolution if decoded through secure path | |
54 | msgctxt "#30113" | |
55 | msgid "Max. Resolution secure decoder" | |
56 | msgstr "" | |
57 | ||
58 | # Select streams without respecting HDCP status | |
59 | msgctxt "#30114" | |
60 | msgid "Override HDCP status" | |
61 | msgstr "" | |
62 | ||
63 | # Do not respect display resolution when selecting streams | |
64 | msgctxt "#30115" | |
65 | msgid "Ignore Display Resolution" | |
66 | msgstr "" | |
67 | ||
68 | msgctxt "#30120" | |
69 | msgid "Expert" | |
70 | msgstr "" | |
71 | ||
72 | msgctxt "#30121" | |
73 | msgid "Enable Pre-Release Features" | |
74 | msgstr "" | |
75 | ||
76 | msgctxt "#30122" | |
77 | msgid "Don't use secure decoder if possible" | |
78 | msgstr "" | |
79 | ||
80 | msgctxt "#30150" | |
81 | msgid "Max" | |
82 | msgstr "" | |
83 | ||
84 | msgctxt "#30151" | |
85 | msgid "480p" | |
86 | msgstr "" | |
87 | ||
88 | msgctxt "#30152" | |
89 | msgid "640p" | |
90 | msgstr "" | |
91 | ||
92 | msgctxt "#30153" | |
93 | msgid "720p" | |
94 | msgstr "" | |
95 | ||
96 | msgctxt "#30154" | |
97 | msgid "1080p" | |
98 | msgstr "" | |
99 | ||
100 | msgctxt "#30155" | |
101 | msgid "Automatically select streams" | |
102 | msgstr "" | |
103 | ||
104 | msgctxt "#30156" | |
105 | msgid "Manually select all streams" | |
106 | msgstr "" | |
107 | ||
108 | msgctxt "#30157" | |
109 | msgid "All" | |
110 | msgstr "" | |
111 | ||
112 | msgctxt "#30158" | |
113 | msgid "Audio" | |
114 | msgstr "" | |
115 | ||
116 | msgctxt "#30159" | |
117 | msgid "Video" | |
118 | msgstr "" | |
119 | ||
120 | # Show all video streams | |
121 | msgctxt "#30160" | |
122 | msgid "Manually select video stream" | |
123 | msgstr "" | |
124 | ||
125 | msgctxt "#30161" | |
126 | msgid "Video + Subtitles" | |
127 | msgstr "" |
90 | 90 | </category> |
91 | 91 | <category id="expert" label="30120"> |
92 | 92 | <group id="0"> |
93 | <setting id="PRERELEASEFEATURES" type="boolean" label="30121"> | |
93 | <setting id="NOSECUREDECODER" type="boolean" label="30122"> | |
94 | 94 | <level>0</level> |
95 | 95 | <default>false</default> |
96 | 96 | <control type="toggle" /> |
97 | <dependencies> | |
98 | <dependency type="visible"> | |
99 | <condition on="property" name="InfoBool">system.platform.android</condition> | |
100 | </dependency> | |
101 | </dependencies> | |
97 | 102 | </setting> |
98 | 103 | </group> |
99 | 104 | </category> |
182 | 182 | case NAL_VPS_NUT: |
183 | 183 | if (m_NeedVPS) |
184 | 184 | { |
185 | memcpy(stream_info.extra_data + stream_info.extra_data_size, es_buf + (buf_ptr - 4), NumBytesInNalUnit); | |
186 | stream_info.extra_data_size += NumBytesInNalUnit; | |
187 | m_NeedVPS = false; | |
185 | if (stream_info.extra_data_size + NumBytesInNalUnit <= sizeof(stream_info.extra_data)) | |
186 | { | |
187 | memcpy(stream_info.extra_data + stream_info.extra_data_size, es_buf + (buf_ptr - 4), NumBytesInNalUnit); | |
188 | stream_info.extra_data_size += NumBytesInNalUnit; | |
189 | m_NeedVPS = false; | |
190 | } | |
191 | else | |
192 | { | |
193 | DBG(DEMUX_DBG_INFO, "HEVC fixme: stream_info.extra_data too small! %i\n", stream_info.extra_data_size + NumBytesInNalUnit); | |
194 | } | |
188 | 195 | } |
189 | 196 | break; |
190 | 197 | |
199 | 206 | Parse_SPS(buf, NumBytesInNalUnit, hdr); |
200 | 207 | if (m_NeedSPS) |
201 | 208 | { |
202 | memcpy(stream_info.extra_data + stream_info.extra_data_size, es_buf + (buf_ptr - 4), NumBytesInNalUnit); | |
203 | stream_info.extra_data_size += NumBytesInNalUnit; | |
204 | m_NeedSPS = false; | |
209 | if (stream_info.extra_data_size + NumBytesInNalUnit <= sizeof(stream_info.extra_data)) | |
210 | { | |
211 | memcpy(stream_info.extra_data + stream_info.extra_data_size, es_buf + (buf_ptr - 4), NumBytesInNalUnit); | |
212 | stream_info.extra_data_size += NumBytesInNalUnit; | |
213 | m_NeedSPS = false; | |
214 | } | |
215 | else | |
216 | { | |
217 | DBG(DEMUX_DBG_INFO, "HEVC fixme: stream_info.extra_data too small! %i\n", stream_info.extra_data_size + NumBytesInNalUnit); | |
218 | } | |
205 | 219 | } |
206 | 220 | break; |
207 | 221 | } |
217 | 231 | Parse_PPS(buf, NumBytesInNalUnit); |
218 | 232 | if (m_NeedPPS) |
219 | 233 | { |
220 | memcpy(stream_info.extra_data + stream_info.extra_data_size, es_buf + (buf_ptr - 4), NumBytesInNalUnit); | |
221 | stream_info.extra_data_size += NumBytesInNalUnit; | |
222 | m_NeedPPS = false; | |
234 | if (stream_info.extra_data_size + NumBytesInNalUnit <= sizeof(stream_info.extra_data)) | |
235 | { | |
236 | memcpy(stream_info.extra_data + stream_info.extra_data_size, es_buf + (buf_ptr - 4), NumBytesInNalUnit); | |
237 | stream_info.extra_data_size += NumBytesInNalUnit; | |
238 | m_NeedPPS = false; | |
239 | } | |
240 | else | |
241 | { | |
242 | DBG(DEMUX_DBG_INFO, "HEVC fixme: stream_info.extra_data too small! %i\n", stream_info.extra_data_size + NumBytesInNalUnit); | |
243 | } | |
223 | 244 | } |
224 | 245 | break; |
225 | 246 | } |
72 | 72 | int bit_rate; |
73 | 73 | int bits_per_sample; |
74 | 74 | bool interlaced; |
75 | uint8_t extra_data[256]; | |
75 | uint8_t extra_data[512]; | |
76 | 76 | int extra_data_size; |
77 | 77 | }; |
78 | 78 |
20 | 20 | { |
21 | 21 | PROPERTY_HEADER |
22 | 22 | }; |
23 | static const uint32_t version = 11; | |
23 | static const uint32_t version = 13; | |
24 | 24 | #if defined(ANDROID) |
25 | 25 | virtual void* GetJNIEnv() = 0; |
26 | 26 | virtual int GetSDKVersion() = 0; |
181 | 181 | // Return supported URN if type matches to capabilities, otherwise null |
182 | 182 | virtual const char *SelectKeySytem(const char* keySystem) = 0; |
183 | 183 | virtual bool OpenDRMSystem(const char *licenseURL, const AP4_DataBuffer &serverCertificate, const uint8_t config) = 0; |
184 | virtual AP4_CencSingleSampleDecrypter *CreateSingleSampleDecrypter(AP4_DataBuffer &pssh, const char *optionalKeyParameter, const uint8_t *defaultkeyid) = 0; | |
184 | virtual AP4_CencSingleSampleDecrypter *CreateSingleSampleDecrypter(AP4_DataBuffer &pssh, const char *optionalKeyParameter, const uint8_t *defaultkeyid, bool skipSessionMessage) = 0; | |
185 | 185 | virtual void DestroySingleSampleDecrypter(AP4_CencSingleSampleDecrypter* decrypter) = 0; |
186 | 186 | |
187 | 187 | virtual void GetCapabilities(AP4_CencSingleSampleDecrypter* decrypter, const uint8_t *keyid, uint32_t media, SSD_DECRYPTER::SSD_CAPS &caps) = 0; |
188 | 188 | virtual bool HasLicenseKey(AP4_CencSingleSampleDecrypter* decrypter, const uint8_t *keyid) = 0; |
189 | virtual bool HasCdmSession() = 0; | |
190 | virtual std::string GetChallengeB64Data(AP4_CencSingleSampleDecrypter* decrypter) = 0; | |
189 | 191 | |
190 | 192 | virtual bool OpenVideoDecoder(AP4_CencSingleSampleDecrypter* decrypter, const SSD_VIDEOINITDATA *initData) = 0; |
191 | 193 | virtual SSD_DECODE_RETVAL DecodeVideo(void* instance, SSD_SAMPLE *sample, SSD_PICTURE *picture) = 0; |
38 | 38 | currentPTSOffset_(0), |
39 | 39 | absolutePTSOffset_(0), |
40 | 40 | lastUpdated_(std::chrono::system_clock::now()), |
41 | lastMediaRenewal_(std::chrono::system_clock::now()), | |
42 | 41 | m_fixateInitialization(false), |
43 | 42 | m_segmentFileOffset(0), |
44 | 43 | play_timeshift_buffer_(false) |
88 | 87 | if (type_ == AdaptiveTree::SUBTITLE) |
89 | 88 | retryCount = 1; |
90 | 89 | |
91 | while (!ret && !stopped_ && retryCount-- && tree_.has_timeshift_buffer_) | |
90 | while (!ret && !stopped_ && retryCount--) | |
92 | 91 | { |
93 | 92 | std::this_thread::sleep_for(std::chrono::seconds(1)); |
94 | 93 | Log(LOGLEVEL_DEBUG, "AdaptiveStream: trying to reload segment ..."); |
114 | 113 | return static_cast<int>( |
115 | 114 | std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock::now() - tPoint) |
116 | 115 | .count()); |
117 | } | |
118 | ||
119 | uint32_t AdaptiveStream::SecondsSinceMediaRenewal() const | |
120 | { | |
121 | const std::chrono::time_point<std::chrono::system_clock>& tPoint( | |
122 | lastMediaRenewal_ > tree_.GetLastMediaRenewal() ? lastMediaRenewal_ | |
123 | : tree_.GetLastMediaRenewal()); | |
124 | return static_cast<int>( | |
125 | std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock::now() - tPoint) | |
126 | .count()); | |
127 | } | |
128 | ||
129 | void AdaptiveStream::UpdateSecondsSinceMediaRenewal() | |
130 | { | |
131 | lastMediaRenewal_ = std::chrono::system_clock::now(); | |
132 | 116 | } |
133 | 117 | |
134 | 118 | bool AdaptiveStream::write_data(const void* buffer, size_t buffer_size) |
309 | 293 | if (current_rep_->flags_ & AdaptiveTree::Representation::URLSEGMENTS) |
310 | 294 | { |
311 | 295 | download_url_ = seg->url; |
312 | if (download_url_.find("://", 0) == std::string::npos) | |
296 | if (download_url_.find("://") == std::string::npos) | |
313 | 297 | download_url_ = current_rep_->url_ + download_url_; |
314 | 298 | } |
315 | 299 | else |
88 | 88 | virtual bool parseIndexRange() { return false; }; |
89 | 89 | bool write_data(const void *buffer, size_t buffer_size); |
90 | 90 | bool prepareDownload(const AdaptiveTree::Segment *seg); |
91 | const std::string& getMediaRenewalUrl() const { return tree_.media_renewal_url_; }; | |
92 | const uint32_t& getMediaRenewalTime() const { return tree_.media_renewal_time_; }; | |
93 | uint32_t SecondsSinceMediaRenewal() const; | |
94 | void UpdateSecondsSinceMediaRenewal(); | |
95 | 91 | adaptive::AdaptiveTree& GetTree() { return tree_; }; |
92 | virtual void SetLastUpdated(std::chrono::system_clock::time_point tm) {}; | |
93 | std::chrono::time_point<std::chrono::system_clock> lastUpdated_; | |
96 | 94 | |
97 | 95 | private: |
98 | 96 | // Segment download section |
142 | 140 | std::size_t segment_read_pos_; |
143 | 141 | uint64_t absolute_position_; |
144 | 142 | uint64_t currentPTSOffset_, absolutePTSOffset_; |
145 | std::chrono::time_point<std::chrono::system_clock> lastUpdated_; | |
146 | std::chrono::time_point<std::chrono::system_clock> lastMediaRenewal_; | |
147 | 143 | |
148 | 144 | uint16_t width_, height_; |
149 | 145 | uint32_t bandwidth_; |
39 | 39 | AdaptiveTree::AdaptiveTree() |
40 | 40 | : current_period_(nullptr) |
41 | 41 | , next_period_(nullptr) |
42 | , update_parameter_pos_(std::string::npos) | |
43 | 42 | , parser_(0) |
44 | 43 | , currentNode_(0) |
45 | 44 | , segcount_(0) |
55 | 54 | , updateInterval_(~0) |
56 | 55 | , updateThread_(nullptr) |
57 | 56 | , lastUpdated_(std::chrono::system_clock::now()) |
58 | , lastMediaRenewal_(std::chrono::system_clock::now()) | |
59 | 57 | { |
60 | 58 | } |
61 | 59 | |
170 | 168 | } |
171 | 169 | |
172 | 170 | void AdaptiveTree::OnDataArrived(unsigned int segNum, uint16_t psshSet, uint8_t iv[16], const uint8_t *src, uint8_t *dst, size_t dstOffset, size_t dataSize) |
173 | { | |
171 | { | |
174 | 172 | memcpy(dst + dstOffset, src, dataSize); |
175 | 173 | } |
176 | 174 | |
314 | 312 | ++br; |
315 | 313 | } |
316 | 314 | |
317 | bool AdaptiveTree::PreparePaths(const std::string &url, const std::string &manifestUpdateParam) | |
318 | { | |
315 | bool AdaptiveTree::PreparePaths(const std::string &url) | |
316 | { | |
317 | manifest_url_ = url; | |
318 | ||
319 | 319 | size_t paramPos = url.find('?'); |
320 | 320 | base_url_ = (paramPos == std::string::npos) ? url : url.substr(0, paramPos); |
321 | if (paramPos != std::string::npos) | |
322 | manifest_parameter_= url.substr(paramPos); | |
323 | 321 | |
324 | 322 | paramPos = base_url_.find_last_of('/', base_url_.length()); |
325 | 323 | if (paramPos == std::string::npos) |
326 | 324 | { |
327 | Log(LOGLEVEL_ERROR, "Invalid mpdURL: / expected (%s)", manifest_url_.c_str()); | |
325 | Log(LOGLEVEL_ERROR, "Invalid url: / expected (%s)", url.c_str()); | |
328 | 326 | return false; |
329 | 327 | } |
330 | 328 | base_url_.resize(paramPos + 1); |
340 | 338 | else |
341 | 339 | base_domain_.clear(); |
342 | 340 | |
341 | return true; | |
342 | } | |
343 | ||
344 | void AdaptiveTree::PrepareManifestUrl(const std::string &url, const std::string &manifestUpdateParam) | |
345 | { | |
343 | 346 | manifest_url_ = url; |
344 | 347 | |
345 | 348 | if (manifestUpdateParam.empty()) |
361 | 364 | } |
362 | 365 | else |
363 | 366 | update_parameter_ = manifestUpdateParam; |
364 | ||
365 | if (!update_parameter_.empty()) | |
366 | { | |
367 | if (update_parameter_ != "full") | |
368 | { | |
369 | if ((update_parameter_pos_ = update_parameter_.find("$START_NUMBER$")) != std::string::npos) | |
370 | { | |
371 | if (update_parameter_[0] == '&' && manifest_url_.find("?") == std::string::npos) | |
372 | update_parameter_[0] = '?'; | |
373 | } | |
374 | else | |
375 | update_parameter_.clear(); | |
376 | } | |
377 | } | |
378 | return true; | |
379 | } | |
380 | ||
381 | void AdaptiveTree::SetEffectiveURL(const std::string& url) | |
382 | { | |
383 | effective_url_ = url; | |
384 | effective_domain_.clear(); | |
385 | std::string::size_type paramPos = effective_url_.find_first_of('?'); | |
386 | if (paramPos != std::string::npos) | |
387 | effective_url_.resize(paramPos); | |
388 | ||
389 | paramPos = effective_url_.find_last_of('/'); | |
390 | if (paramPos != std::string::npos) | |
391 | effective_url_.resize(paramPos + 1); | |
392 | else | |
393 | effective_url_.clear(); | |
394 | ||
395 | if (effective_url_ == base_url_) | |
396 | effective_url_.clear(); | |
397 | ||
398 | if (!effective_url_.empty()) | |
399 | { | |
400 | paramPos = effective_url_.find_first_of('/', 8); | |
401 | effective_domain_ = effective_url_.substr(0, paramPos); | |
402 | } | |
403 | 367 | } |
404 | 368 | |
405 | 369 | std::string AdaptiveTree::BuildDownloadUrl(const std::string& url) const |
406 | 370 | { |
407 | 371 | if (!url.empty()) |
408 | 372 | { |
409 | if (url.front() == '/') | |
410 | return effective_domain_.empty() ? base_domain_ + url : effective_domain_ + url; | |
411 | else if (!effective_url_.empty() && url.compare(0, base_url_.size(), base_url_) == 0) | |
412 | { | |
413 | std::string newUrl(url); | |
414 | newUrl.replace(0, base_url_.size(), effective_url_); | |
415 | return newUrl; | |
416 | } | |
373 | if (url.front() != '/' && url.find("://") == std::string::npos) | |
374 | return base_url_ + url; | |
375 | else if (url.front() == '/') | |
376 | return base_domain_ + url; | |
417 | 377 | } |
418 | 378 | return url; |
419 | 379 | } |
420 | ||
421 | 380 | |
422 | 381 | void AdaptiveTree::SortTree() |
423 | 382 | { |
127 | 127 | PREPARE_RESULT_FAILURE, |
128 | 128 | PREPARE_RESULT_OK, |
129 | 129 | PREPARE_RESULT_DRMCHANGED, |
130 | PREPARE_RESULT_DRMUNCHANGED, | |
130 | 131 | }; |
131 | 132 | |
132 | 133 | // Node definition |
172 | 173 | std::string codecs_; |
173 | 174 | std::string codec_private_data_; |
174 | 175 | std::string source_url_; |
176 | std::string base_url_; | |
175 | 177 | uint32_t bandwidth_; |
176 | 178 | uint32_t samplingRate_; |
177 | 179 | uint16_t width_, height_; |
411 | 413 | }*current_period_, *next_period_; |
412 | 414 | |
413 | 415 | std::vector<Period*> periods_; |
414 | std::string manifest_url_, base_url_, effective_url_, base_domain_, effective_domain_, | |
415 | update_parameter_; | |
416 | std::string::size_type update_parameter_pos_; | |
417 | std::string etag_, last_modified_; | |
418 | std::string media_renewal_url_; | |
419 | uint32_t media_renewal_time_; | |
420 | std::string manifest_parameter_; | |
416 | std::string manifest_url_; | |
417 | std::string base_url_; | |
418 | std::string effective_url_; | |
419 | std::string base_domain_; | |
420 | std::string update_parameter_; | |
421 | std::string etag_; | |
422 | std::string last_modified_; | |
421 | 423 | |
422 | 424 | /* XML Parsing*/ |
423 | 425 | XML_Parser parser_; |
451 | 453 | AdaptiveTree(); |
452 | 454 | virtual ~AdaptiveTree(); |
453 | 455 | |
454 | virtual bool open(const std::string &url, const std::string &manifestUpdateParam) = 0; | |
456 | virtual bool open(const std::string& url, const std::string& manifestUpdateParam) = 0; | |
457 | virtual bool open(const std::string& url, const std::string& manifestUpdateParam, std::map<std::string, std::string> additionalHeaders) = 0; | |
455 | 458 | virtual PREPARE_RESULT prepareRepresentation(Period* period, |
456 | 459 | AdaptationSet* adp, |
457 | 460 | Representation* rep, |
482 | 485 | : 0; |
483 | 486 | }; |
484 | 487 | |
485 | void SetEffectiveURL(const std::string& url); | |
486 | 488 | std::string BuildDownloadUrl(const std::string& url) const; |
487 | 489 | |
488 | 490 | std::mutex &GetTreeMutex() { return treeMutex_; }; |
489 | 491 | bool HasUpdateThread() const { return updateThread_ != 0 && has_timeshift_buffer_ && updateInterval_ && !update_parameter_.empty(); }; |
490 | 492 | void RefreshUpdateThread(); |
491 | 493 | const std::chrono::time_point<std::chrono::system_clock> GetLastUpdated() const { return lastUpdated_; }; |
492 | const std::chrono::time_point<std::chrono::system_clock> GetLastMediaRenewal() const { return lastMediaRenewal_; }; | |
493 | 494 | |
494 | 495 | protected: |
495 | virtual bool download(const char* url, const std::map<std::string, std::string> &manifestHeaders, void *opaque = nullptr, bool scanEffectiveURL = true); | |
496 | virtual bool download(const char* url, | |
497 | const std::map<std::string, std::string>& manifestHeaders, | |
498 | void* opaque = nullptr, | |
499 | bool isManifest = true); | |
496 | 500 | virtual bool write_data(void *buffer, size_t buffer_size, void *opaque) = 0; |
497 | bool PreparePaths(const std::string &url, const std::string &manifestUpdateParam); | |
501 | bool PreparePaths(const std::string &url); | |
502 | void PrepareManifestUrl(const std::string &url, const std::string &manifestUpdateParam); | |
498 | 503 | void SortTree(); |
499 | 504 | |
500 | 505 | // Live segment update section |
506 | 511 | std::condition_variable updateVar_; |
507 | 512 | std::thread *updateThread_; |
508 | 513 | std::chrono::time_point<std::chrono::system_clock> lastUpdated_; |
509 | std::chrono::time_point<std::chrono::system_clock> lastMediaRenewal_; | |
510 | 514 | |
511 | 515 | private: |
512 | 516 | void SegmentUpdateWorker(); |
48 | 48 | void parseheader(std::map<std::string, std::string>& headerMap, const std::string& headerString); |
49 | 49 | int endswith(const char* in, const char* suffix); |
50 | 50 | |
51 | extern bool preReleaseFeatures; | |
52 | ||
53 | 51 | #define MKTAG(a,b,c,d) ((a) | ((b) << 8) | ((c) << 16) | ((unsigned)(d) << 24)) |
59 | 59 | (p) = NULL; \ |
60 | 60 | } while (0) |
61 | 61 | |
62 | //extern definition in helpers.h | |
63 | bool preReleaseFeatures = false; | |
64 | ||
65 | 62 | void Log(const LogLevel loglevel, const char* format, ...) |
66 | 63 | { |
67 | 64 | char buffer[16384]; |
263 | 260 | bool adaptive::AdaptiveTree::download(const char* url, |
264 | 261 | const std::map<std::string, std::string>& manifestHeaders, |
265 | 262 | void* opaque, |
266 | bool scanEffectiveURL) | |
263 | bool isManifest) | |
267 | 264 | { |
268 | 265 | // open the file |
269 | 266 | kodi::vfs::CFile file; |
280 | 277 | |
281 | 278 | if (!file.CURLOpen(ADDON_READ_CHUNKED | ADDON_READ_NO_CACHE)) |
282 | 279 | { |
283 | kodi::Log(ADDON_LOG_ERROR, "Cannot download %s", url); | |
280 | kodi::Log(ADDON_LOG_ERROR, "Download failed: %s", url); | |
284 | 281 | return false; |
285 | 282 | } |
286 | 283 | |
287 | if (scanEffectiveURL) | |
288 | { | |
289 | std::string effective_url = file.GetPropertyValue(ADDON_FILE_PROPERTY_EFFECTIVE_URL, ""); | |
290 | kodi::Log(ADDON_LOG_DEBUG, "Effective URL %s", effective_url.c_str()); | |
291 | SetEffectiveURL(effective_url); | |
284 | effective_url_ = file.GetPropertyValue(ADDON_FILE_PROPERTY_EFFECTIVE_URL, ""); | |
285 | ||
286 | if (isManifest && !PreparePaths(effective_url_)) | |
287 | { | |
288 | file.Close(); | |
289 | return false; | |
292 | 290 | } |
293 | 291 | |
294 | 292 | // read the file |
306 | 304 | |
307 | 305 | file.Close(); |
308 | 306 | |
309 | kodi::Log(ADDON_LOG_DEBUG, "Download %s finished", url); | |
307 | kodi::Log(ADDON_LOG_DEBUG, "Download finished: %s", effective_url_.c_str()); | |
310 | 308 | |
311 | 309 | return nbRead == 0; |
312 | 310 | } |
314 | 312 | bool KodiAdaptiveStream::download(const char* url, |
315 | 313 | const std::map<std::string, std::string>& mediaHeaders) |
316 | 314 | { |
317 | bool retry_403 = true; | |
318 | bool retry_MRT = true; | |
319 | 315 | kodi::vfs::CFile file; |
320 | std::string newUrl; | |
321 | ||
322 | RETRY: | |
316 | ||
323 | 317 | // open the file |
324 | 318 | if (!file.CURLCreate(url)) |
325 | 319 | return false; |
345 | 339 | |
346 | 340 | size_t nbRead = ~0UL; |
347 | 341 | |
348 | if (((returnCode == 403 && retry_403) || | |
349 | (getMediaRenewalTime() > 0 && SecondsSinceMediaRenewal() >= getMediaRenewalTime() && | |
350 | retry_MRT)) && | |
351 | !getMediaRenewalUrl().empty()) | |
352 | { | |
353 | UpdateSecondsSinceMediaRenewal(); | |
354 | ||
355 | if (returnCode == 403) | |
356 | retry_403 = false; | |
357 | else | |
358 | retry_MRT = false; | |
359 | ||
360 | std::vector<kodi::vfs::CDirEntry> items; | |
361 | if (kodi::vfs::GetDirectory(getMediaRenewalUrl(), "", items) && items.size() == 1) | |
362 | { | |
363 | std::string effective_url = items[0].Path(); | |
364 | if (effective_url.back() != '/') | |
365 | effective_url += '/'; | |
366 | kodi::Log(ADDON_LOG_DEBUG, "Renewed URL: %s", effective_url.c_str()); | |
367 | GetTree().SetEffectiveURL(effective_url); | |
368 | newUrl = GetTree().BuildDownloadUrl(url); | |
369 | url = newUrl.c_str(); | |
370 | goto RETRY; | |
371 | } | |
372 | else | |
373 | kodi::Log(ADDON_LOG_ERROR, "Retrieving renewal URL failed (%s)", | |
374 | getMediaRenewalUrl().c_str()); | |
375 | } | |
376 | else if (returnCode >= 400) | |
377 | { | |
378 | kodi::Log(ADDON_LOG_ERROR, "Download %s failed with error: %d", url, returnCode); | |
342 | if (returnCode >= 400) | |
343 | { | |
344 | kodi::Log(ADDON_LOG_ERROR, "Download failed with error %d: %s", returnCode, url); | |
379 | 345 | } |
380 | 346 | else |
381 | 347 | { |
388 | 354 | |
389 | 355 | if (!nbReadOverall) |
390 | 356 | { |
391 | kodi::Log(ADDON_LOG_ERROR, "Download %s doesn't provide any data: invalid", url); | |
357 | kodi::Log(ADDON_LOG_ERROR, "Download doesn't provide any data: %s", url); | |
392 | 358 | return false; |
393 | 359 | } |
394 | 360 | |
404 | 370 | current_download_speed_ * ratio); |
405 | 371 | } |
406 | 372 | kodi::Log(ADDON_LOG_DEBUG, |
407 | "Download %s finished, avg speed: %0.2lfbyte/s, current speed: %0.2lfbyte/s", url, | |
373 | "Download finished: %s , avg speed: %0.2lfbyte/s, current speed: %0.2lfbyte/s", url, | |
408 | 374 | get_download_speed(), current_download_speed_); |
409 | 375 | } |
410 | 376 | file.Close(); |
889 | 855 | AP4_DYNAMIC_CAST(AP4_HevcSampleDescription, sample_description)) |
890 | 856 | { |
891 | 857 | bool ret = false; |
892 | if (hevc->GetConstantFrameRate() && hevc->GetAverageFrameRate()) | |
858 | if (hevc->GetAverageFrameRate()) | |
893 | 859 | { |
894 | 860 | info.SetFpsRate(hevc->GetAverageFrameRate()); |
861 | info.SetFpsScale(256); | |
862 | ret = true; | |
863 | } | |
864 | else if (hevc->GetConstantFrameRate()) | |
865 | { | |
866 | info.SetFpsRate(hevc->GetConstantFrameRate()); | |
895 | 867 | info.SetFpsScale(256); |
896 | 868 | ret = true; |
897 | 869 | } |
1050 | 1022 | virtual void AddStreamType(INPUTSTREAM_TYPE type, uint32_t sid){}; |
1051 | 1023 | virtual void SetStreamType(INPUTSTREAM_TYPE type, uint32_t sid){}; |
1052 | 1024 | virtual bool RemoveStreamType(INPUTSTREAM_TYPE type) { return true; }; |
1025 | virtual bool IsStarted() const = 0; | |
1053 | 1026 | }; |
1054 | 1027 | |
1055 | 1028 | /******************************************************* |
1080 | 1053 | void AddStreamType(INPUTSTREAM_TYPE type, uint32_t sid) override{}; |
1081 | 1054 | void SetStreamType(INPUTSTREAM_TYPE type, uint32_t sid) override{}; |
1082 | 1055 | bool RemoveStreamType(INPUTSTREAM_TYPE type) override { return true; }; |
1056 | bool IsStarted() const override { return true; } | |
1083 | 1057 | } DummyReader; |
1084 | 1058 | |
1085 | 1059 | /******************************************************* |
1258 | 1232 | } |
1259 | 1233 | |
1260 | 1234 | bool EOS() const override { return m_eos; }; |
1235 | bool IsStarted() const override { return m_started; }; | |
1261 | 1236 | uint64_t DTS() const override { return m_dts; }; |
1262 | 1237 | uint64_t PTS() const override { return m_pts; }; |
1263 | 1238 | AP4_UI32 GetStreamId() const override { return m_streamId; }; |
1554 | 1529 | |
1555 | 1530 | file.CURLAddOption(ADDON_CURL_OPTION_PROTOCOL, "seekable", "0"); |
1556 | 1531 | file.CURLAddOption(ADDON_CURL_OPTION_PROTOCOL, "acceptencoding", "gzip"); |
1557 | file.CURLOpen(0); | |
1532 | file.CURLOpen(ADDON_READ_CHUNKED | ADDON_READ_NO_CACHE); | |
1558 | 1533 | |
1559 | 1534 | AP4_DataBuffer result; |
1560 | 1535 | |
1584 | 1559 | m_codecHandler = new TTMLCodecHandler(nullptr); |
1585 | 1560 | } |
1586 | 1561 | |
1562 | bool IsStarted() const override { return true; }; | |
1587 | 1563 | bool EOS() const override { return m_eos; }; |
1588 | 1564 | uint64_t DTS() const override { return m_pts; }; |
1589 | 1565 | uint64_t PTS() const override { return m_pts; }; |
1701 | 1677 | return m_typeMask == 0; |
1702 | 1678 | }; |
1703 | 1679 | |
1680 | bool IsStarted() const override { return m_started; } | |
1704 | 1681 | bool EOS() const override { return m_eos; } |
1705 | 1682 | uint64_t DTS() const override { return m_dts; } |
1706 | 1683 | uint64_t PTS() const override { return m_pts; } |
1798 | 1775 | ADTSSampleReader(AP4_ByteStream* input, AP4_UI32 streamId) |
1799 | 1776 | : ADTSReader(input), m_streamId(streamId), m_stream(dynamic_cast<AP4_DASHStream*>(input)){}; |
1800 | 1777 | |
1778 | bool IsStarted() const override { return m_started; } | |
1801 | 1779 | bool EOS() const override { return m_eos; } |
1802 | 1780 | uint64_t DTS() const override { return m_pts; } |
1803 | 1781 | uint64_t PTS() const override { return m_pts; } |
1883 | 1861 | WebmSampleReader(AP4_ByteStream* input, AP4_UI32 streamId) |
1884 | 1862 | : WebmReader(input), m_streamId(streamId), m_stream(dynamic_cast<AP4_DASHStream*>(input)){}; |
1885 | 1863 | |
1864 | bool IsStarted() const override { return m_started; } | |
1886 | 1865 | bool EOS() const override { return m_eos; } |
1887 | 1866 | uint64_t DTS() const override { return m_dts; } |
1888 | 1867 | uint64_t PTS() const override { return m_pts; } |
1995 | 1974 | const std::string& strLicKey, |
1996 | 1975 | const std::string& strLicData, |
1997 | 1976 | const std::string& strCert, |
1998 | const std::string& strMediaRenewalUrl, | |
1999 | const uint32_t intMediaRenewalTime, | |
2000 | 1977 | const std::map<std::string, std::string>& manifestHeaders, |
2001 | 1978 | const std::map<std::string, std::string>& mediaHeaders, |
2002 | 1979 | const std::string& profile_path, |
2004 | 1981 | uint16_t display_height, |
2005 | 1982 | const std::string& ov_audio, |
2006 | 1983 | bool play_timeshift_buffer, |
2007 | bool force_secure_decoder) | |
1984 | bool force_secure_decoder, | |
1985 | const std::string& drmPreInitData) | |
2008 | 1986 | : manifest_type_(manifestType), |
2009 | mpdFileURL_(strURL), | |
2010 | mpdUpdateParam_(strUpdateParam), | |
1987 | manifestURL_(strURL), | |
1988 | manifestUpdateParam_(strUpdateParam), | |
2011 | 1989 | license_key_(strLicKey), |
2012 | 1990 | license_type_(strLicType), |
2013 | 1991 | license_data_(strLicData), |
2027 | 2005 | chapter_start_time_(0), |
2028 | 2006 | chapter_seek_time_(0.0), |
2029 | 2007 | play_timeshift_buffer_(play_timeshift_buffer), |
2030 | force_secure_decoder_(force_secure_decoder) | |
2008 | force_secure_decoder_(force_secure_decoder), | |
2009 | drmPreInitData_(drmPreInitData) | |
2031 | 2010 | { |
2032 | 2011 | switch (manifest_type_) |
2033 | 2012 | { |
2069 | 2048 | manual_streams_ = kodi::GetSettingInt("STREAMSELECTION"); |
2070 | 2049 | kodi::Log(ADDON_LOG_DEBUG, "STREAMSELECTION selected: %d ", manual_streams_); |
2071 | 2050 | |
2072 | preReleaseFeatures = kodi::GetSettingBoolean("PRERELEASEFEATURES"); | |
2073 | if (preReleaseFeatures) | |
2074 | kodi::Log(ADDON_LOG_INFO, "PRERELEASEFEATURES enabled!"); | |
2051 | allow_no_secure_decoder_ = kodi::GetSettingBoolean("NOSECUREDECODER"); | |
2052 | kodi::Log(ADDON_LOG_DEBUG, "FORCENONSECUREDECODER selected: %d ", allow_no_secure_decoder_); | |
2075 | 2053 | |
2076 | 2054 | int buf = kodi::GetSettingInt("MEDIATYPE"); |
2077 | 2055 | switch (buf) |
2100 | 2078 | server_certificate_.SetDataSize(dstsz); |
2101 | 2079 | } |
2102 | 2080 | adaptiveTree_->manifest_headers_ = manifestHeaders; |
2103 | adaptiveTree_->media_renewal_url_ = strMediaRenewalUrl; | |
2104 | adaptiveTree_->media_renewal_time_ = intMediaRenewalTime; | |
2105 | 2081 | } |
2106 | 2082 | |
2107 | 2083 | Session::~Session() |
2195 | 2171 | void Session::DisposeSampleDecrypter() |
2196 | 2172 | { |
2197 | 2173 | if (decrypter_) |
2174 | { | |
2198 | 2175 | for (std::vector<CDMSESSION>::iterator b(cdm_sessions_.begin()), e(cdm_sessions_.end()); b != e; |
2199 | 2176 | ++b) |
2177 | { | |
2178 | b->cdm_session_str_ = nullptr; | |
2200 | 2179 | if (!b->shared_single_sample_decryptor_) |
2180 | { | |
2201 | 2181 | decrypter_->DestroySingleSampleDecrypter(b->single_sample_decryptor_); |
2182 | b->single_sample_decryptor_ = nullptr; | |
2183 | } | |
2184 | else | |
2185 | { | |
2186 | b->single_sample_decryptor_ = nullptr; | |
2187 | b->shared_single_sample_decryptor_ = false; | |
2188 | } | |
2189 | } | |
2190 | } | |
2202 | 2191 | } |
2203 | 2192 | |
2204 | 2193 | void Session::DisposeDecrypter() |
2234 | 2223 | kodi::Log(ADDON_LOG_DEBUG, "Supported URN: %s", adaptiveTree_->supportedKeySystem_.c_str()); |
2235 | 2224 | } |
2236 | 2225 | |
2237 | // Open mpd file with mpd location redirect support bool mpdSuccess; | |
2238 | std::string mpdUrl = | |
2239 | adaptiveTree_->location_.empty() ? mpdFileURL_.c_str() : adaptiveTree_->location_; | |
2240 | if (!adaptiveTree_->open(mpdUrl.c_str(), mpdUpdateParam_.c_str()) || adaptiveTree_->empty()) | |
2241 | { | |
2242 | kodi::Log(ADDON_LOG_ERROR, "Could not open / parse mpdURL (%s)", mpdFileURL_.c_str()); | |
2226 | // Preinitialize the DRM, if pre-initialisation data are provided | |
2227 | std::map<std::string, std::string> additionalHeaders = std::map<std::string, std::string>(); | |
2228 | ||
2229 | if (!drmPreInitData_.empty()) | |
2230 | { | |
2231 | std::string challengeB64; | |
2232 | std::string sessionId; | |
2233 | // Pre-initialize the DRM allow to generate the challenge and session ID data | |
2234 | // used to make licensed manifest requests (via proxy callback) | |
2235 | if (PreInitializeDRM(challengeB64, sessionId)) | |
2236 | { | |
2237 | additionalHeaders["challengeB64"] = challengeB64; | |
2238 | additionalHeaders["sessionId"] = sessionId; | |
2239 | } | |
2240 | else | |
2241 | { | |
2242 | kodi::Log(ADDON_LOG_ERROR, "%s - DRM pre-initialization failed", __FUNCTION__); | |
2243 | return false; | |
2244 | } | |
2245 | } | |
2246 | ||
2247 | // Open manifest file with location redirect support bool mpdSuccess; | |
2248 | std::string manifestUrl = | |
2249 | adaptiveTree_->location_.empty() ? manifestURL_.c_str() : adaptiveTree_->location_; | |
2250 | if (!adaptiveTree_->open(manifestUrl.c_str(), manifestUpdateParam_.c_str(), additionalHeaders) || adaptiveTree_->empty()) | |
2251 | { | |
2252 | kodi::Log(ADDON_LOG_ERROR, "Could not open / parse manifest (%s)", manifestUrl.c_str()); | |
2243 | 2253 | return false; |
2244 | 2254 | } |
2245 | 2255 | kodi::Log(ADDON_LOG_INFO, |
2246 | "Successfully parsed .mpd file. #Periods: %ld, #Streams in first period: %ld, Type: " | |
2256 | "Successfully parsed manifest file. #Periods: %ld, #Streams in first period: %ld, Type: " | |
2247 | 2257 | "%s, Download speed: %0.4f Bytes/s", |
2248 | 2258 | adaptiveTree_->periods_.size(), adaptiveTree_->current_period_->adaptationSets_.size(), |
2249 | 2259 | adaptiveTree_->has_timeshift_buffer_ ? "live" : "VOD", adaptiveTree_->download_speed_); |
2254 | 2264 | return InitializePeriod(); |
2255 | 2265 | } |
2256 | 2266 | |
2267 | bool Session::PreInitializeDRM(std::string& challengeB64, std::string& sessionId) | |
2268 | { | |
2269 | std::string psshData; | |
2270 | std::string kidData; | |
2271 | // Parse the PSSH/KID data | |
2272 | std::string::size_type posSplitter(drmPreInitData_.find("|")); | |
2273 | if (posSplitter != std::string::npos) | |
2274 | { | |
2275 | psshData = drmPreInitData_.substr(0, posSplitter); | |
2276 | kidData = drmPreInitData_.substr(posSplitter + 1); | |
2277 | } | |
2278 | ||
2279 | if (psshData.empty() || kidData.empty()) | |
2280 | { | |
2281 | kodi::Log(ADDON_LOG_ERROR, "%s - Invalid DRM pre-init data, must be as: {PSSH as base64}|{KID as base64}", __FUNCTION__); | |
2282 | return false; | |
2283 | } | |
2284 | ||
2285 | cdm_sessions_.resize(2); | |
2286 | memset(&cdm_sessions_.front(), 0, sizeof(CDMSESSION)); | |
2287 | // Try to initialize an SingleSampleDecryptor | |
2288 | kodi::Log(ADDON_LOG_DEBUG, "%s - Entering encryption section", __FUNCTION__); | |
2289 | ||
2290 | if (license_key_.empty()) | |
2291 | { | |
2292 | kodi::Log(ADDON_LOG_ERROR, "%s - Invalid license_key", __FUNCTION__); | |
2293 | return false; | |
2294 | } | |
2295 | ||
2296 | if (!decrypter_) | |
2297 | { | |
2298 | kodi::Log(ADDON_LOG_ERROR, "%s - No decrypter found for encrypted stream", __FUNCTION__); | |
2299 | return false; | |
2300 | } | |
2301 | ||
2302 | if (!decrypter_->HasCdmSession()) | |
2303 | { | |
2304 | if (!decrypter_->OpenDRMSystem(license_key_.c_str(), server_certificate_, drmConfig_)) | |
2305 | { | |
2306 | kodi::Log(ADDON_LOG_ERROR, "%s - OpenDRMSystem failed", __FUNCTION__); | |
2307 | return false; | |
2308 | } | |
2309 | } | |
2310 | ||
2311 | AP4_DataBuffer init_data; | |
2312 | const char* optionalKeyParameter(nullptr); | |
2313 | ||
2314 | // Set the provided PSSH | |
2315 | init_data.SetBufferSize(1024); | |
2316 | unsigned int init_data_size(1024); | |
2317 | ||
2318 | b64_decode(psshData.c_str(), psshData.size(), init_data.UseData(), init_data_size); | |
2319 | init_data.SetDataSize(init_data_size); | |
2320 | ||
2321 | // Decode the provided KID | |
2322 | uint8_t buffer[32]; | |
2323 | unsigned int buffer_size(32); | |
2324 | b64_decode(kidData.c_str(), kidData.size(), buffer, buffer_size); | |
2325 | const char* decodedKid = reinterpret_cast<const char*>(buffer); | |
2326 | ||
2327 | CDMSESSION& session(cdm_sessions_[1]); | |
2328 | ||
2329 | char hexkid[36]; | |
2330 | AP4_FormatHex(reinterpret_cast<const AP4_UI08*>(decodedKid), 16, hexkid), hexkid[32] = 0; | |
2331 | kodi::Log(ADDON_LOG_DEBUG, "%s - Initializing session with KID: %s", __FUNCTION__, hexkid); | |
2332 | ||
2333 | if (decrypter_ && init_data.GetDataSize() >= 4 && | |
2334 | (session.single_sample_decryptor_ = decrypter_->CreateSingleSampleDecrypter( | |
2335 | init_data, optionalKeyParameter, (const uint8_t*)decodedKid, true)) != 0) | |
2336 | { | |
2337 | session.cdm_session_str_ = session.single_sample_decryptor_->GetSessionId(); | |
2338 | sessionId = session.cdm_session_str_; | |
2339 | challengeB64 = decrypter_->GetChallengeB64Data(session.single_sample_decryptor_); | |
2340 | } | |
2341 | else | |
2342 | { | |
2343 | kodi::Log(ADDON_LOG_ERROR, "%s - Initialize failed (SingleSampleDecrypter)", __FUNCTION__); | |
2344 | cdm_sessions_[1].single_sample_decryptor_ = nullptr; | |
2345 | return false; | |
2346 | } | |
2347 | ||
2348 | DisposeSampleDecrypter(); | |
2349 | return true; | |
2350 | } | |
2351 | ||
2257 | 2352 | bool Session::InitializeDRM() |
2258 | 2353 | { |
2259 | DisposeSampleDecrypter(); | |
2260 | ||
2261 | 2354 | cdm_sessions_.resize(adaptiveTree_->current_period_->psshSets_.size()); |
2262 | 2355 | memset(&cdm_sessions_.front(), 0, sizeof(CDMSESSION)); |
2263 | 2356 | // Try to initialize an SingleSampleDecryptor |
2280 | 2373 | return false; |
2281 | 2374 | } |
2282 | 2375 | |
2283 | if (!decrypter_->OpenDRMSystem(license_key_.c_str(), server_certificate_, drmConfig_)) | |
2284 | { | |
2285 | kodi::Log(ADDON_LOG_ERROR, "OpenDRMSystem failed"); | |
2286 | return false; | |
2287 | } | |
2288 | ||
2376 | if (!decrypter_->HasCdmSession()) | |
2377 | { | |
2378 | if (!decrypter_->OpenDRMSystem(license_key_.c_str(), server_certificate_, drmConfig_)) | |
2379 | { | |
2380 | kodi::Log(ADDON_LOG_ERROR, "OpenDRMSystem failed"); | |
2381 | return false; | |
2382 | } | |
2383 | } | |
2289 | 2384 | std::string strkey(adaptiveTree_->supportedKeySystem_.substr(9)); |
2290 | 2385 | size_t pos; |
2291 | 2386 | while ((pos = strkey.find('-')) != std::string::npos) |
2438 | 2533 | const char* defkid = adaptiveTree_->current_period_->psshSets_[ses].defaultKID_.empty() |
2439 | 2534 | ? nullptr |
2440 | 2535 | : adaptiveTree_->current_period_->psshSets_[ses].defaultKID_.data(); |
2441 | session.single_sample_decryptor_ = nullptr; | |
2442 | session.shared_single_sample_decryptor_ = false; | |
2443 | 2536 | |
2444 | 2537 | if (decrypter_ && defkid) |
2445 | 2538 | { |
2473 | 2566 | if (decrypter_ && init_data.GetDataSize() >= 4 && |
2474 | 2567 | (session.single_sample_decryptor_ || |
2475 | 2568 | (session.single_sample_decryptor_ = decrypter_->CreateSingleSampleDecrypter( |
2476 | init_data, optionalKeyParameter, (const uint8_t*)defkid)) != 0)) | |
2569 | init_data, optionalKeyParameter, (const uint8_t*)defkid, false)) != 0)) | |
2477 | 2570 | { |
2478 | 2571 | |
2479 | 2572 | decrypter_->GetCapabilities(session.single_sample_decryptor_, (const uint8_t*)defkid, |
2486 | 2579 | { |
2487 | 2580 | session.cdm_session_str_ = session.single_sample_decryptor_->GetSessionId(); |
2488 | 2581 | secure_video_session_ = true; |
2489 | // Override this setting by information passed in manifest | |
2490 | if (!force_secure_decoder_ && !adaptiveTree_->current_period_->need_secure_decoder_) | |
2582 | ||
2583 | if (allow_no_secure_decoder_ | |
2584 | && !force_secure_decoder_ && !adaptiveTree_->current_period_->need_secure_decoder_) | |
2491 | 2585 | session.decrypter_caps_.flags &= ~SSD::SSD_DECRYPTER::SSD_CAPS::SSD_SECURE_DECODER; |
2492 | 2586 | } |
2493 | 2587 | } |
2543 | 2637 | SAFE_DELETE(*b); |
2544 | 2638 | streams_.clear(); |
2545 | 2639 | |
2546 | if (psshChanged && !InitializeDRM()) | |
2547 | return false; | |
2548 | else if (adaptiveTree_->current_period_->encryptionState_) | |
2640 | if (!psshChanged) | |
2549 | 2641 | kodi::Log(ADDON_LOG_DEBUG, "Reusing DRM psshSets for new period!"); |
2642 | else | |
2643 | { | |
2644 | kodi::Log(ADDON_LOG_DEBUG, "New period, dispose sample decrypter and reinitialize"); | |
2645 | DisposeSampleDecrypter(); | |
2646 | if (!InitializeDRM()) | |
2647 | return false; | |
2648 | } | |
2550 | 2649 | |
2551 | 2650 | bool hdcpOverride = kodi::GetSettingBoolean("HDCPOVERRIDE"); |
2552 | 2651 | |
2746 | 2845 | case adaptive::AdaptiveTree::PREPARE_RESULT_DRMCHANGED: |
2747 | 2846 | if (!InitializeDRM()) |
2748 | 2847 | return nullptr; |
2848 | case adaptive::AdaptiveTree::PREPARE_RESULT_DRMUNCHANGED: | |
2749 | 2849 | stream->encrypted = stream->stream_.getRepresentation()->pssh_set_ > 0; |
2750 | 2850 | needRefetch = true; |
2751 | 2851 | break; |
2851 | 2951 | return 0ULL; |
2852 | 2952 | } |
2853 | 2953 | |
2954 | void Session::StartReader( | |
2955 | STREAM* stream, uint64_t seekTimeCorrected, int64_t ptsDiff, bool preceeding, bool timing) | |
2956 | { | |
2957 | bool bReset = true; | |
2958 | if (timing) | |
2959 | seekTimeCorrected += stream->stream_.GetAbsolutePTSOffset(); | |
2960 | else | |
2961 | seekTimeCorrected -= ptsDiff; | |
2962 | stream->stream_.seek_time( | |
2963 | static_cast<double>(seekTimeCorrected / STREAM_TIME_BASE), | |
2964 | preceeding, bReset); | |
2965 | if (bReset) | |
2966 | stream->reader_->Reset(false); | |
2967 | bool bStarted = false; | |
2968 | stream->reader_->Start(bStarted); | |
2969 | if (bStarted && (stream->reader_->GetInformation(stream->info_))) | |
2970 | changed_ = true; | |
2971 | } | |
2972 | ||
2854 | 2973 | SampleReader* Session::GetNextSample() |
2855 | 2974 | { |
2856 | 2975 | STREAM *res(0), *waiting(0); |
2916 | 3035 | |
2917 | 3036 | seekTime -= chapterTime; |
2918 | 3037 | |
3038 | // don't try to seek past the end of the stream, leave a sensible amount so we can buffer properly | |
2919 | 3039 | if (adaptiveTree_->has_timeshift_buffer_) |
2920 | 3040 | { |
2921 | 3041 | uint64_t curTime, maxTime(0); |
2929 | 3049 | } |
2930 | 3050 | } |
2931 | 3051 | |
3052 | // correct for starting segment pts value of chapter and chapter offset within program | |
2932 | 3053 | uint64_t seekTimeCorrected = static_cast<uint64_t>(seekTime * STREAM_TIME_BASE); |
3054 | int64_t ptsDiff = 0; | |
2933 | 3055 | if (timing_stream_) |
2934 | 3056 | { |
3057 | // after seeking across chapters with fmp4 streams the reader will not have started | |
3058 | // so we start here to ensure that we have the required information to correctly | |
3059 | // seek with proper stream alignment | |
3060 | if (!timing_stream_->reader_->IsStarted()) | |
3061 | StartReader(timing_stream_, seekTimeCorrected, ptsDiff, preceeding, true); | |
3062 | ||
2935 | 3063 | seekTimeCorrected += timing_stream_->stream_.GetAbsolutePTSOffset(); |
2936 | int64_t ptsDiff = timing_stream_->reader_->GetPTSDiff(); | |
3064 | ptsDiff = timing_stream_->reader_->GetPTSDiff(); | |
2937 | 3065 | if (ptsDiff < 0 && seekTimeCorrected + ptsDiff > seekTimeCorrected) |
2938 | 3066 | seekTimeCorrected = 0; |
2939 | 3067 | else |
2944 | 3072 | if ((*b)->enabled && (*b)->reader_ && |
2945 | 3073 | (streamId == 0 || (*b)->info_.GetPhysicalIndex() == streamId)) |
2946 | 3074 | { |
2947 | bool bReset; | |
3075 | bool bReset = true; | |
3076 | // all streams must be started before seeking to ensure cross chapter seeks | |
3077 | // will seek to the correct location/segment | |
3078 | if (!(*b)->reader_->IsStarted()) | |
3079 | StartReader((*b), seekTimeCorrected, ptsDiff, preceeding, false); | |
3080 | // advance adaptiveStream to the correct segment (triggers segment download) | |
2948 | 3081 | if ((*b)->stream_.seek_time( |
2949 | 3082 | static_cast<double>(seekTimeCorrected - (*b)->reader_->GetPTSDiff()) / |
2950 | 3083 | STREAM_TIME_BASE, |
2952 | 3085 | { |
2953 | 3086 | if (bReset) |
2954 | 3087 | (*b)->reader_->Reset(false); |
3088 | // advance reader to requested time | |
2955 | 3089 | if (!(*b)->reader_->TimeSeek(seekTimeCorrected, preceeding)) |
2956 | 3090 | (*b)->reader_->Reset(true); |
2957 | 3091 | else |
2962 | 3096 | "seekTime(%0.1lf) for Stream:%d continues at %0.1lf (PTS: %llu)", seekTime, |
2963 | 3097 | (*b)->info_.GetPhysicalIndex(), destTime, (*b)->reader_->PTS()); |
2964 | 3098 | if ((*b)->info_.GetStreamType() == INPUTSTREAM_TYPE_VIDEO) |
2965 | seekTime = destTime, seekTimeCorrected = (*b)->reader_->PTS(), preceeding = false; | |
3099 | { | |
3100 | seekTime = destTime; | |
3101 | seekTimeCorrected = (*b)->reader_->PTS(); | |
3102 | preceeding = false; | |
3103 | } | |
2966 | 3104 | ret = true; |
2967 | 3105 | } |
2968 | 3106 | } |
3294 | 3432 | { |
3295 | 3433 | kodi::Log(ADDON_LOG_DEBUG, "Open()"); |
3296 | 3434 | |
3297 | std::string lt, lk, ld, lsc, mfup, ov_audio, mru; | |
3298 | uint32_t mrt = 0; | |
3435 | std::string lt, lk, ld, lsc, mfup, ov_audio, drmPreInitData; | |
3299 | 3436 | std::map<std::string, std::string> manh, medh; |
3300 | std::string mpd_url = props.GetURL(); | |
3437 | std::string url = props.GetURL(); | |
3301 | 3438 | MANIFEST_TYPE manifest(MANIFEST_TYPE_UNKNOWN); |
3302 | 3439 | std::uint8_t config(0); |
3303 | 3440 | uint32_t max_user_bandwidth = 0; |
3364 | 3501 | kodi::Log(ADDON_LOG_DEBUG, "found inputstream.adaptive.original_audio_language: %s", |
3365 | 3502 | ov_audio.c_str()); |
3366 | 3503 | } |
3367 | else if (prop.first == "inputstream.adaptive.media_renewal_url") | |
3368 | { | |
3369 | mru = prop.second; | |
3370 | kodi::Log(ADDON_LOG_DEBUG, "found inputstream.adaptive.media_renewal_url: %s", mru.c_str()); | |
3371 | } | |
3372 | else if (prop.first == "inputstream.adaptive.media_renewal_time") | |
3373 | { | |
3374 | mrt = std::stoi(prop.second); | |
3375 | kodi::Log(ADDON_LOG_DEBUG, "found inputstream.adaptive.media_renewal_time: %d", mrt); | |
3376 | } | |
3377 | 3504 | else if (prop.first == "inputstream.adaptive.max_bandwidth") |
3378 | 3505 | { |
3379 | 3506 | max_user_bandwidth = std::stoi(prop.second); |
3381 | 3508 | max_user_bandwidth); |
3382 | 3509 | } |
3383 | 3510 | else if (prop.first == "inputstream.adaptive.play_timeshift_buffer") |
3511 | { | |
3384 | 3512 | m_playTimeshiftBuffer = stricmp(prop.second.c_str(), "true") == 0; |
3513 | } | |
3514 | else if (prop.first == "inputstream.adaptive.pre_init_data") | |
3515 | { | |
3516 | // This property allow to "pre-initialize" the DRM with a PSSH/KID, | |
3517 | // the property value must be as "{PSSH as base64}|{KID as base64}". | |
3518 | // The challenge/session ID data generated by the initialisation of the DRM | |
3519 | // will be attached to the manifest request callback | |
3520 | // as HTTP headers with the names of "challengeB64" and "sessionId". | |
3521 | kodi::Log(ADDON_LOG_DEBUG, "found inputstream.adaptive.pre_init_data: [not shown]"); | |
3522 | drmPreInitData = prop.second; | |
3523 | } | |
3385 | 3524 | } |
3386 | 3525 | |
3387 | 3526 | if (manifest == MANIFEST_TYPE_UNKNOWN) |
3390 | 3529 | return false; |
3391 | 3530 | } |
3392 | 3531 | |
3393 | std::string::size_type posHeader(mpd_url.find("|")); | |
3532 | std::string::size_type posHeader(url.find("|")); | |
3394 | 3533 | if (posHeader != std::string::npos) |
3395 | 3534 | { |
3396 | 3535 | manh.clear(); |
3397 | parseheader(manh, mpd_url.substr(posHeader + 1)); | |
3398 | mpd_url = mpd_url.substr(0, posHeader); | |
3536 | parseheader(manh, url.substr(posHeader + 1)); | |
3537 | url = url.substr(0, posHeader); | |
3399 | 3538 | } |
3400 | 3539 | |
3401 | 3540 | if (medh.empty()) |
3403 | 3542 | |
3404 | 3543 | kodihost->SetProfilePath(props.GetProfileFolder()); |
3405 | 3544 | |
3406 | m_session = std::shared_ptr<Session>(new Session(manifest, mpd_url.c_str(), mfup, lt, lk, ld, lsc, | |
3407 | mru, mrt, manh, medh, props.GetProfileFolder(), | |
3408 | m_width, m_height, ov_audio, | |
3409 | m_playTimeshiftBuffer, force_secure_decoder)); | |
3545 | m_session = std::shared_ptr<Session>(new Session( | |
3546 | manifest, url.c_str(), mfup, lt, lk, ld, lsc, manh, medh, props.GetProfileFolder(), m_width, | |
3547 | m_height, ov_audio, m_playTimeshiftBuffer, force_secure_decoder, drmPreInitData)); | |
3410 | 3548 | m_session->SetVideoResolution(m_width, m_height); |
3411 | 3549 | |
3412 | 3550 | if (!m_session->Initialize(config, max_user_bandwidth)) |
86 | 86 | const std::string& strLicKey, |
87 | 87 | const std::string& strLicData, |
88 | 88 | const std::string& strCert, |
89 | const std::string& strMediaRenewalUrl, | |
90 | const uint32_t intMediaRenewalTime, | |
91 | 89 | const std::map<std::string, std::string>& manifestHeaders, |
92 | 90 | const std::map<std::string, std::string>& mediaHeaders, |
93 | 91 | const std::string& profile_path, |
95 | 93 | uint16_t display_height, |
96 | 94 | const std::string& ov_audio, |
97 | 95 | bool play_timeshift_buffer, |
98 | bool force_secure_decoder); | |
96 | bool force_secure_decoder, | |
97 | const std::string& drm_preinit_data); | |
99 | 98 | virtual ~Session(); |
100 | 99 | bool Initialize(const std::uint8_t config, uint32_t max_user_bandwidth); |
100 | bool PreInitializeDRM(std::string& challengeB64, std::string& sessionId); | |
101 | 101 | bool InitializeDRM(); |
102 | 102 | bool InitializePeriod(); |
103 | 103 | SampleReader *GetNextSample(); |
143 | 143 | uint64_t GetElapsedTimeMs()const { return elapsed_time_ / 1000; }; |
144 | 144 | uint64_t PTSToElapsed(uint64_t pts); |
145 | 145 | uint64_t GetTimeshiftBufferStart(); |
146 | void StartReader( | |
147 | STREAM* stream, uint64_t seekTimeCorrected, int64_t ptsDiff, bool preceeding, bool timing); | |
146 | 148 | bool CheckChange(bool bSet = false){ bool ret = changed_; changed_ = bSet; return ret; }; |
147 | 149 | void SetVideoResolution(unsigned int w, unsigned int h) { width_ = w; height_ = h;}; |
148 | 150 | bool SeekTime(double seekTime, unsigned int streamId = 0, bool preceeding=true); |
174 | 176 | |
175 | 177 | private: |
176 | 178 | MANIFEST_TYPE manifest_type_; |
177 | std::string mpdFileURL_, mpdUpdateParam_; | |
179 | std::string manifestURL_, manifestUpdateParam_; | |
178 | 180 | std::string license_key_, license_type_, license_data_; |
181 | std::string drmPreInitData_; | |
179 | 182 | std::map<std::string, std::string> media_headers_; |
180 | 183 | AP4_DataBuffer server_certificate_; |
181 | 184 | std::string profile_path_; |
187 | 190 | { |
188 | 191 | SSD::SSD_DECRYPTER::SSD_CAPS decrypter_caps_; |
189 | 192 | AP4_CencSingleSampleDecrypter *single_sample_decryptor_; |
190 | const char *cdm_session_str_; | |
191 | bool shared_single_sample_decryptor_; | |
193 | const char* cdm_session_str_ = nullptr; | |
194 | bool shared_single_sample_decryptor_ = false; | |
192 | 195 | }; |
193 | 196 | std::vector<CDMSESSION> cdm_sessions_; |
194 | 197 | bool secure_video_session_; |
211 | 214 | bool ignore_display_; |
212 | 215 | bool play_timeshift_buffer_; |
213 | 216 | bool force_secure_decoder_; |
214 | }; | |
217 | bool allow_no_secure_decoder_; | |
218 | }; |
89 | 89 | static unsigned int ParseSegmentTemplate(const char** attr, |
90 | 90 | std::string baseURL, |
91 | 91 | std::string baseDomain, |
92 | DASHTree::SegmentTemplate& tpl) | |
92 | DASHTree::SegmentTemplate& tpl, | |
93 | unsigned int startNumber) | |
93 | 94 | { |
94 | unsigned int startNumber(1); | |
95 | 95 | for (; *attr;) |
96 | 96 | { |
97 | 97 | if (strcmp((const char*)*attr, "timescale") == 0) |
481 | 481 | { |
482 | 482 | dash->current_representation_->segtpl_ = dash->current_adaptationset_->segtpl_; |
483 | 483 | |
484 | dash->current_representation_->startNumber_ = | |
485 | ParseSegmentTemplate(attr, dash->current_representation_->url_, dash->base_domain_, | |
486 | dash->current_representation_->segtpl_); | |
484 | dash->current_representation_->startNumber_ = ParseSegmentTemplate( | |
485 | attr, dash->current_representation_->base_url_, dash->base_domain_, | |
486 | dash->current_representation_->segtpl_, dash->current_adaptationset_->startNumber_); | |
487 | 487 | ReplacePlaceHolders(dash->current_representation_->segtpl_.media, |
488 | 488 | dash->current_representation_->id, |
489 | 489 | dash->current_representation_->bandwidth_); |
603 | 603 | } |
604 | 604 | else if (strcmp(el, "SegmentTemplate") == 0) |
605 | 605 | { |
606 | dash->current_adaptationset_->startNumber_ = | |
607 | ParseSegmentTemplate(attr, dash->current_adaptationset_->base_url_, | |
608 | dash->base_domain_, dash->current_adaptationset_->segtpl_); | |
606 | dash->current_adaptationset_->startNumber_ = ParseSegmentTemplate( | |
607 | attr, dash->current_adaptationset_->base_url_, dash->base_domain_, | |
608 | dash->current_adaptationset_->segtpl_, dash->current_adaptationset_->startNumber_); | |
609 | 609 | dash->current_adaptationset_->timescale_ = |
610 | 610 | dash->current_adaptationset_->segtpl_.timescale; |
611 | 611 | dash->currentNode_ |= MPDNODE_SEGMENTTEMPLATE; |
657 | 657 | dash->current_representation_->timescale_ = dash->current_adaptationset_->timescale_; |
658 | 658 | dash->current_representation_->duration_ = dash->current_adaptationset_->duration_; |
659 | 659 | dash->current_representation_->startNumber_ = dash->current_adaptationset_->startNumber_; |
660 | dash->current_adaptationset_->representations_.push_back(dash->current_representation_); | |
661 | 660 | dash->current_representation_->width_ = dash->adpwidth_; |
662 | 661 | dash->current_representation_->height_ = dash->adpheight_; |
663 | 662 | dash->current_representation_->fpsRate_ = dash->adpfpsRate_; |
664 | 663 | dash->current_representation_->fpsScale_ = dash->adpfpsScale_; |
665 | 664 | dash->current_representation_->aspect_ = dash->adpaspect_; |
666 | 665 | dash->current_representation_->containerType_ = dash->adpContainerType_; |
666 | dash->current_representation_->base_url_ = dash->current_adaptationset_->base_url_; | |
667 | dash->current_adaptationset_->representations_.push_back(dash->current_representation_); | |
667 | 668 | |
668 | 669 | dash->current_pssh_.clear(); |
669 | 670 | dash->current_hasRepURN_ = false; |
956 | 957 | } |
957 | 958 | else if (strcmp(el, "SegmentTemplate") == 0) |
958 | 959 | { |
959 | dash->current_period_->startNumber_ = | |
960 | ParseSegmentTemplate(attr, dash->current_period_->base_url_, dash->base_domain_, | |
961 | dash->current_period_->segtpl_); | |
960 | dash->current_period_->startNumber_ = ParseSegmentTemplate( | |
961 | attr, dash->current_period_->base_url_, dash->base_domain_, | |
962 | dash->current_period_->segtpl_, dash->current_period_->startNumber_); | |
962 | 963 | dash->current_period_->timescale_ = dash->current_period_->segtpl_.timescale; |
963 | 964 | dash->currentNode_ |= MPDNODE_SEGMENTTEMPLATE; |
964 | 965 | } |
1051 | 1052 | { |
1052 | 1053 | uint64_t dur(0); |
1053 | 1054 | AddDuration((const char*)*(attr + 1), dur, 1500); |
1055 | // 0S minimumUpdatePeriod = refresh after every segment | |
1056 | // We already do that so lets set our minimum updateInterval to 30s | |
1057 | if (dur == 0) | |
1058 | dur = 30000; | |
1054 | 1059 | dash->SetUpdateInterval(static_cast<uint32_t>(dur)); |
1055 | 1060 | } |
1056 | 1061 | attr += 2; |
1111 | 1116 | url = dash->strXMLText_; |
1112 | 1117 | else |
1113 | 1118 | url = dash->current_adaptationset_->base_url_ + dash->strXMLText_; |
1119 | ||
1120 | dash->current_representation_->base_url_ = url; | |
1114 | 1121 | |
1115 | 1122 | if (dash->current_representation_->flags_ & AdaptiveTree::Representation::TEMPLATE) |
1116 | 1123 | { |
1550 | 1557 | +---------------------------------------------------------------------*/ |
1551 | 1558 | bool DASHTree::open(const std::string& url, const std::string& manifestUpdateParam) |
1552 | 1559 | { |
1553 | PreparePaths(url, manifestUpdateParam); | |
1560 | return open(url, manifestUpdateParam, std::map<std::string, std::string>()); | |
1561 | } | |
1562 | ||
1563 | bool DASHTree::open(const std::string& url, const std::string& manifestUpdateParam, std::map<std::string, std::string> additionalHeaders) | |
1564 | { | |
1554 | 1565 | parser_ = XML_ParserCreate(NULL); |
1555 | 1566 | if (!parser_) |
1556 | 1567 | return false; |
1561 | 1572 | currentNode_ = 0; |
1562 | 1573 | strXMLText_.clear(); |
1563 | 1574 | |
1564 | std::string download_url = BuildDownloadUrl(manifest_url_); | |
1565 | bool ret = download(download_url.c_str(), manifest_headers_) && !periods_.empty(); | |
1575 | PrepareManifestUrl(url, manifestUpdateParam); | |
1576 | additionalHeaders.insert(manifest_headers_.begin(), manifest_headers_.end()); | |
1577 | bool ret = download(manifest_url_.c_str(), additionalHeaders) && !periods_.empty(); | |
1566 | 1578 | |
1567 | 1579 | XML_ParserFree(parser_); |
1568 | 1580 | parser_ = 0; |
1597 | 1609 | { |
1598 | 1610 | if ((type == VIDEO || type == AUDIO)) |
1599 | 1611 | { |
1600 | lastUpdated_ = std::chrono::system_clock::now(); | |
1612 | lastUpdated_ = GetTimePointNowTime(); | |
1601 | 1613 | RefreshUpdateThread(); |
1602 | 1614 | RefreshLiveSegments(); |
1603 | 1615 | } |
1611 | 1623 | std::string replaced; |
1612 | 1624 | uint32_t numReplace = ~0U; |
1613 | 1625 | unsigned int nextStartNumber(~0); |
1614 | ||
1615 | if (~update_parameter_pos_) | |
1626 | std::string::size_type update_parameter_pos = update_parameter_.find("$START_NUMBER$"); | |
1627 | ||
1628 | if (~update_parameter_pos) | |
1616 | 1629 | { |
1617 | 1630 | for (std::vector<Period*>::const_iterator bp(periods_.begin()), ep(periods_.end()); bp != ep; |
1618 | 1631 | ++bp) |
1633 | 1646 | } |
1634 | 1647 | Log(LOGLEVEL_DEBUG, "DASH Update: numReplace: %u, nextStartNumber: %u", numReplace, |
1635 | 1648 | nextStartNumber); |
1649 | ||
1650 | if (update_parameter_[0] == '&' && manifest_url_.find("?") == std::string::npos) | |
1651 | update_parameter_[0] = '?'; | |
1652 | ||
1636 | 1653 | replaced = update_parameter_; |
1637 | 1654 | char buf[32]; |
1638 | 1655 | sprintf(buf, "%u", nextStartNumber); |
1639 | replaced.replace(update_parameter_pos_, 14, buf); | |
1656 | replaced.replace(update_parameter_pos, 14, buf); | |
1640 | 1657 | } |
1641 | 1658 | |
1642 | 1659 | DASHTree updateTree; |
1645 | 1662 | updateTree.supportedKeySystem_ = supportedKeySystem_; |
1646 | 1663 | //Location element should be used on updates |
1647 | 1664 | updateTree.location_ = location_; |
1648 | updateTree.effective_url_ = effective_url_; | |
1649 | updateTree.effective_domain_ = effective_domain_; | |
1650 | ||
1651 | if (!~update_parameter_pos_) | |
1665 | ||
1666 | if (!~update_parameter_pos) | |
1652 | 1667 | { |
1653 | 1668 | if (!etag_.empty()) |
1654 | 1669 | updateTree.manifest_headers_["If-None-Match"] = "\"" + etag_ + "\""; |
1663 | 1678 | location_ = updateTree.location_; |
1664 | 1679 | |
1665 | 1680 | //Youtube returns last smallest number in case the requested data is not available |
1666 | if (~update_parameter_pos_ && updateTree.firstStartNumber_ < nextStartNumber) | |
1681 | if (~update_parameter_pos && updateTree.firstStartNumber_ < nextStartNumber) | |
1667 | 1682 | return; |
1668 | 1683 | |
1669 | 1684 | std::vector<Period*>::const_iterator bpd(periods_.begin()), epd(periods_.end()); |
1697 | 1712 | ; |
1698 | 1713 | if (brd != erd && !(*br)->segments_.empty()) |
1699 | 1714 | { |
1700 | if (~update_parameter_pos_) // partitial update | |
1715 | if (~update_parameter_pos) // partitial update | |
1701 | 1716 | { |
1702 | 1717 | //Here we go -> Insert new segments |
1703 | 1718 | uint64_t ptsOffset = (*brd)->nextPts_ - (*br)->segments_[0]->startPTS_; |
1741 | 1756 | if ((*br)->flags_ & DASHTree::Representation::TIMELINE) |
1742 | 1757 | { |
1743 | 1758 | uint64_t search_pts = (*br)->segments_[0]->range_begin_; |
1759 | uint64_t misaligned = 0; | |
1744 | 1760 | for (const auto& s : (*brd)->segments_.data) |
1745 | 1761 | { |
1746 | if (s.range_begin_ >= search_pts) | |
1762 | if (misaligned) | |
1763 | { | |
1764 | uint64_t ptsDiff = s.range_begin_ - (&s - 1)->range_begin_; | |
1765 | // our misalignment is small ( < 2%), let's decrement the start number | |
1766 | if (misaligned < (ptsDiff * 2 / 100)) | |
1767 | --(*brd)->startNumber_; | |
1747 | 1768 | break; |
1748 | ++(*brd)->startNumber_; | |
1769 | } | |
1770 | if (s.range_begin_ == search_pts) | |
1771 | break; | |
1772 | else if (s.range_begin_ > search_pts) | |
1773 | misaligned = search_pts - (&s - 1)->range_begin_; | |
1774 | else | |
1775 | ++(*brd)->startNumber_; | |
1749 | 1776 | } |
1750 | 1777 | } |
1751 | 1778 | else if ((*br)->segments_[0]->startPTS_ == (*brd)->segments_[0]->startPTS_) |
29 | 29 | public: |
30 | 30 | DASHTree(); |
31 | 31 | virtual bool open(const std::string& url, const std::string& manifestUpdateParam) override; |
32 | virtual bool open(const std::string& url, const std::string& manifestUpdateParam, std::map<std::string, std::string> additionalHeaders) override; | |
32 | 33 | virtual bool write_data(void* buffer, size_t buffer_size, void* opaque) override; |
33 | 34 | virtual void RefreshSegments(Period* period, |
34 | 35 | AdaptationSet* adp, |
36 | 37 | StreamType type) override; |
37 | 38 | |
38 | 39 | virtual uint64_t GetNowTime() { return time(0); }; |
40 | virtual std::chrono::system_clock::time_point GetTimePointNowTime() | |
41 | { | |
42 | return std::chrono::system_clock::now(); | |
43 | }; | |
44 | virtual void SetLastUpdated(std::chrono::system_clock::time_point tm){}; | |
39 | 45 | void SetUpdateInterval(uint32_t interval) { updateInterval_ = interval; }; |
40 | 46 | uint64_t pts_helper_, timeline_time_; |
41 | 47 | uint32_t firstStartNumber_; |
106 | 106 | if (map["METHOD"] == "AES-128" && !map["URI"].empty()) |
107 | 107 | { |
108 | 108 | current_pssh_ = map["URI"]; |
109 | if (current_pssh_[0] != '/' && current_pssh_.find("://", 0) == std::string::npos) | |
109 | if (current_pssh_[0] != '/' && current_pssh_.find("://") == std::string::npos) | |
110 | 110 | current_pssh_ = baseUrl + current_pssh_; |
111 | 111 | |
112 | 112 | current_iv_ = m_decrypter->convertIV(map["IV"]); |
157 | 157 | |
158 | 158 | bool HLSTree::open(const std::string& url, const std::string& manifestUpdateParam) |
159 | 159 | { |
160 | PreparePaths(url, manifestUpdateParam); | |
161 | if (download(manifest_url_.c_str(), manifest_headers_, &manifest_stream)) | |
162 | return processManifest(manifest_stream, url); | |
160 | return open(url, manifestUpdateParam, std::map<std::string, std::string>()); | |
161 | } | |
162 | ||
163 | bool HLSTree::open(const std::string& url, const std::string& manifestUpdateParam, std::map<std::string, std::string> additionalHeaders) | |
164 | { | |
165 | PrepareManifestUrl(url, manifestUpdateParam); | |
166 | additionalHeaders.insert(manifest_headers_.begin(), manifest_headers_.end()); | |
167 | if (download(manifest_url_.c_str(), additionalHeaders, &manifest_stream)) | |
168 | return processManifest(manifest_stream); | |
163 | 169 | return false; |
164 | 170 | } |
165 | 171 | |
166 | bool HLSTree::processManifest(std::stringstream& stream, const std::string& url) | |
172 | bool HLSTree::processManifest(std::stringstream& stream) | |
167 | 173 | { |
168 | 174 | #if FILEDEBUG |
169 | 175 | FILE* f = fopen("inputstream_adaptive_master.m3u8", "w"); |
231 | 237 | std::map<std::string, std::string>::iterator res; |
232 | 238 | if ((res = map.find("URI")) != map.end()) |
233 | 239 | { |
234 | if (res->second[0] != '/' && res->second.find("://", 0) == std::string::npos) | |
235 | rep->source_url_ = base_url_ + res->second; | |
236 | else | |
237 | rep->source_url_ = res->second; | |
240 | rep->source_url_ = BuildDownloadUrl(res->second); | |
238 | 241 | |
239 | 242 | // default to WebVTT |
240 | 243 | if (type == SUBTITLE) |
305 | 308 | current_representation_->bandwidth_ = 0; |
306 | 309 | current_representation_->codecs_ = getVideoCodec(""); |
307 | 310 | current_representation_->containerType_ = CONTAINERTYPE_NOTYPE; |
308 | current_representation_->source_url_ = url; | |
311 | current_representation_->source_url_ = manifest_url_; | |
309 | 312 | current_adaptationset_->representations_.push_back(current_representation_); |
310 | 313 | |
311 | 314 | // We assume audio is included |
315 | 318 | } |
316 | 319 | else if (!line.empty() && line.compare(0, 1, "#") != 0 && current_representation_) |
317 | 320 | { |
318 | if (line[0] != '/' && line.find("://", 0) == std::string::npos) | |
319 | current_representation_->source_url_ = base_url_ + line; | |
320 | else | |
321 | current_representation_->source_url_ = line; | |
321 | current_representation_->source_url_ = BuildDownloadUrl(line); | |
322 | 322 | |
323 | 323 | //Ignore duplicate reps |
324 | 324 | for (auto const* rep : current_adaptationset_->representations_) |
393 | 393 | Segment newInitialization; |
394 | 394 | uint32_t segmentId(rep->getCurrentSegmentNumber()); |
395 | 395 | std::stringstream stream; |
396 | std::string download_url = BuildDownloadUrl(rep->source_url_); | |
397 | 396 | uint32_t adp_pos = |
398 | 397 | std::find(period->adaptationSets_.begin(), period->adaptationSets_.end(), adp) - |
399 | 398 | period->adaptationSets_.begin(); |
406 | 405 | |
407 | 406 | if (rep->flags_ & Representation::DOWNLOADED) |
408 | 407 | ; |
409 | else if (download(download_url.c_str(), manifest_headers_, &stream, false)) | |
408 | else if (download(rep->source_url_.c_str(), manifest_headers_, &stream, false)) | |
410 | 409 | { |
411 | 410 | #if FILEDEBUG |
412 | 411 | FILE* f = fopen("inputstream_adaptive_sub.m3u8", "w"); |
433 | 432 | segment.startPTS_ = ~0ULL; |
434 | 433 | segment.pssh_set_ = 0; |
435 | 434 | |
436 | std::string::size_type paramPos = rep->source_url_.find('?'); | |
435 | std::string::size_type paramPos = effective_url_.find('?'); | |
437 | 436 | base_url = |
438 | (paramPos == std::string::npos) ? rep->source_url_ : rep->source_url_.substr(0, paramPos); | |
437 | (paramPos == std::string::npos) ? effective_url_ : effective_url_.substr(0, paramPos); | |
439 | 438 | |
440 | 439 | paramPos = base_url.rfind('/'); |
441 | 440 | if (paramPos != std::string::npos) |
484 | 483 | rep->containerType_ = CONTAINERTYPE_ADTS; |
485 | 484 | else if (strncmp(line.c_str() + ext, ".mp4", 4) == 0) |
486 | 485 | rep->containerType_ = CONTAINERTYPE_MP4; |
487 | else if (strncmp(line.c_str() + ext, ".vtt", 4) == 0) | |
486 | else if (strncmp(line.c_str() + ext, ".vtt", 4) == 0 || | |
487 | strncmp(line.c_str() + ext, ".webvtt", 7) == 0) | |
488 | 488 | rep->containerType_ = CONTAINERTYPE_TEXT; |
489 | 489 | else |
490 | 490 | { |
502 | 502 | if (!byteRange || rep->url_.empty()) |
503 | 503 | { |
504 | 504 | std::string url; |
505 | if (line[0] != '/' && line.find("://", 0) == std::string::npos) | |
505 | if (line[0] != '/' && line.find("://") == std::string::npos) | |
506 | 506 | url = base_url + line; |
507 | 507 | else |
508 | 508 | url = line; |
617 | 617 | segment.range_end_ = 0; |
618 | 618 | segment.startPTS_ = ~0ULL; |
619 | 619 | segment.pssh_set_ = 0; |
620 | pts = 0; | |
621 | 620 | |
622 | 621 | if (currentEncryptionType == ENCRYPTIONTYPE_WIDEVINE) |
623 | 622 | { |
624 | rep->pssh_set_ = insert_psshset(NOTYPE, period, adp); | |
623 | rep->pssh_set_ = insert_psshset(adp->type_, period, adp); | |
625 | 624 | period->encryptionState_ |= ENCRYTIONSTATE_SUPPORTED; |
626 | 625 | } |
627 | 626 | |
645 | 644 | case ENCRYPTIONTYPE_WIDEVINE: |
646 | 645 | currentEncryptionType = ENCRYPTIONTYPE_WIDEVINE; |
647 | 646 | period->encryptionState_ |= ENCRYTIONSTATE_SUPPORTED; |
648 | rep->pssh_set_ = insert_psshset(NOTYPE, period, adp); | |
649 | if (period->psshSets_[rep->pssh_set_].use_count_ == 1) | |
650 | retVal = PREPARE_RESULT_DRMCHANGED; | |
647 | rep->pssh_set_ = insert_psshset(adp->type_, period, adp); | |
648 | retVal = period->psshSets_[rep->pssh_set_].use_count_ == 1 || | |
649 | retVal == PREPARE_RESULT_DRMCHANGED | |
650 | ? PREPARE_RESULT_DRMCHANGED | |
651 | : PREPARE_RESULT_DRMUNCHANGED; | |
651 | 652 | break; |
652 | 653 | default: |
653 | 654 | break; |
670 | 671 | delete[] newInitialization.url; |
671 | 672 | segmentInitialization = true; |
672 | 673 | std::string uri = map["URI"]; |
673 | if (uri[0] != '/' && uri.find("://", 0) == std::string::npos) | |
674 | if (uri[0] != '/' && uri.find("://") == std::string::npos) | |
674 | 675 | map_url = base_url + uri; |
675 | 676 | else |
676 | 677 | map_url = uri; |
44 | 44 | virtual ~HLSTree(); |
45 | 45 | |
46 | 46 | virtual bool open(const std::string& url, const std::string& manifestUpdateParam) override; |
47 | virtual bool open(const std::string& url, const std::string& manifestUpdateParam, std::map<std::string, std::string> additionalHeaders) override; | |
47 | 48 | virtual PREPARE_RESULT prepareRepresentation(Period* period, |
48 | 49 | AdaptationSet* adp, |
49 | 50 | Representation* rep, |
60 | 61 | AdaptationSet* adp, |
61 | 62 | Representation* rep, |
62 | 63 | StreamType type) override; |
63 | virtual bool processManifest(std::stringstream& stream, const std::string& url); | |
64 | virtual bool processManifest(std::stringstream& stream); | |
64 | 65 | |
65 | 66 | protected: |
66 | 67 | virtual void RefreshLiveSegments() override; |
348 | 348 | |
349 | 349 | bool SmoothTree::open(const std::string& url, const std::string& manifestUpdateParam) |
350 | 350 | { |
351 | PreparePaths(url, manifestUpdateParam); | |
352 | ||
351 | return open(url, manifestUpdateParam, std::map<std::string, std::string>()); | |
352 | } | |
353 | ||
354 | bool SmoothTree::open(const std::string& url, const std::string& manifestUpdateParam, std::map<std::string, std::string> additionalHeaders) | |
355 | { | |
353 | 356 | parser_ = XML_ParserCreate(NULL); |
354 | 357 | if (!parser_) |
355 | 358 | return false; |
359 | 362 | currentNode_ = 0; |
360 | 363 | strXMLText_.clear(); |
361 | 364 | |
362 | bool ret = download(manifest_url_.c_str(), manifest_headers_); | |
365 | PrepareManifestUrl(url, manifestUpdateParam); | |
366 | additionalHeaders.insert(manifest_headers_.begin(), manifest_headers_.end()); | |
367 | bool ret = download(manifest_url_.c_str(), additionalHeaders); | |
363 | 368 | |
364 | 369 | XML_ParserFree(parser_); |
365 | 370 | parser_ = 0; |
29 | 29 | public: |
30 | 30 | SmoothTree(); |
31 | 31 | virtual bool open(const std::string& url, const std::string& manifestUpdateParam) override; |
32 | virtual bool open(const std::string& url, const std::string& manifestUpdateParam, std::map<std::string, std::string> additionalHeaders) override; | |
32 | 33 | virtual bool write_data(void* buffer, size_t buffer_size, void* opaque) override; |
33 | 34 | |
34 | 35 | enum |
20 | 20 | |
21 | 21 | void OpenTestFile(std::string testfilename, std::string url, std::string manifestHeaders) |
22 | 22 | { |
23 | if (url.empty()) | |
24 | url = "http://foo.bar/" + testfilename; | |
25 | ||
23 | 26 | SetFileName(testHelper::testFile, testfilename); |
24 | 27 | if (!tree->open(url, manifestHeaders)) |
25 | 28 | { |
39 | 42 | testHelper::lastDownloadUrl.clear(); |
40 | 43 | DASHTreeTest::SetUp(); |
41 | 44 | videoStream = new TestAdaptiveStream(*tree, adaptive::AdaptiveTree::StreamType::VIDEO); |
45 | audioStream = new TestAdaptiveStream(*tree, adaptive::AdaptiveTree::StreamType::AUDIO); | |
42 | 46 | } |
43 | 47 | |
44 | 48 | void TearDown() override |
45 | 49 | { |
46 | 50 | delete videoStream; |
51 | delete audioStream; | |
47 | 52 | videoStream = nullptr; |
53 | audioStream = nullptr; | |
48 | 54 | DASHTreeTest::TearDown(); |
49 | 55 | } |
50 | 56 | |
67 | 73 | downloadedUrls.push_back(testHelper::lastDownloadUrl); |
68 | 74 | else |
69 | 75 | break; |
76 | // Decrement last updated time so live manifest will always refresh on each segment | |
77 | // in order to test manifest update changes | |
78 | tree->SetLastUpdated(std::chrono::system_clock::now() - std::chrono::seconds(2)); | |
79 | stream->SetLastUpdated(std::chrono::system_clock::now() - std::chrono::seconds(2)); | |
70 | 80 | } |
71 | 81 | |
72 | 82 | TestAdaptiveStream* videoStream; |
83 | TestAdaptiveStream* audioStream; | |
73 | 84 | std::vector<std::string> downloadedUrls; |
74 | 85 | std::map<std::string, std::string> mediaHeaders; |
75 | 86 | unsigned char buf[16]; |
90 | 101 | EXPECT_EQ(tree->base_domain_, "https://foo.bar"); |
91 | 102 | } |
92 | 103 | |
93 | TEST_F(DASHTreeTest, CalculateEffectiveUrlFromRedirect) | |
94 | { | |
95 | // like base_url_, effective_url_ should be path, not including filename | |
104 | TEST_F(DASHTreeTest, CalculateBaseUrlFromRedirect) | |
105 | { | |
96 | 106 | testHelper::effectiveUrl = "https://foo.bar/mpd/stream.mpd"; |
97 | OpenTestFile("mpd/segtpl.mpd", "https://bit.ly/abcd", ""); | |
98 | ||
99 | EXPECT_EQ(tree->effective_url_, "https://foo.bar/mpd/"); | |
107 | OpenTestFile("mpd/segtpl.mpd", "https://bit.ly/abcd.mpd", ""); | |
108 | EXPECT_EQ(tree->base_url_, "https://foo.bar/mpd/"); | |
109 | EXPECT_EQ(tree->manifest_url_, "https://foo.bar/mpd/stream.mpd"); | |
100 | 110 | } |
101 | 111 | |
102 | 112 | TEST_F(DASHTreeTest, CalculateBaseURLFromBaseURLTag) |
105 | 115 | EXPECT_EQ(tree->current_period_->base_url_, "https://foo.bar/mpd/"); |
106 | 116 | } |
107 | 117 | |
108 | TEST_F(DASHTreeTest, CalculateSegTplWithNoSlashs) | |
118 | TEST_F(DASHTreeTest, CalculateSegTplWithNoSlashes) | |
109 | 119 | { |
110 | 120 | // BaseURL inside period with no trailing slash, uses segtpl, media/init doesn't start with slash |
111 | 121 | OpenTestFile("mpd/segtpl_baseurl_noslashs.mpd", "https://foo.bar/initialpath/test.mpd", ""); |
300 | 310 | EXPECT_EQ(tree->update_parameter_, "full"); |
301 | 311 | } |
302 | 312 | |
303 | TEST_F(DASHTreeTest, updateParameterProvidedLiveSegmentTimeline) | |
304 | { | |
305 | tree->update_parameter_ = "ABC"; | |
306 | OpenTestFile("mpd/segtimeline_live_pd.mpd", "", ""); | |
307 | EXPECT_EQ(tree->update_parameter_, "ABC"); | |
313 | TEST_F(DASHTreeTest, updateParameterVODSegmentStartNumber) | |
314 | { | |
315 | OpenTestFile("mpd/segtimeline_vod.mpd", "https://foo.bar/dash.mpd?foo=bar&baz=qux&start_seq=$START_NUMBER$", ""); | |
316 | EXPECT_EQ(tree->update_parameter_, "&start_seq=$START_NUMBER$"); | |
317 | EXPECT_EQ(tree->manifest_url_, "https://foo.bar/dash.mpd?foo=bar&baz=qux"); | |
318 | } | |
319 | ||
320 | TEST_F(DASHTreeTest, updateParameterVODSegmentStartNumberRedirect) | |
321 | { | |
322 | testHelper::effectiveUrl = "https://foo.bar/mpd/stream.mpd?foo=bar&baz=qux&test=123"; | |
323 | OpenTestFile("mpd/segtimeline_vod.mpd", "https://foo.bar/dash.mpd?start_seq=$START_NUMBER$", ""); | |
324 | EXPECT_EQ(tree->update_parameter_, "?start_seq=$START_NUMBER$"); | |
325 | EXPECT_EQ(tree->manifest_url_, "https://foo.bar/mpd/stream.mpd?foo=bar&baz=qux&test=123"); | |
308 | 326 | } |
309 | 327 | |
310 | 328 | TEST_F(DASHTreeTest, updateParameterVODSegmentTimeline) |
403 | 421 | EXPECT_EQ(downloadedUrls[0], "https://foo.bar/tears-of-steel-multiple-subtitles-12-0.dash"); |
404 | 422 | EXPECT_EQ(downloadedUrls.back(), "https://foo.bar/tears-of-steel-multiple-subtitles-12-16000.dash"); |
405 | 423 | } |
424 | ||
425 | TEST_F(DASHTreeTest, CalculateMultipleSegTpl) | |
426 | { | |
427 | OpenTestFile("mpd/segtpl_multiple.mpd", "https://foo.bar/dash/multiple.mpd", ""); | |
428 | ||
429 | EXPECT_EQ(tree->base_url_, "https://foo.bar/dash/"); | |
430 | ||
431 | EXPECT_EQ(tree->periods_[0]->adaptationSets_[0]->representations_[0]->segtpl_.initialization, "https://foo.bar/dash/3c1055cb-a842-4449-b393-7f31693b4a8f_1_448x252init.mp4"); | |
432 | EXPECT_EQ(tree->periods_[0]->adaptationSets_[0]->representations_[0]->segtpl_.media, "https://foo.bar/dash/3c1055cb-a842-4449-b393-7f31693b4a8f_1_448x252_$Number%09d$.mp4"); | |
433 | EXPECT_EQ(tree->periods_[0]->adaptationSets_[0]->representations_[0]->segtpl_.timescale, 120000); | |
434 | EXPECT_EQ(tree->periods_[0]->adaptationSets_[0]->representations_[0]->segments_[0]->range_end_, 3); | |
435 | ||
436 | EXPECT_EQ(tree->periods_[0]->adaptationSets_[0]->representations_[1]->segtpl_.initialization, "https://foo.bar/dash/3c1055cb-a842-4449-b393-7f31693b4a8f_2_1920x1080init.mp4"); | |
437 | EXPECT_EQ(tree->periods_[0]->adaptationSets_[0]->representations_[1]->segtpl_.media, "https://foo.bar/dash/3c1055cb-a842-4449-b393-7f31693b4a8f_2_1920x1080_$Number%09d$.mp4"); | |
438 | EXPECT_EQ(tree->periods_[0]->adaptationSets_[0]->representations_[1]->segtpl_.timescale, 90000); | |
439 | EXPECT_EQ(tree->periods_[0]->adaptationSets_[0]->representations_[1]->segments_[0]->range_end_, 5); | |
440 | ||
441 | EXPECT_EQ(tree->periods_[0]->adaptationSets_[1]->representations_[0]->segtpl_.initialization, "https://foo.bar/dash/3c1055cb-a842-4449-b393-7f31693b4a8f_aac1init.mp4"); | |
442 | EXPECT_EQ(tree->periods_[0]->adaptationSets_[1]->representations_[0]->segtpl_.media, "https://foo.bar/dash/3c1055cb-a842-4449-b393-7f31693b4a8f_aac1_$Number%09d$.mp4"); | |
443 | EXPECT_EQ(tree->periods_[0]->adaptationSets_[1]->representations_[0]->segtpl_.timescale, 48000); | |
444 | EXPECT_EQ(tree->periods_[0]->adaptationSets_[1]->representations_[0]->segments_[0]->range_end_, 1); | |
445 | ||
446 | EXPECT_EQ(tree->periods_[0]->adaptationSets_[2]->representations_[0]->segtpl_.initialization, "https://foo.bar/dash/abc_aac1init.mp4"); | |
447 | EXPECT_EQ(tree->periods_[0]->adaptationSets_[2]->representations_[0]->segtpl_.media, "https://foo.bar/dash/abc2_$Number%09d$.mp4"); | |
448 | EXPECT_EQ(tree->periods_[0]->adaptationSets_[2]->representations_[0]->segtpl_.timescale, 68000); | |
449 | EXPECT_EQ(tree->periods_[0]->adaptationSets_[2]->representations_[0]->segments_[0]->range_end_, 5); | |
450 | } | |
451 | ||
452 | TEST_F(DASHTreeTest, CalculateRedirectSegTpl) | |
453 | { | |
454 | testHelper::effectiveUrl = "https://foo.bar/mpd/stream.mpd"; | |
455 | OpenTestFile("mpd/segtpl.mpd", "https://bit.ly/abcd.mpd", ""); | |
456 | ||
457 | EXPECT_EQ(tree->periods_[0]->adaptationSets_[0]->representations_[0]->segtpl_.initialization, "https://foo.bar/mpd/V300/init.mp4"); | |
458 | EXPECT_EQ(tree->periods_[0]->adaptationSets_[0]->representations_[0]->segtpl_.media, "https://foo.bar/mpd/V300/$Number$.m4s"); | |
459 | ||
460 | EXPECT_EQ(tree->periods_[0]->adaptationSets_[1]->representations_[0]->segtpl_.initialization, "https://foo.bar/A48/init.mp4"); | |
461 | EXPECT_EQ(tree->periods_[0]->adaptationSets_[1]->representations_[0]->segtpl_.media, "https://foo.bar/A48/$Number$.m4s"); | |
462 | } | |
463 | ||
464 | TEST_F(DASHTreeTest, CalculateReprensentationBaseURL) | |
465 | { | |
466 | OpenTestFile("mpd/rep_base_url.mpd", "https://bit.ly/mpd/abcd.mpd", ""); | |
467 | ||
468 | EXPECT_EQ(tree->periods_[0]->adaptationSets_[0]->representations_[0]->segtpl_.initialization, "https://foo.bar/mpd/slices/A_init.mp4"); | |
469 | EXPECT_EQ(tree->periods_[0]->adaptationSets_[0]->representations_[0]->segtpl_.media, "https://foo.bar/mpd/slices/A$Number%08d$.m4f"); | |
470 | EXPECT_EQ(tree->periods_[0]->adaptationSets_[0]->representations_[1]->segtpl_.initialization, "https://bit.ly/mpd/B_init.mp4"); | |
471 | EXPECT_EQ(tree->periods_[0]->adaptationSets_[0]->representations_[1]->segtpl_.media, "https://bit.ly/mpd/B$Number%08d$.m4f"); | |
472 | ||
473 | EXPECT_EQ(tree->periods_[0]->adaptationSets_[1]->representations_[0]->segtpl_.initialization, "https://foo.bar/mpd/slices/A_init.mp4"); | |
474 | EXPECT_EQ(tree->periods_[0]->adaptationSets_[1]->representations_[0]->segtpl_.media, "https://foo.bar/mpd/slices/A$Number%08d$.m4f"); | |
475 | EXPECT_EQ(tree->periods_[0]->adaptationSets_[1]->representations_[1]->segtpl_.initialization, "https://foo.bar/mpd/slices2/B_init.mp4"); | |
476 | EXPECT_EQ(tree->periods_[0]->adaptationSets_[1]->representations_[1]->segtpl_.media, "https://foo.bar/mpd/slices2/B$Number%08d$.m4f"); | |
477 | EXPECT_EQ(tree->periods_[0]->adaptationSets_[1]->representations_[2]->segtpl_.initialization, "https://foo.bar/mpd/slices2/C_init.mp4"); | |
478 | EXPECT_EQ(tree->periods_[0]->adaptationSets_[1]->representations_[2]->segtpl_.media, "https://foo.bar/mpd/slices2/C$Number%08d$.m4f"); | |
479 | } | |
480 | ||
481 | TEST_F(DASHTreeAdaptiveStreamTest, MisalignedSegmentTimeline) | |
482 | { | |
483 | OpenTestFile("mpd/bad_segtimeline_1.mpd", "https://foo.bar/placeholders.mpd", ""); | |
484 | audioStream->prepare_stream(tree->current_period_->adaptationSets_[1], 0, 0, 0, 0, 0, 0, 0, | |
485 | mediaHeaders); | |
486 | audioStream->start_stream(~0, 0, 0, false); | |
487 | ||
488 | ReadSegments(audioStream, 16, 1); | |
489 | ||
490 | SetFileName(testHelper::testFile, "mpd/bad_segtimeline_2.mpd"); | |
491 | ReadSegments(audioStream, 16, 1); | |
492 | EXPECT_EQ(tree->current_period_->adaptationSets_[1]->representations_[0]->startNumber_, 3); | |
493 | ||
494 | SetFileName(testHelper::testFile, "mpd/bad_segtimeline_3.mpd"); | |
495 | ReadSegments(audioStream, 16, 1); | |
496 | EXPECT_EQ(tree->current_period_->adaptationSets_[1]->representations_[0]->startNumber_, 4); | |
497 | ||
498 | SetFileName(testHelper::testFile, "mpd/bad_segtimeline_4.mpd"); | |
499 | ReadSegments(audioStream, 16, 1); | |
500 | EXPECT_EQ(tree->current_period_->adaptationSets_[1]->representations_[0]->startNumber_, 5); | |
501 | } |
19 | 19 | |
20 | 20 | void OpenTestFileMaster(std::string testfilename, std::string url, std::string manifestHeaders) |
21 | 21 | { |
22 | if (url.empty()) | |
23 | url = "http://foo.bar/" + testfilename; | |
24 | ||
22 | 25 | SetFileName(testHelper::testFile, testfilename); |
23 | 26 | if (!tree->open(url, manifestHeaders)) |
24 | 27 | { |
42 | 45 | }; |
43 | 46 | |
44 | 47 | |
45 | ||
46 | 48 | TEST_F(HLSTreeTest, CalculateSourceUrl) |
47 | 49 | { |
48 | 50 | OpenTestFileMaster("hls/1a2v_master.m3u8", "https://foo.bar/master.m3u8?param=foo", ""); |
52 | 54 | |
53 | 55 | std::string rep_url = tree->BuildDownloadUrl( |
54 | 56 | tree->current_period_->adaptationSets_[0]->representations_[0]->source_url_); |
55 | EXPECT_EQ(tree->base_url_, "https://foo.bar/"); | |
56 | 57 | EXPECT_EQ(rep_url, "https://foo.bar/stream_2/out.m3u8"); |
57 | 58 | } |
58 | 59 | |
59 | ||
60 | 60 | TEST_F(HLSTreeTest, CalculateSourceUrlFromRedirectedMasterRelativeUri) |
61 | 61 | { |
62 | 62 | testHelper::effectiveUrl = "https://foo.bar/master.m3u8"; |
63 | 63 | |
64 | 64 | OpenTestFileMaster("hls/1a2v_master.m3u8", "https://baz.qux/master.m3u8", ""); |
65 | ||
65 | ||
66 | 66 | std::string rep_url = tree->BuildDownloadUrl( |
67 | 67 | tree->current_period_->adaptationSets_[0]->representations_[0]->source_url_); |
68 | 68 | |
69 | 69 | EXPECT_EQ(rep_url, "https://foo.bar/stream_2/out.m3u8"); |
70 | ||
70 | ||
71 | 71 | adaptive::HLSTree::PREPARE_RESULT res = OpenTestFileVariant( |
72 | 72 | "hls/fmp4_noenc_v_stream_2.m3u8", "https://foo.bar/stream_2/out.m3u8", tree->current_period_, |
73 | 73 | tree->current_adaptationset_, tree->current_representation_); |
74 | ||
75 | rep_url = tree->BuildDownloadUrl( | |
76 | tree->current_period_->adaptationSets_[0]->representations_[0]->source_url_); | |
77 | // base_url_ should never change after opening stream regardless of redirects | |
78 | EXPECT_EQ(tree->base_url_, "https://baz.qux/"); | |
74 | ||
75 | rep_url = tree->BuildDownloadUrl( | |
76 | tree->current_period_->adaptationSets_[0]->representations_[0]->source_url_); | |
79 | 77 | EXPECT_EQ(res, adaptive::HLSTree::PREPARE_RESULT_OK); |
80 | 78 | EXPECT_EQ(rep_url, "https://foo.bar/stream_2/out.m3u8"); |
81 | 79 | } |
82 | 80 | |
83 | ||
84 | 81 | TEST_F(HLSTreeTest, CalculateSourceUrlFromRedirectedVariantAbsoluteUri) |
85 | 82 | { |
86 | 83 | OpenTestFileMaster("hls/redirect_absolute_1v_master.m3u8", "https://baz.qux/master.m3u8", ""); |
87 | 84 | |
88 | 85 | std::string rep_url = tree->BuildDownloadUrl( |
89 | 86 | tree->current_period_->adaptationSets_[0]->representations_[0]->source_url_); |
90 | ||
87 | ||
91 | 88 | EXPECT_EQ(rep_url, "https://bit.ly/abcd"); |
92 | 89 | |
93 | 90 | testHelper::effectiveUrl = "https://foo.bar/stream_2/out.m3u8"; |
94 | ||
91 | ||
95 | 92 | adaptive::HLSTree::PREPARE_RESULT res = OpenTestFileVariant( |
96 | 93 | "hls/fmp4_noenc_v_stream_2.m3u8", "https://bit.ly/abcd", |
97 | 94 | tree->current_period_, tree->current_adaptationset_, tree->current_representation_); |
98 | 95 | |
99 | 96 | rep_url = tree->BuildDownloadUrl( |
100 | 97 | tree->current_period_->adaptationSets_[0]->representations_[0]->source_url_); |
101 | EXPECT_EQ(tree->base_url_, "https://baz.qux/"); | |
102 | EXPECT_EQ(res, adaptive::HLSTree::PREPARE_RESULT_OK); | |
103 | EXPECT_EQ(rep_url, "https://bit.ly/abcd"); | |
104 | } | |
105 | ||
98 | ||
99 | EXPECT_EQ(res, adaptive::HLSTree::PREPARE_RESULT_OK); | |
100 | EXPECT_EQ(rep_url, "https://bit.ly/abcd"); | |
101 | } | |
106 | 102 | |
107 | 103 | TEST_F(HLSTreeTest, CalculateSourceUrlFromRedirectedMasterAndRedirectedVariantAbsoluteUri) |
108 | 104 | { |
112 | 108 | |
113 | 109 | std::string rep_url = tree->BuildDownloadUrl( |
114 | 110 | tree->current_period_->adaptationSets_[0]->representations_[0]->source_url_); |
115 | ||
111 | ||
116 | 112 | EXPECT_EQ(rep_url, "https://bit.ly/abcd"); |
117 | 113 | |
118 | 114 | testHelper::effectiveUrl = "https://foo.bar/stream_2/out.m3u8"; |
123 | 119 | |
124 | 120 | rep_url = tree->BuildDownloadUrl( |
125 | 121 | tree->current_period_->adaptationSets_[0]->representations_[0]->source_url_); |
126 | EXPECT_EQ(tree->base_url_, "https://link.to/"); | |
127 | EXPECT_EQ(res, adaptive::HLSTree::PREPARE_RESULT_OK); | |
128 | EXPECT_EQ(rep_url, "https://bit.ly/abcd"); | |
129 | } | |
130 | ||
122 | EXPECT_EQ(res, adaptive::HLSTree::PREPARE_RESULT_OK); | |
123 | EXPECT_EQ(rep_url, "https://bit.ly/abcd"); | |
124 | } | |
131 | 125 | |
132 | 126 | TEST_F(HLSTreeTest, |
133 | 127 | CalculateSourceUrlFromRedirectedMasterAndRedirectedVariantAbsoluteUriSameDomains) |
134 | 128 | { |
135 | GTEST_SKIP(); | |
136 | 129 | testHelper::effectiveUrl = "https://baz.qux/master.m3u8"; |
137 | 130 | |
138 | 131 | OpenTestFileMaster("hls/redirect_absolute_1v_master.m3u8", "https://bit.ly/1234", ""); |
139 | 132 | |
140 | 133 | std::string rep_url = tree->BuildDownloadUrl( |
141 | 134 | tree->current_period_->adaptationSets_[0]->representations_[0]->source_url_); |
142 | ||
135 | ||
143 | 136 | EXPECT_EQ(rep_url, "https://bit.ly/abcd"); |
144 | 137 | |
145 | 138 | testHelper::effectiveUrl = "https://foo.bar/stream_2/out.m3u8"; |
150 | 143 | |
151 | 144 | rep_url = tree->BuildDownloadUrl( |
152 | 145 | tree->current_period_->adaptationSets_[0]->representations_[0]->source_url_); |
153 | EXPECT_EQ(tree->base_url_, "https://bit.ly/"); | |
154 | EXPECT_EQ(res, adaptive::HLSTree::PREPARE_RESULT_OK); | |
155 | EXPECT_EQ(rep_url, "https://bit.ly/abcd"); | |
156 | } | |
157 | ||
158 | ||
146 | EXPECT_EQ(res, adaptive::HLSTree::PREPARE_RESULT_OK); | |
147 | EXPECT_EQ(rep_url, "https://bit.ly/abcd"); | |
148 | } | |
159 | 149 | |
160 | 150 | TEST_F(HLSTreeTest, OpenVariant) |
161 | 151 | { |
168 | 158 | EXPECT_EQ(res, adaptive::HLSTree::PREPARE_RESULT_OK); |
169 | 159 | EXPECT_EQ(tree->base_url_, "https://foo.bar/"); |
170 | 160 | } |
171 | ||
172 | 161 | |
173 | 162 | TEST_F(HLSTreeTest, ParseKeyUriStartingWithSlash) |
174 | 163 | { |
175 | 164 | OpenTestFileMaster("hls/1v_master.m3u8", |
176 | 165 | "https://foo.bar/hls/video/stream_name/master.m3u8", ""); |
177 | ||
166 | ||
178 | 167 | adaptive::HLSTree::PREPARE_RESULT res = OpenTestFileVariant( |
179 | 168 | "hls/ts_aes_keyuriwithslash_stream_0.m3u8", |
180 | 169 | "https://foo.bar/hls/video/stream_name/chunklist.m3u8", tree->current_period_, |
182 | 171 | |
183 | 172 | std::string pssh_url = tree->BuildDownloadUrl(tree->current_period_->psshSets_[1].pssh_); |
184 | 173 | EXPECT_EQ(res, adaptive::HLSTree::PREPARE_RESULT_OK); |
185 | EXPECT_EQ(tree->base_url_, "https://foo.bar/hls/video/stream_name/"); | |
186 | 174 | EXPECT_EQ(pssh_url, |
187 | 175 | "https://foo.bar/hls/key/key.php?stream=stream_name"); |
188 | 176 | } |
201 | 189 | |
202 | 190 | std::string pssh_url = tree->BuildDownloadUrl(tree->current_period_->psshSets_[1].pssh_); |
203 | 191 | EXPECT_EQ(res, adaptive::HLSTree::PREPARE_RESULT_OK); |
204 | EXPECT_EQ(tree->base_url_, "https://baz.qux/hls/video/stream_name/"); | |
205 | 192 | EXPECT_EQ(pssh_url, |
206 | 193 | "https://foo.bar/hls/key/key.php?stream=stream_name"); |
207 | 194 | } |
208 | ||
209 | 195 | |
210 | 196 | TEST_F(HLSTreeTest, ParseKeyUriAbsolute) |
211 | 197 | { |
212 | 198 | OpenTestFileMaster("hls/1v_master.m3u8", |
213 | 199 | "https://foo.bar/hls/video/stream_name/master.m3u8", ""); |
214 | ||
200 | ||
215 | 201 | adaptive::HLSTree::PREPARE_RESULT res = OpenTestFileVariant( |
216 | 202 | "hls/ts_aes_keyuriabsolute_stream_0.m3u8", |
217 | 203 | "https://foo.bar/hls/video/stream_name/chunklist.m3u8", tree->current_period_, |
218 | 204 | tree->current_adaptationset_, tree->current_representation_); |
219 | 205 | |
220 | 206 | EXPECT_EQ(res, adaptive::HLSTree::PREPARE_RESULT_OK); |
221 | EXPECT_EQ(tree->base_url_, "https://foo.bar/hls/video/stream_name/"); | |
222 | 207 | EXPECT_EQ(tree->current_period_->psshSets_[1].pssh_, |
223 | 208 | "https://foo.bar/hls/key/key.php?stream=stream_name"); |
224 | 209 | } |
225 | 210 | |
226 | ||
227 | 211 | TEST_F(HLSTreeTest, ParseKeyUriRelative) |
228 | 212 | { |
229 | 213 | OpenTestFileMaster("hls/1v_master.m3u8", "https://foo.bar/hls/video/stream_name/master.m3u8", |
230 | 214 | ""); |
231 | ||
215 | ||
232 | 216 | adaptive::HLSTree::PREPARE_RESULT res = OpenTestFileVariant( |
233 | 217 | "hls/ts_aes_keyurirelative_stream_0.m3u8", |
234 | 218 | "https://foo.bar/hls/video/stream_name/chunklist.m3u8", tree->current_period_, |
236 | 220 | |
237 | 221 | std::string pssh_url = tree->BuildDownloadUrl(tree->current_period_->psshSets_[1].pssh_); |
238 | 222 | EXPECT_EQ(res, adaptive::HLSTree::PREPARE_RESULT_OK); |
239 | EXPECT_EQ(tree->base_url_, "https://foo.bar/hls/video/stream_name/"); | |
240 | 223 | EXPECT_EQ(pssh_url, |
241 | 224 | "https://foo.bar/hls/video/stream_name/../../key/key.php?stream=stream_name"); |
242 | 225 | } |
243 | ||
244 | 226 | |
245 | 227 | TEST_F(HLSTreeTest, ParseKeyUriRelativeFromRedirect) |
246 | 228 | { |
254 | 236 | ->source_url_); // https://baz.qux/hls/video/stream_name/ts_aes_uriwithslash_chunklist.m3u8 |
255 | 237 | adaptive::HLSTree::PREPARE_RESULT res = OpenTestFileVariant( |
256 | 238 | "hls/ts_aes_keyurirelative_stream_0.m3u8", |
257 | var_download_url, | |
239 | var_download_url, | |
258 | 240 | tree->current_period_, |
259 | 241 | tree->current_adaptationset_, |
260 | 242 | tree->current_representation_); |
261 | 243 | |
262 | 244 | std::string pssh_url = tree->BuildDownloadUrl(tree->current_period_->psshSets_[1].pssh_); |
263 | 245 | EXPECT_EQ(res, adaptive::HLSTree::PREPARE_RESULT_OK); |
264 | EXPECT_EQ(tree->base_url_, "https://baz.qux/hls/video/stream_name/"); | |
265 | 246 | EXPECT_EQ(pssh_url, |
266 | 247 | "https://foo.bar/hls/video/stream_name/../../key/key.php?stream=stream_name"); |
267 | 248 | } |
249 | ||
250 | TEST_F(HLSTreeTest, PtsSetInMultiPeriod) | |
251 | { | |
252 | OpenTestFileMaster("hls/1a2v_master.m3u8", "https://foo.bar/master.m3u8", ""); | |
253 | std::string var_download_url = tree->BuildDownloadUrl( | |
254 | tree->current_period_->adaptationSets_[0]->representations_[1]->source_url_); | |
255 | ||
256 | adaptive::HLSTree::PREPARE_RESULT res = | |
257 | OpenTestFileVariant("hls/disco_fmp4_noenc_v_stream_1.m3u8", var_download_url, | |
258 | tree->periods_[0], tree->periods_[0]->adaptationSets_[0], | |
259 | tree->periods_[0]->adaptationSets_[0]->representations_[1]); | |
260 | ||
261 | uint64_t pts = | |
262 | tree->periods_[1]->adaptationSets_[0]->representations_[1]->segments_.data[0].startPTS_; | |
263 | EXPECT_EQ(res, adaptive::HLSTree::PREPARE_RESULT_OK); | |
264 | EXPECT_EQ(pts, 21000000); | |
265 | ||
266 | var_download_url = tree->BuildDownloadUrl( | |
267 | tree->current_period_->adaptationSets_[1]->representations_[0]->source_url_); | |
268 | ||
269 | res = OpenTestFileVariant("hls/disco_fmp4_noenc_a_stream_0.m3u8", var_download_url, | |
270 | tree->periods_[1], tree->periods_[1]->adaptationSets_[1], | |
271 | tree->periods_[1]->adaptationSets_[1]->representations_[0]); | |
272 | ||
273 | pts = tree->periods_[1]->adaptationSets_[1]->representations_[0]->segments_.data[0].startPTS_; | |
274 | EXPECT_EQ(res, adaptive::HLSTree::PREPARE_RESULT_OK); | |
275 | EXPECT_EQ(pts, 20993000); | |
276 | } |
22 | 22 | bool adaptive::AdaptiveTree::download(const char* url, |
23 | 23 | const std::map<std::string, std::string>& manifestHeaders, |
24 | 24 | void* opaque, |
25 | bool scanEffectiveURL) | |
25 | bool isManifest) | |
26 | 26 | { |
27 | 27 | FILE* f = fopen(testHelper::testFile.c_str(), "rb"); |
28 | 28 | if (!f) |
29 | 29 | return false; |
30 | 30 | |
31 | if (scanEffectiveURL && !testHelper::effectiveUrl.empty()) | |
32 | SetEffectiveURL(testHelper::effectiveUrl); | |
31 | if (!testHelper::effectiveUrl.empty()) | |
32 | effective_url_ = testHelper::effectiveUrl; | |
33 | else | |
34 | effective_url_ = url; | |
35 | ||
36 | if (isManifest && !PreparePaths(effective_url_)) | |
37 | { | |
38 | fclose(f); | |
39 | return false; | |
40 | } | |
33 | 41 | |
34 | 42 | // read the file |
35 | 43 | static const unsigned int CHUNKSIZE = 16384; |
20 | 20 | public: |
21 | 21 | TestAdaptiveStream(adaptive::AdaptiveTree& tree, adaptive::AdaptiveTree::StreamType type) |
22 | 22 | : adaptive::AdaptiveStream(tree, type){}; |
23 | std::chrono::system_clock::time_point mock_time_stream = std::chrono::system_clock::now(); | |
24 | void SetLastUpdated(std::chrono::system_clock::time_point tm) override { lastUpdated_ = tm; }; | |
23 | 25 | |
24 | 26 | protected: |
25 | 27 | virtual bool download(const char* url, |
50 | 52 | { |
51 | 53 | public: |
52 | 54 | uint64_t mock_time = 10000000L; |
55 | std::chrono::system_clock::time_point mock_time_chrono = std::chrono::system_clock::now(); | |
53 | 56 | DASHTestTree(); |
54 | 57 | uint64_t GetNowTime() override { return mock_time; } |
58 | std::chrono::system_clock::time_point GetNowTimeChrono() { return mock_time_chrono; }; | |
59 | void SetLastUpdated(std::chrono::system_clock::time_point tm) override { lastUpdated_ = tm; }; | |
55 | 60 | }; |
0 | #EXTM3U | |
1 | #EXT-X-VERSION:6 | |
2 | ## Generated with https://github.com/google/shaka-packager version v2.4.3-dd9870075f-release | |
3 | #EXT-X-TARGETDURATION:7 | |
4 | #EXT-X-PLAYLIST-TYPE:VOD | |
5 | #EXT-X-MAP:URI="init.mp4" | |
6 | #EXTINF:6.016, | |
7 | 1.m4s | |
8 | #EXTINF:5.995, | |
9 | 2.m4s | |
10 | #EXTINF:5.995, | |
11 | 3.m4s | |
12 | #EXTINF:2.987, | |
13 | 4.m4s | |
14 | #EXT-X-DISCONTINUITY | |
15 | #EXTINF:6.016, | |
16 | 5.m4s | |
17 | #EXTINF:5.995, | |
18 | 6.m4s | |
19 | #EXTINF:6.016, | |
20 | 7.m4s | |
21 | #EXTINF:5.995, | |
22 | 8.m4s | |
23 | #EXTINF:5.995, | |
24 | 9.m4s | |
25 | #EXTINF:5.995, | |
26 | 10.m4s | |
27 | #EXTINF:6.016, | |
28 | 11.m4s | |
29 | #EXTINF:5.995, | |
30 | 12.m4s | |
31 | #EXTINF:5.995, | |
32 | 13.m4s | |
33 | #EXTINF:5.995, | |
34 | 14.m4s | |
35 | #EXTINF:6.016, | |
36 | 15.m4s | |
37 | #EXTINF:5.995, | |
38 | 16.m4s | |
39 | #EXTINF:5.995, | |
40 | 17.m4s | |
41 | #EXTINF:5.995, | |
42 | 18.m4s | |
43 | #EXTINF:6.016, | |
44 | 19.m4s | |
45 | #EXTINF:5.995, | |
46 | 20.m4s | |
47 | #EXTINF:5.995, | |
48 | 21.m4s | |
49 | #EXTINF:5.995, | |
50 | 22.m4s | |
51 | #EXTINF:6.016, | |
52 | 23.m4s | |
53 | #EXTINF:5.995, | |
54 | 24.m4s | |
55 | #EXTINF:5.995, | |
56 | 25.m4s | |
57 | #EXTINF:5.995, | |
58 | 26.m4s | |
59 | #EXTINF:6.016, | |
60 | 27.m4s | |
61 | #EXTINF:5.995, | |
62 | 28.m4s | |
63 | #EXTINF:5.845, | |
64 | 29.m4s |
0 | #EXTM3U | |
1 | #EXT-X-VERSION:6 | |
2 | ## Generated with https://github.com/google/shaka-packager version v2.4.3-dd9870075f-release | |
3 | #EXT-X-TARGETDURATION:7 | |
4 | #EXT-X-PLAYLIST-TYPE:VOD | |
5 | #EXT-X-MAP:URI="init.mp4" | |
6 | #EXTINF:6.000, | |
7 | 1.m4s | |
8 | #EXTINF:6.000, | |
9 | 2.m4s | |
10 | #EXTINF:6.000, | |
11 | 3.m4s | |
12 | #EXTINF:3.000, | |
13 | 4.m4s | |
14 | #EXT-X-DISCONTINUITY | |
15 | #EXTINF:6.000, | |
16 | 5.m4s | |
17 | #EXTINF:6.000, | |
18 | 6.m4s | |
19 | #EXTINF:6.000, | |
20 | 7.m4s | |
21 | #EXTINF:6.000, | |
22 | 8.m4s | |
23 | #EXTINF:6.000, | |
24 | 9.m4s | |
25 | #EXTINF:6.000, | |
26 | 10.m4s | |
27 | #EXTINF:6.000, | |
28 | 11.m4s | |
29 | #EXTINF:6.000, | |
30 | 12.m4s | |
31 | #EXTINF:6.000, | |
32 | 13.m4s | |
33 | #EXTINF:6.000, | |
34 | 14.m4s | |
35 | #EXTINF:6.000, | |
36 | 15.m4s | |
37 | #EXTINF:6.000, | |
38 | 16.m4s | |
39 | #EXTINF:6.000, | |
40 | 17.m4s | |
41 | #EXTINF:6.000, | |
42 | 18.m4s | |
43 | #EXTINF:6.000, | |
44 | 19.m4s | |
45 | #EXTINF:6.000, | |
46 | 20.m4s | |
47 | #EXTINF:6.000, | |
48 | 21.m4s | |
49 | #EXTINF:6.000, | |
50 | 22.m4s | |
51 | #EXTINF:6.000, | |
52 | 23.m4s | |
53 | #EXTINF:6.000, | |
54 | 24.m4s | |
55 | #EXTINF:6.000, | |
56 | 25.m4s | |
57 | #EXTINF:6.000, | |
58 | 26.m4s | |
59 | #EXTINF:6.000, | |
60 | 27.m4s | |
61 | #EXTINF:6.000, | |
62 | 28.m4s | |
63 | #EXTINF:5.840, | |
64 | 29.m4s |
0 | #EXTM3U | |
1 | #EXT-X-VERSION:6 | |
2 | ## Generated with https://github.com/google/shaka-packager version v2.4.3-dd9870075f-release | |
3 | #EXT-X-TARGETDURATION:7 | |
4 | #EXT-X-PLAYLIST-TYPE:VOD | |
5 | #EXT-X-MAP:URI="init.mp4" | |
6 | #EXTINF:6.000, | |
7 | 1.m4s | |
8 | #EXTINF:6.000, | |
9 | 2.m4s | |
10 | #EXTINF:6.000, | |
11 | 3.m4s | |
12 | #EXTINF:3.000, | |
13 | 4.m4s | |
14 | #EXT-X-DISCONTINUITY | |
15 | #EXTINF:6.000, | |
16 | 5.m4s | |
17 | #EXTINF:6.000, | |
18 | 6.m4s | |
19 | #EXTINF:6.000, | |
20 | 7.m4s | |
21 | #EXTINF:6.000, | |
22 | 8.m4s | |
23 | #EXTINF:6.000, | |
24 | 9.m4s | |
25 | #EXTINF:6.000, | |
26 | 10.m4s | |
27 | #EXTINF:6.000, | |
28 | 11.m4s | |
29 | #EXTINF:6.000, | |
30 | 12.m4s | |
31 | #EXTINF:6.000, | |
32 | 13.m4s | |
33 | #EXTINF:6.000, | |
34 | 14.m4s | |
35 | #EXTINF:6.000, | |
36 | 15.m4s | |
37 | #EXTINF:6.000, | |
38 | 16.m4s | |
39 | #EXTINF:6.000, | |
40 | 17.m4s | |
41 | #EXTINF:6.000, | |
42 | 18.m4s | |
43 | #EXTINF:6.000, | |
44 | 19.m4s | |
45 | #EXTINF:6.000, | |
46 | 20.m4s | |
47 | #EXTINF:6.000, | |
48 | 21.m4s | |
49 | #EXTINF:6.000, | |
50 | 22.m4s | |
51 | #EXTINF:6.000, | |
52 | 23.m4s | |
53 | #EXTINF:6.000, | |
54 | 24.m4s | |
55 | #EXTINF:6.000, | |
56 | 25.m4s | |
57 | #EXTINF:6.000, | |
58 | 26.m4s | |
59 | #EXTINF:6.000, | |
60 | 27.m4s | |
61 | #EXTINF:6.000, | |
62 | 28.m4s | |
63 | #EXTINF:5.840, | |
64 | 29.m4s |
0 | <?xml version="1.0" encoding="UTF-8"?> | |
1 | <MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |
2 | xmlns="urn:mpeg:dash:schema:mpd:2011" | |
3 | xmlns:xlink="http://www.w3.org/1999/xlink" | |
4 | xmlns:cenc="urn:mpeg:cenc:2013" | |
5 | xmlns:mspr="urn:microsoft:playready" | |
6 | xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011 http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-DASH_schema_files/DASH-MPD.xsd" | |
7 | profiles="urn:mpeg:dash:profile:isoff-live:2011" | |
8 | type="dynamic" | |
9 | minimumUpdatePeriod="PT1.18S" | |
10 | publishTime="2021-05-30T11:17:43.035Z" | |
11 | availabilityStartTime="2021-05-07T09:32:36.454Z" | |
12 | timeShiftBufferDepth="PT40.0S" | |
13 | suggestedPresentationDelay="PT16.0S" | |
14 | minBufferTime="PT6.0S"> | |
15 | <ProgramInformation> | |
16 | <Title>TVE-026.smil</Title> | |
17 | </ProgramInformation> | |
18 | <Period id="0" start="PT0.0S"> | |
19 | <AdaptationSet id="0" group="1" mimeType="video/mp4" maxWidth="854" maxHeight="480" par="16:9" frameRate="17" segmentAlignment="true" startWithSAP="1" subsegmentAlignment="true" subsegmentStartsWithSAP="1"> | |
20 | <ContentProtection schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc" cenc:default_KID="956E27CF-5993-49AF-BA30-62154A85FA02"/> | |
21 | <ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" value="Widevine"> | |
22 | <cenc:pssh>AAAARnBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAACYIARIQlW4nz1mTSa+6MGIVSoX6AhoAIgdUVkVfMDI2KgVTRF9IRA==</cenc:pssh> | |
23 | </ContentProtection> | |
24 | <ContentProtection schemeIdUri="urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95" value="Microsoft PlayReady"> | |
25 | <cenc:pssh>AAADCHBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAAujoAgAAAQABAN4CPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMAAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBFAFkATABFAE4APgAxADYAPAAvAEsARQBZAEwARQBOAD4APABBAEwARwBJAEQAPgBBAEUAUwBDAFQAUgA8AC8AQQBMAEcASQBEAD4APAAvAFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBJAEQAPgB6AHkAZAB1AGwAWgBOAFoAcgAwAG0ANgBNAEcASQBWAFMAbwBYADYAQQBnAD0APQA8AC8ASwBJAEQAPgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcAA6AC8ALwBwAHIAZAByAG0ALQBwAHIAbwBkAC4AbQBpAG4AZABpAGcAbwAuAGgAdQAvAHAAbABhAHkAcgBlAGEAZAB5AC8AcgBpAGcAaAB0AHMAbQBhAG4AYQBnAGUAcgAuAGEAcwBtAHgAPAAvAEwAQQBfAFUAUgBMAD4APABEAFMAXwBJAEQAPgBWAGwAUgA3AEkAZABzAEkASgBFAHUAUgBkADAANgBMAGEAcQBzADIAagB3AD0APQA8AC8ARABTAF8ASQBEAD4APABDAEgARQBDAEsAUwBVAE0APgBoAHcAUgBwADYAbwBqAG8AYwBGAFEAPQA8AC8AQwBIAEUAQwBLAFMAVQBNAD4APAAvAEQAQQBUAEEAPgA8AC8AVwBSAE0ASABFAEEARABFAFIAPgA=</cenc:pssh> | |
26 | <mspr:pro>6AIAAAEAAQDeAjwAVwBSAE0ASABFAEEARABFAFIAIAB4AG0AbABuAHMAPQAiAGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwBEAFIATQAvADIAMAAwADcALwAwADMALwBQAGwAYQB5AFIAZQBhAGQAeQBIAGUAYQBkAGUAcgAiACAAdgBlAHIAcwBpAG8AbgA9ACIANAAuADAALgAwAC4AMAAiAD4APABEAEEAVABBAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsARQBZAEwARQBOAD4AMQA2ADwALwBLAEUAWQBMAEUATgA+ADwAQQBMAEcASQBEAD4AQQBFAFMAQwBUAFIAPAAvAEEATABHAEkARAA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsASQBEAD4AegB5AGQAdQBsAFoATgBaAHIAMABtADYATQBHAEkAVgBTAG8AWAA2AEEAZwA9AD0APAAvAEsASQBEAD4APABMAEEAXwBVAFIATAA+AGgAdAB0AHAAOgAvAC8AcAByAGQAcgBtAC0AcAByAG8AZAAuAG0AaQBuAGQAaQBnAG8ALgBoAHUALwBwAGwAYQB5AHIAZQBhAGQAeQAvAHIAaQBnAGgAdABzAG0AYQBuAGEAZwBlAHIALgBhAHMAbQB4ADwALwBMAEEAXwBVAFIATAA+ADwARABTAF8ASQBEAD4AVgBsAFIANwBJAGQAcwBJAEoARQB1AFIAZAAwADYATABhAHEAcwAyAGoAdwA9AD0APAAvAEQAUwBfAEkARAA+ADwAQwBIAEUAQwBLAFMAVQBNAD4AaAB3AFIAcAA2AG8AagBvAGMARgBRAD0APAAvAEMASABFAEMASwBTAFUATQA+ADwALwBEAEEAVABBAD4APAAvAFcAUgBNAEgARQBBAEQARQBSAD4A</mspr:pro> | |
27 | </ContentProtection> | |
28 | <SegmentTemplate timescale="90000" media="segment_uhzbbkq1n_ctvideo_cfm4s_rid$RepresentationID$_cs$Time$_mpd.m4s" initialization="segment_uhzbbkq1n_ctvideo_cfm4s_rid$RepresentationID$_cinit_mpd.m4s"> | |
29 | <SegmentTimeline> | |
30 | <S t="179411188410" d="720000"/> | |
31 | <S d="720000"/> | |
32 | <S d="720000"/> | |
33 | <S d="720000"/> | |
34 | <S d="720000"/> | |
35 | </SegmentTimeline> | |
36 | </SegmentTemplate> | |
37 | <Representation id="p0va0br1500000" codecs="avc1.4d401e" width="854" height="480" sar="1:1" bandwidth="1500000" /> | |
38 | <Representation id="p0va0br700000" codecs="avc1.4d4015" width="576" height="324" sar="1:1" bandwidth="700000" /> | |
39 | </AdaptationSet> | |
40 | <AdaptationSet id="1" group="2" mimeType="audio/mp4" lang="hun" segmentAlignment="true" startWithSAP="1" subsegmentAlignment="true" subsegmentStartsWithSAP="1"> | |
41 | <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/> | |
42 | <ContentProtection schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc" cenc:default_KID="956E27CF-5993-49AF-BA30-62154A85FA02"/> | |
43 | <ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" value="Widevine"> | |
44 | <cenc:pssh>AAAARnBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAACYIARIQlW4nz1mTSa+6MGIVSoX6AhoAIgdUVkVfMDI2KgVTRF9IRA==</cenc:pssh> | |
45 | </ContentProtection> | |
46 | <ContentProtection schemeIdUri="urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95" value="Microsoft PlayReady"> | |
47 | <cenc:pssh>AAADCHBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAAujoAgAAAQABAN4CPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMAAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBFAFkATABFAE4APgAxADYAPAAvAEsARQBZAEwARQBOAD4APABBAEwARwBJAEQAPgBBAEUAUwBDAFQAUgA8AC8AQQBMAEcASQBEAD4APAAvAFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBJAEQAPgB6AHkAZAB1AGwAWgBOAFoAcgAwAG0ANgBNAEcASQBWAFMAbwBYADYAQQBnAD0APQA8AC8ASwBJAEQAPgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcAA6AC8ALwBwAHIAZAByAG0ALQBwAHIAbwBkAC4AbQBpAG4AZABpAGcAbwAuAGgAdQAvAHAAbABhAHkAcgBlAGEAZAB5AC8AcgBpAGcAaAB0AHMAbQBhAG4AYQBnAGUAcgAuAGEAcwBtAHgAPAAvAEwAQQBfAFUAUgBMAD4APABEAFMAXwBJAEQAPgBWAGwAUgA3AEkAZABzAEkASgBFAHUAUgBkADAANgBMAGEAcQBzADIAagB3AD0APQA8AC8ARABTAF8ASQBEAD4APABDAEgARQBDAEsAUwBVAE0APgBoAHcAUgBwADYAbwBqAG8AYwBGAFEAPQA8AC8AQwBIAEUAQwBLAFMAVQBNAD4APAAvAEQAQQBUAEEAPgA8AC8AVwBSAE0ASABFAEEARABFAFIAPgA=</cenc:pssh> | |
48 | <mspr:pro>6AIAAAEAAQDeAjwAVwBSAE0ASABFAEEARABFAFIAIAB4AG0AbABuAHMAPQAiAGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwBEAFIATQAvADIAMAAwADcALwAwADMALwBQAGwAYQB5AFIAZQBhAGQAeQBIAGUAYQBkAGUAcgAiACAAdgBlAHIAcwBpAG8AbgA9ACIANAAuADAALgAwAC4AMAAiAD4APABEAEEAVABBAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsARQBZAEwARQBOAD4AMQA2ADwALwBLAEUAWQBMAEUATgA+ADwAQQBMAEcASQBEAD4AQQBFAFMAQwBUAFIAPAAvAEEATABHAEkARAA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsASQBEAD4AegB5AGQAdQBsAFoATgBaAHIAMABtADYATQBHAEkAVgBTAG8AWAA2AEEAZwA9AD0APAAvAEsASQBEAD4APABMAEEAXwBVAFIATAA+AGgAdAB0AHAAOgAvAC8AcAByAGQAcgBtAC0AcAByAG8AZAAuAG0AaQBuAGQAaQBnAG8ALgBoAHUALwBwAGwAYQB5AHIAZQBhAGQAeQAvAHIAaQBnAGgAdABzAG0AYQBuAGEAZwBlAHIALgBhAHMAbQB4ADwALwBMAEEAXwBVAFIATAA+ADwARABTAF8ASQBEAD4AVgBsAFIANwBJAGQAcwBJAEoARQB1AFIAZAAwADYATABhAHEAcwAyAGoAdwA9AD0APAAvAEQAUwBfAEkARAA+ADwAQwBIAEUAQwBLAFMAVQBNAD4AaAB3AFIAcAA2AG8AagBvAGMARgBRAD0APAAvAEMASABFAEMASwBTAFUATQA+ADwALwBEAEEAVABBAD4APAAvAFcAUgBNAEgARQBBAEQARQBSAD4A</mspr:pro> | |
49 | </ContentProtection> | |
50 | <SegmentTemplate timescale="48000" media="segment_uhzbbkq1n_ctaudio_cfm4s_rid$RepresentationID$_cs$Time$_mpd.m4s" initialization="segment_uhzbbkq1n_ctaudio_cfm4s_rid$RepresentationID$_cinit_mpd.m4s"> | |
51 | <SegmentTimeline> | |
52 | <S t="95685861696" d="380928"/> | |
53 | <S d="372768"/> | |
54 | <S d="381936"/> | |
55 | <S d="381936"/> | |
56 | <S d="392208"/> | |
57 | </SegmentTimeline> | |
58 | </SegmentTemplate> | |
59 | <Representation id="p0aa0br128000" codecs="mp4a.40.2" audioSamplingRate="48000" bandwidth="128000"> | |
60 | </Representation> | |
61 | </AdaptationSet> | |
62 | </Period> | |
63 | <UTCTiming schemeIdUri="urn:mpeg:dash:utc:direct:2014" value="2021-05-30T11:17:43.035Z"/> | |
64 | </MPD> |
0 | <?xml version="1.0" encoding="UTF-8"?> | |
1 | <MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |
2 | xmlns="urn:mpeg:dash:schema:mpd:2011" | |
3 | xmlns:xlink="http://www.w3.org/1999/xlink" | |
4 | xmlns:cenc="urn:mpeg:cenc:2013" | |
5 | xmlns:mspr="urn:microsoft:playready" | |
6 | xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011 http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-DASH_schema_files/DASH-MPD.xsd" | |
7 | profiles="urn:mpeg:dash:profile:isoff-live:2011" | |
8 | type="dynamic" | |
9 | minimumUpdatePeriod="PT7.942S" | |
10 | publishTime="2021-05-30T11:17:52.230Z" | |
11 | availabilityStartTime="2021-05-07T09:32:36.454Z" | |
12 | timeShiftBufferDepth="PT40.0S" | |
13 | suggestedPresentationDelay="PT16.0S" | |
14 | minBufferTime="PT6.0S"> | |
15 | <ProgramInformation> | |
16 | <Title>TVE-026.smil</Title> | |
17 | </ProgramInformation> | |
18 | <Period id="0" start="PT0.0S"> | |
19 | <AdaptationSet id="0" group="1" mimeType="video/mp4" maxWidth="854" maxHeight="480" par="16:9" frameRate="17" segmentAlignment="true" startWithSAP="1" subsegmentAlignment="true" subsegmentStartsWithSAP="1"> | |
20 | <ContentProtection schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc" cenc:default_KID="956E27CF-5993-49AF-BA30-62154A85FA02"/> | |
21 | <ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" value="Widevine"> | |
22 | <cenc:pssh>AAAARnBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAACYIARIQlW4nz1mTSa+6MGIVSoX6AhoAIgdUVkVfMDI2KgVTRF9IRA==</cenc:pssh> | |
23 | </ContentProtection> | |
24 | <ContentProtection schemeIdUri="urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95" value="Microsoft PlayReady"> | |
25 | <cenc:pssh>AAADCHBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAAujoAgAAAQABAN4CPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMAAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBFAFkATABFAE4APgAxADYAPAAvAEsARQBZAEwARQBOAD4APABBAEwARwBJAEQAPgBBAEUAUwBDAFQAUgA8AC8AQQBMAEcASQBEAD4APAAvAFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBJAEQAPgB6AHkAZAB1AGwAWgBOAFoAcgAwAG0ANgBNAEcASQBWAFMAbwBYADYAQQBnAD0APQA8AC8ASwBJAEQAPgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcAA6AC8ALwBwAHIAZAByAG0ALQBwAHIAbwBkAC4AbQBpAG4AZABpAGcAbwAuAGgAdQAvAHAAbABhAHkAcgBlAGEAZAB5AC8AcgBpAGcAaAB0AHMAbQBhAG4AYQBnAGUAcgAuAGEAcwBtAHgAPAAvAEwAQQBfAFUAUgBMAD4APABEAFMAXwBJAEQAPgBWAGwAUgA3AEkAZABzAEkASgBFAHUAUgBkADAANgBMAGEAcQBzADIAagB3AD0APQA8AC8ARABTAF8ASQBEAD4APABDAEgARQBDAEsAUwBVAE0APgBoAHcAUgBwADYAbwBqAG8AYwBGAFEAPQA8AC8AQwBIAEUAQwBLAFMAVQBNAD4APAAvAEQAQQBUAEEAPgA8AC8AVwBSAE0ASABFAEEARABFAFIAPgA=</cenc:pssh> | |
26 | <mspr:pro>6AIAAAEAAQDeAjwAVwBSAE0ASABFAEEARABFAFIAIAB4AG0AbABuAHMAPQAiAGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwBEAFIATQAvADIAMAAwADcALwAwADMALwBQAGwAYQB5AFIAZQBhAGQAeQBIAGUAYQBkAGUAcgAiACAAdgBlAHIAcwBpAG8AbgA9ACIANAAuADAALgAwAC4AMAAiAD4APABEAEEAVABBAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsARQBZAEwARQBOAD4AMQA2ADwALwBLAEUAWQBMAEUATgA+ADwAQQBMAEcASQBEAD4AQQBFAFMAQwBUAFIAPAAvAEEATABHAEkARAA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsASQBEAD4AegB5AGQAdQBsAFoATgBaAHIAMABtADYATQBHAEkAVgBTAG8AWAA2AEEAZwA9AD0APAAvAEsASQBEAD4APABMAEEAXwBVAFIATAA+AGgAdAB0AHAAOgAvAC8AcAByAGQAcgBtAC0AcAByAG8AZAAuAG0AaQBuAGQAaQBnAG8ALgBoAHUALwBwAGwAYQB5AHIAZQBhAGQAeQAvAHIAaQBnAGgAdABzAG0AYQBuAGEAZwBlAHIALgBhAHMAbQB4ADwALwBMAEEAXwBVAFIATAA+ADwARABTAF8ASQBEAD4AVgBsAFIANwBJAGQAcwBJAEoARQB1AFIAZAAwADYATABhAHEAcwAyAGoAdwA9AD0APAAvAEQAUwBfAEkARAA+ADwAQwBIAEUAQwBLAFMAVQBNAD4AaAB3AFIAcAA2AG8AagBvAGMARgBRAD0APAAvAEMASABFAEMASwBTAFUATQA+ADwALwBEAEEAVABBAD4APAAvAFcAUgBNAEgARQBBAEQARQBSAD4A</mspr:pro> | |
27 | </ContentProtection> | |
28 | <SegmentTemplate timescale="90000" media="segment_uhzbbkq1n_ctvideo_cfm4s_rid$RepresentationID$_cs$Time$_mpd.m4s" initialization="segment_uhzbbkq1n_ctvideo_cfm4s_rid$RepresentationID$_cinit_mpd.m4s"> | |
29 | <SegmentTimeline> | |
30 | <S t="179412628410" d="720000"/> | |
31 | <S d="720000"/> | |
32 | <S d="720000"/> | |
33 | <S d="720000"/> | |
34 | <S d="720000"/> | |
35 | </SegmentTimeline> | |
36 | </SegmentTemplate> | |
37 | <Representation id="p0va0br1500000" codecs="avc1.4d401e" width="854" height="480" sar="1:1" bandwidth="1500000" /> | |
38 | <Representation id="p0va0br700000" codecs="avc1.4d4015" width="576" height="324" sar="1:1" bandwidth="700000" /> | |
39 | </AdaptationSet> | |
40 | <AdaptationSet id="1" group="2" mimeType="audio/mp4" lang="hun" segmentAlignment="true" startWithSAP="1" subsegmentAlignment="true" subsegmentStartsWithSAP="1"> | |
41 | <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/> | |
42 | <ContentProtection schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc" cenc:default_KID="956E27CF-5993-49AF-BA30-62154A85FA02"/> | |
43 | <ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" value="Widevine"> | |
44 | <cenc:pssh>AAAARnBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAACYIARIQlW4nz1mTSa+6MGIVSoX6AhoAIgdUVkVfMDI2KgVTRF9IRA==</cenc:pssh> | |
45 | </ContentProtection> | |
46 | <ContentProtection schemeIdUri="urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95" value="Microsoft PlayReady"> | |
47 | <cenc:pssh>AAADCHBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAAujoAgAAAQABAN4CPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMAAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBFAFkATABFAE4APgAxADYAPAAvAEsARQBZAEwARQBOAD4APABBAEwARwBJAEQAPgBBAEUAUwBDAFQAUgA8AC8AQQBMAEcASQBEAD4APAAvAFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBJAEQAPgB6AHkAZAB1AGwAWgBOAFoAcgAwAG0ANgBNAEcASQBWAFMAbwBYADYAQQBnAD0APQA8AC8ASwBJAEQAPgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcAA6AC8ALwBwAHIAZAByAG0ALQBwAHIAbwBkAC4AbQBpAG4AZABpAGcAbwAuAGgAdQAvAHAAbABhAHkAcgBlAGEAZAB5AC8AcgBpAGcAaAB0AHMAbQBhAG4AYQBnAGUAcgAuAGEAcwBtAHgAPAAvAEwAQQBfAFUAUgBMAD4APABEAFMAXwBJAEQAPgBWAGwAUgA3AEkAZABzAEkASgBFAHUAUgBkADAANgBMAGEAcQBzADIAagB3AD0APQA8AC8ARABTAF8ASQBEAD4APABDAEgARQBDAEsAUwBVAE0APgBoAHcAUgBwADYAbwBqAG8AYwBGAFEAPQA8AC8AQwBIAEUAQwBLAFMAVQBNAD4APAAvAEQAQQBUAEEAPgA8AC8AVwBSAE0ASABFAEEARABFAFIAPgA=</cenc:pssh> | |
48 | <mspr:pro>6AIAAAEAAQDeAjwAVwBSAE0ASABFAEEARABFAFIAIAB4AG0AbABuAHMAPQAiAGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwBEAFIATQAvADIAMAAwADcALwAwADMALwBQAGwAYQB5AFIAZQBhAGQAeQBIAGUAYQBkAGUAcgAiACAAdgBlAHIAcwBpAG8AbgA9ACIANAAuADAALgAwAC4AMAAiAD4APABEAEEAVABBAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsARQBZAEwARQBOAD4AMQA2ADwALwBLAEUAWQBMAEUATgA+ADwAQQBMAEcASQBEAD4AQQBFAFMAQwBUAFIAPAAvAEEATABHAEkARAA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsASQBEAD4AegB5AGQAdQBsAFoATgBaAHIAMABtADYATQBHAEkAVgBTAG8AWAA2AEEAZwA9AD0APAAvAEsASQBEAD4APABMAEEAXwBVAFIATAA+AGgAdAB0AHAAOgAvAC8AcAByAGQAcgBtAC0AcAByAG8AZAAuAG0AaQBuAGQAaQBnAG8ALgBoAHUALwBwAGwAYQB5AHIAZQBhAGQAeQAvAHIAaQBnAGgAdABzAG0AYQBuAGEAZwBlAHIALgBhAHMAbQB4ADwALwBMAEEAXwBVAFIATAA+ADwARABTAF8ASQBEAD4AVgBsAFIANwBJAGQAcwBJAEoARQB1AFIAZAAwADYATABhAHEAcwAyAGoAdwA9AD0APAAvAEQAUwBfAEkARAA+ADwAQwBIAEUAQwBLAFMAVQBNAD4AaAB3AFIAcAA2AG8AagBvAGMARgBRAD0APAAvAEMASABFAEMASwBTAFUATQA+ADwALwBEAEEAVABBAD4APAAvAFcAUgBNAEgARQBBAEQARQBSAD4A</mspr:pro> | |
49 | </ContentProtection> | |
50 | <SegmentTemplate timescale="48000" media="segment_uhzbbkq1n_ctaudio_cfm4s_rid$RepresentationID$_cs$Time$_mpd.m4s" initialization="segment_uhzbbkq1n_ctaudio_cfm4s_rid$RepresentationID$_cinit_mpd.m4s"> | |
51 | <SegmentTimeline> | |
52 | <S t="95686617408" d="381936"/> | |
53 | <S d="381936"/> | |
54 | <S d="392208"/> | |
55 | <S d="381984"/> | |
56 | <S d="381936"/> | |
57 | </SegmentTimeline> | |
58 | </SegmentTemplate> | |
59 | <Representation id="p0aa0br128000" codecs="mp4a.40.2" audioSamplingRate="48000" bandwidth="128000"> | |
60 | </Representation> | |
61 | </AdaptationSet> | |
62 | </Period> | |
63 | <UTCTiming schemeIdUri="urn:mpeg:dash:utc:direct:2014" value="2021-05-30T11:17:52.230Z"/> | |
64 | </MPD> |
0 | <?xml version="1.0" encoding="UTF-8"?> | |
1 | <MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |
2 | xmlns="urn:mpeg:dash:schema:mpd:2011" | |
3 | xmlns:xlink="http://www.w3.org/1999/xlink" | |
4 | xmlns:cenc="urn:mpeg:cenc:2013" | |
5 | xmlns:mspr="urn:microsoft:playready" | |
6 | xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011 http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-DASH_schema_files/DASH-MPD.xsd" | |
7 | profiles="urn:mpeg:dash:profile:isoff-live:2011" | |
8 | type="dynamic" | |
9 | minimumUpdatePeriod="PT6.751S" | |
10 | publishTime="2021-05-30T11:18:01.421Z" | |
11 | availabilityStartTime="2021-05-07T09:32:36.454Z" | |
12 | timeShiftBufferDepth="PT40.0S" | |
13 | suggestedPresentationDelay="PT16.0S" | |
14 | minBufferTime="PT6.0S"> | |
15 | <ProgramInformation> | |
16 | <Title>TVE-026.smil</Title> | |
17 | </ProgramInformation> | |
18 | <Period id="0" start="PT0.0S"> | |
19 | <AdaptationSet id="0" group="1" mimeType="video/mp4" maxWidth="854" maxHeight="480" par="16:9" frameRate="17" segmentAlignment="true" startWithSAP="1" subsegmentAlignment="true" subsegmentStartsWithSAP="1"> | |
20 | <ContentProtection schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc" cenc:default_KID="956E27CF-5993-49AF-BA30-62154A85FA02"/> | |
21 | <ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" value="Widevine"> | |
22 | <cenc:pssh>AAAARnBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAACYIARIQlW4nz1mTSa+6MGIVSoX6AhoAIgdUVkVfMDI2KgVTRF9IRA==</cenc:pssh> | |
23 | </ContentProtection> | |
24 | <ContentProtection schemeIdUri="urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95" value="Microsoft PlayReady"> | |
25 | <cenc:pssh>AAADCHBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAAujoAgAAAQABAN4CPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMAAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBFAFkATABFAE4APgAxADYAPAAvAEsARQBZAEwARQBOAD4APABBAEwARwBJAEQAPgBBAEUAUwBDAFQAUgA8AC8AQQBMAEcASQBEAD4APAAvAFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBJAEQAPgB6AHkAZAB1AGwAWgBOAFoAcgAwAG0ANgBNAEcASQBWAFMAbwBYADYAQQBnAD0APQA8AC8ASwBJAEQAPgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcAA6AC8ALwBwAHIAZAByAG0ALQBwAHIAbwBkAC4AbQBpAG4AZABpAGcAbwAuAGgAdQAvAHAAbABhAHkAcgBlAGEAZAB5AC8AcgBpAGcAaAB0AHMAbQBhAG4AYQBnAGUAcgAuAGEAcwBtAHgAPAAvAEwAQQBfAFUAUgBMAD4APABEAFMAXwBJAEQAPgBWAGwAUgA3AEkAZABzAEkASgBFAHUAUgBkADAANgBMAGEAcQBzADIAagB3AD0APQA8AC8ARABTAF8ASQBEAD4APABDAEgARQBDAEsAUwBVAE0APgBoAHcAUgBwADYAbwBqAG8AYwBGAFEAPQA8AC8AQwBIAEUAQwBLAFMAVQBNAD4APAAvAEQAQQBUAEEAPgA8AC8AVwBSAE0ASABFAEEARABFAFIAPgA=</cenc:pssh> | |
26 | <mspr:pro>6AIAAAEAAQDeAjwAVwBSAE0ASABFAEEARABFAFIAIAB4AG0AbABuAHMAPQAiAGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwBEAFIATQAvADIAMAAwADcALwAwADMALwBQAGwAYQB5AFIAZQBhAGQAeQBIAGUAYQBkAGUAcgAiACAAdgBlAHIAcwBpAG8AbgA9ACIANAAuADAALgAwAC4AMAAiAD4APABEAEEAVABBAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsARQBZAEwARQBOAD4AMQA2ADwALwBLAEUAWQBMAEUATgA+ADwAQQBMAEcASQBEAD4AQQBFAFMAQwBUAFIAPAAvAEEATABHAEkARAA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsASQBEAD4AegB5AGQAdQBsAFoATgBaAHIAMABtADYATQBHAEkAVgBTAG8AWAA2AEEAZwA9AD0APAAvAEsASQBEAD4APABMAEEAXwBVAFIATAA+AGgAdAB0AHAAOgAvAC8AcAByAGQAcgBtAC0AcAByAG8AZAAuAG0AaQBuAGQAaQBnAG8ALgBoAHUALwBwAGwAYQB5AHIAZQBhAGQAeQAvAHIAaQBnAGgAdABzAG0AYQBuAGEAZwBlAHIALgBhAHMAbQB4ADwALwBMAEEAXwBVAFIATAA+ADwARABTAF8ASQBEAD4AVgBsAFIANwBJAGQAcwBJAEoARQB1AFIAZAAwADYATABhAHEAcwAyAGoAdwA9AD0APAAvAEQAUwBfAEkARAA+ADwAQwBIAEUAQwBLAFMAVQBNAD4AaAB3AFIAcAA2AG8AagBvAGMARgBRAD0APAAvAEMASABFAEMASwBTAFUATQA+ADwALwBEAEEAVABBAD4APAAvAFcAUgBNAEgARQBBAEQARQBSAD4A</mspr:pro> | |
27 | </ContentProtection> | |
28 | <SegmentTemplate timescale="90000" media="segment_uhzbbkq1n_ctvideo_cfm4s_rid$RepresentationID$_cs$Time$_mpd.m4s" initialization="segment_uhzbbkq1n_ctvideo_cfm4s_rid$RepresentationID$_cinit_mpd.m4s"> | |
29 | <SegmentTimeline> | |
30 | <S t="179413348410" d="720000"/> | |
31 | <S d="720000"/> | |
32 | <S d="720000"/> | |
33 | <S d="720000"/> | |
34 | <S d="720000"/> | |
35 | </SegmentTimeline> | |
36 | </SegmentTemplate> | |
37 | <Representation id="p0va0br1500000" codecs="avc1.4d401e" width="854" height="480" sar="1:1" bandwidth="1500000" /> | |
38 | <Representation id="p0va0br700000" codecs="avc1.4d4015" width="576" height="324" sar="1:1" bandwidth="700000" /> | |
39 | </AdaptationSet> | |
40 | <AdaptationSet id="1" group="2" mimeType="audio/mp4" lang="hun" segmentAlignment="true" startWithSAP="1" subsegmentAlignment="true" subsegmentStartsWithSAP="1"> | |
41 | <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/> | |
42 | <ContentProtection schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc" cenc:default_KID="956E27CF-5993-49AF-BA30-62154A85FA02"/> | |
43 | <ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" value="Widevine"> | |
44 | <cenc:pssh>AAAARnBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAACYIARIQlW4nz1mTSa+6MGIVSoX6AhoAIgdUVkVfMDI2KgVTRF9IRA==</cenc:pssh> | |
45 | </ContentProtection> | |
46 | <ContentProtection schemeIdUri="urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95" value="Microsoft PlayReady"> | |
47 | <cenc:pssh>AAADCHBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAAujoAgAAAQABAN4CPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMAAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBFAFkATABFAE4APgAxADYAPAAvAEsARQBZAEwARQBOAD4APABBAEwARwBJAEQAPgBBAEUAUwBDAFQAUgA8AC8AQQBMAEcASQBEAD4APAAvAFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBJAEQAPgB6AHkAZAB1AGwAWgBOAFoAcgAwAG0ANgBNAEcASQBWAFMAbwBYADYAQQBnAD0APQA8AC8ASwBJAEQAPgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcAA6AC8ALwBwAHIAZAByAG0ALQBwAHIAbwBkAC4AbQBpAG4AZABpAGcAbwAuAGgAdQAvAHAAbABhAHkAcgBlAGEAZAB5AC8AcgBpAGcAaAB0AHMAbQBhAG4AYQBnAGUAcgAuAGEAcwBtAHgAPAAvAEwAQQBfAFUAUgBMAD4APABEAFMAXwBJAEQAPgBWAGwAUgA3AEkAZABzAEkASgBFAHUAUgBkADAANgBMAGEAcQBzADIAagB3AD0APQA8AC8ARABTAF8ASQBEAD4APABDAEgARQBDAEsAUwBVAE0APgBoAHcAUgBwADYAbwBqAG8AYwBGAFEAPQA8AC8AQwBIAEUAQwBLAFMAVQBNAD4APAAvAEQAQQBUAEEAPgA8AC8AVwBSAE0ASABFAEEARABFAFIAPgA=</cenc:pssh> | |
48 | <mspr:pro>6AIAAAEAAQDeAjwAVwBSAE0ASABFAEEARABFAFIAIAB4AG0AbABuAHMAPQAiAGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwBEAFIATQAvADIAMAAwADcALwAwADMALwBQAGwAYQB5AFIAZQBhAGQAeQBIAGUAYQBkAGUAcgAiACAAdgBlAHIAcwBpAG8AbgA9ACIANAAuADAALgAwAC4AMAAiAD4APABEAEEAVABBAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsARQBZAEwARQBOAD4AMQA2ADwALwBLAEUAWQBMAEUATgA+ADwAQQBMAEcASQBEAD4AQQBFAFMAQwBUAFIAPAAvAEEATABHAEkARAA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsASQBEAD4AegB5AGQAdQBsAFoATgBaAHIAMABtADYATQBHAEkAVgBTAG8AWAA2AEEAZwA9AD0APAAvAEsASQBEAD4APABMAEEAXwBVAFIATAA+AGgAdAB0AHAAOgAvAC8AcAByAGQAcgBtAC0AcAByAG8AZAAuAG0AaQBuAGQAaQBnAG8ALgBoAHUALwBwAGwAYQB5AHIAZQBhAGQAeQAvAHIAaQBnAGgAdABzAG0AYQBuAGEAZwBlAHIALgBhAHMAbQB4ADwALwBMAEEAXwBVAFIATAA+ADwARABTAF8ASQBEAD4AVgBsAFIANwBJAGQAcwBJAEoARQB1AFIAZAAwADYATABhAHEAcwAyAGoAdwA9AD0APAAvAEQAUwBfAEkARAA+ADwAQwBIAEUAQwBLAFMAVQBNAD4AaAB3AFIAcAA2AG8AagBvAGMARgBRAD0APAAvAEMASABFAEMASwBTAFUATQA+ADwALwBEAEEAVABBAD4APAAvAFcAUgBNAEgARQBBAEQARQBSAD4A</mspr:pro> | |
49 | </ContentProtection> | |
50 | <SegmentTemplate timescale="48000" media="segment_uhzbbkq1n_ctaudio_cfm4s_rid$RepresentationID$_cs$Time$_mpd.m4s" initialization="segment_uhzbbkq1n_ctaudio_cfm4s_rid$RepresentationID$_cinit_mpd.m4s"> | |
51 | <SegmentTimeline> | |
52 | <S t="95687000400" d="381936"/> | |
53 | <S d="392208"/> | |
54 | <S d="381984"/> | |
55 | <S d="381936"/> | |
56 | <S d="381936"/> | |
57 | </SegmentTimeline> | |
58 | </SegmentTemplate> | |
59 | <Representation id="p0aa0br128000" codecs="mp4a.40.2" audioSamplingRate="48000" bandwidth="128000"> | |
60 | </Representation> | |
61 | </AdaptationSet> | |
62 | </Period> | |
63 | <UTCTiming schemeIdUri="urn:mpeg:dash:utc:direct:2014" value="2021-05-30T11:18:01.421Z"/> | |
64 | </MPD> |
0 | <?xml version="1.0" encoding="UTF-8"?> | |
1 | <MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |
2 | xmlns="urn:mpeg:dash:schema:mpd:2011" | |
3 | xmlns:xlink="http://www.w3.org/1999/xlink" | |
4 | xmlns:cenc="urn:mpeg:cenc:2013" | |
5 | xmlns:mspr="urn:microsoft:playready" | |
6 | xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011 http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-DASH_schema_files/DASH-MPD.xsd" | |
7 | profiles="urn:mpeg:dash:profile:isoff-live:2011" | |
8 | type="dynamic" | |
9 | minimumUpdatePeriod="PT6.751S" | |
10 | publishTime="2021-05-30T11:18:01.421Z" | |
11 | availabilityStartTime="2021-05-07T09:32:36.454Z" | |
12 | timeShiftBufferDepth="PT40.0S" | |
13 | suggestedPresentationDelay="PT16.0S" | |
14 | minBufferTime="PT6.0S"> | |
15 | <ProgramInformation> | |
16 | <Title>TVE-026.smil</Title> | |
17 | </ProgramInformation> | |
18 | <Period id="0" start="PT0.0S"> | |
19 | <AdaptationSet id="0" group="1" mimeType="video/mp4" maxWidth="854" maxHeight="480" par="16:9" frameRate="17" segmentAlignment="true" startWithSAP="1" subsegmentAlignment="true" subsegmentStartsWithSAP="1"> | |
20 | <ContentProtection schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc" cenc:default_KID="956E27CF-5993-49AF-BA30-62154A85FA02"/> | |
21 | <ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" value="Widevine"> | |
22 | <cenc:pssh>AAAARnBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAACYIARIQlW4nz1mTSa+6MGIVSoX6AhoAIgdUVkVfMDI2KgVTRF9IRA==</cenc:pssh> | |
23 | </ContentProtection> | |
24 | <ContentProtection schemeIdUri="urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95" value="Microsoft PlayReady"> | |
25 | <cenc:pssh>AAADCHBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAAujoAgAAAQABAN4CPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMAAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBFAFkATABFAE4APgAxADYAPAAvAEsARQBZAEwARQBOAD4APABBAEwARwBJAEQAPgBBAEUAUwBDAFQAUgA8AC8AQQBMAEcASQBEAD4APAAvAFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBJAEQAPgB6AHkAZAB1AGwAWgBOAFoAcgAwAG0ANgBNAEcASQBWAFMAbwBYADYAQQBnAD0APQA8AC8ASwBJAEQAPgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcAA6AC8ALwBwAHIAZAByAG0ALQBwAHIAbwBkAC4AbQBpAG4AZABpAGcAbwAuAGgAdQAvAHAAbABhAHkAcgBlAGEAZAB5AC8AcgBpAGcAaAB0AHMAbQBhAG4AYQBnAGUAcgAuAGEAcwBtAHgAPAAvAEwAQQBfAFUAUgBMAD4APABEAFMAXwBJAEQAPgBWAGwAUgA3AEkAZABzAEkASgBFAHUAUgBkADAANgBMAGEAcQBzADIAagB3AD0APQA8AC8ARABTAF8ASQBEAD4APABDAEgARQBDAEsAUwBVAE0APgBoAHcAUgBwADYAbwBqAG8AYwBGAFEAPQA8AC8AQwBIAEUAQwBLAFMAVQBNAD4APAAvAEQAQQBUAEEAPgA8AC8AVwBSAE0ASABFAEEARABFAFIAPgA=</cenc:pssh> | |
26 | <mspr:pro>6AIAAAEAAQDeAjwAVwBSAE0ASABFAEEARABFAFIAIAB4AG0AbABuAHMAPQAiAGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwBEAFIATQAvADIAMAAwADcALwAwADMALwBQAGwAYQB5AFIAZQBhAGQAeQBIAGUAYQBkAGUAcgAiACAAdgBlAHIAcwBpAG8AbgA9ACIANAAuADAALgAwAC4AMAAiAD4APABEAEEAVABBAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsARQBZAEwARQBOAD4AMQA2ADwALwBLAEUAWQBMAEUATgA+ADwAQQBMAEcASQBEAD4AQQBFAFMAQwBUAFIAPAAvAEEATABHAEkARAA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsASQBEAD4AegB5AGQAdQBsAFoATgBaAHIAMABtADYATQBHAEkAVgBTAG8AWAA2AEEAZwA9AD0APAAvAEsASQBEAD4APABMAEEAXwBVAFIATAA+AGgAdAB0AHAAOgAvAC8AcAByAGQAcgBtAC0AcAByAG8AZAAuAG0AaQBuAGQAaQBnAG8ALgBoAHUALwBwAGwAYQB5AHIAZQBhAGQAeQAvAHIAaQBnAGgAdABzAG0AYQBuAGEAZwBlAHIALgBhAHMAbQB4ADwALwBMAEEAXwBVAFIATAA+ADwARABTAF8ASQBEAD4AVgBsAFIANwBJAGQAcwBJAEoARQB1AFIAZAAwADYATABhAHEAcwAyAGoAdwA9AD0APAAvAEQAUwBfAEkARAA+ADwAQwBIAEUAQwBLAFMAVQBNAD4AaAB3AFIAcAA2AG8AagBvAGMARgBRAD0APAAvAEMASABFAEMASwBTAFUATQA+ADwALwBEAEEAVABBAD4APAAvAFcAUgBNAEgARQBBAEQARQBSAD4A</mspr:pro> | |
27 | </ContentProtection> | |
28 | <SegmentTemplate timescale="90000" media="segment_uhzbbkq1n_ctvideo_cfm4s_rid$RepresentationID$_cs$Time$_mpd.m4s" initialization="segment_uhzbbkq1n_ctvideo_cfm4s_rid$RepresentationID$_cinit_mpd.m4s"> | |
29 | <SegmentTimeline> | |
30 | <S t="179413348410" d="720000"/> | |
31 | <S d="720000"/> | |
32 | <S d="720000"/> | |
33 | <S d="720000"/> | |
34 | <S d="720000"/> | |
35 | </SegmentTimeline> | |
36 | </SegmentTemplate> | |
37 | <Representation id="p0va0br1500000" codecs="avc1.4d401e" width="854" height="480" sar="1:1" bandwidth="1500000" /> | |
38 | <Representation id="p0va0br700000" codecs="avc1.4d4015" width="576" height="324" sar="1:1" bandwidth="700000" /> | |
39 | </AdaptationSet> | |
40 | <AdaptationSet id="1" group="2" mimeType="audio/mp4" lang="hun" segmentAlignment="true" startWithSAP="1" subsegmentAlignment="true" subsegmentStartsWithSAP="1"> | |
41 | <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/> | |
42 | <ContentProtection schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc" cenc:default_KID="956E27CF-5993-49AF-BA30-62154A85FA02"/> | |
43 | <ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" value="Widevine"> | |
44 | <cenc:pssh>AAAARnBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAACYIARIQlW4nz1mTSa+6MGIVSoX6AhoAIgdUVkVfMDI2KgVTRF9IRA==</cenc:pssh> | |
45 | </ContentProtection> | |
46 | <ContentProtection schemeIdUri="urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95" value="Microsoft PlayReady"> | |
47 | <cenc:pssh>AAADCHBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAAujoAgAAAQABAN4CPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMAAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBFAFkATABFAE4APgAxADYAPAAvAEsARQBZAEwARQBOAD4APABBAEwARwBJAEQAPgBBAEUAUwBDAFQAUgA8AC8AQQBMAEcASQBEAD4APAAvAFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBJAEQAPgB6AHkAZAB1AGwAWgBOAFoAcgAwAG0ANgBNAEcASQBWAFMAbwBYADYAQQBnAD0APQA8AC8ASwBJAEQAPgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcAA6AC8ALwBwAHIAZAByAG0ALQBwAHIAbwBkAC4AbQBpAG4AZABpAGcAbwAuAGgAdQAvAHAAbABhAHkAcgBlAGEAZAB5AC8AcgBpAGcAaAB0AHMAbQBhAG4AYQBnAGUAcgAuAGEAcwBtAHgAPAAvAEwAQQBfAFUAUgBMAD4APABEAFMAXwBJAEQAPgBWAGwAUgA3AEkAZABzAEkASgBFAHUAUgBkADAANgBMAGEAcQBzADIAagB3AD0APQA8AC8ARABTAF8ASQBEAD4APABDAEgARQBDAEsAUwBVAE0APgBoAHcAUgBwADYAbwBqAG8AYwBGAFEAPQA8AC8AQwBIAEUAQwBLAFMAVQBNAD4APAAvAEQAQQBUAEEAPgA8AC8AVwBSAE0ASABFAEEARABFAFIAPgA=</cenc:pssh> | |
48 | <mspr:pro>6AIAAAEAAQDeAjwAVwBSAE0ASABFAEEARABFAFIAIAB4AG0AbABuAHMAPQAiAGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwBEAFIATQAvADIAMAAwADcALwAwADMALwBQAGwAYQB5AFIAZQBhAGQAeQBIAGUAYQBkAGUAcgAiACAAdgBlAHIAcwBpAG8AbgA9ACIANAAuADAALgAwAC4AMAAiAD4APABEAEEAVABBAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsARQBZAEwARQBOAD4AMQA2ADwALwBLAEUAWQBMAEUATgA+ADwAQQBMAEcASQBEAD4AQQBFAFMAQwBUAFIAPAAvAEEATABHAEkARAA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsASQBEAD4AegB5AGQAdQBsAFoATgBaAHIAMABtADYATQBHAEkAVgBTAG8AWAA2AEEAZwA9AD0APAAvAEsASQBEAD4APABMAEEAXwBVAFIATAA+AGgAdAB0AHAAOgAvAC8AcAByAGQAcgBtAC0AcAByAG8AZAAuAG0AaQBuAGQAaQBnAG8ALgBoAHUALwBwAGwAYQB5AHIAZQBhAGQAeQAvAHIAaQBnAGgAdABzAG0AYQBuAGEAZwBlAHIALgBhAHMAbQB4ADwALwBMAEEAXwBVAFIATAA+ADwARABTAF8ASQBEAD4AVgBsAFIANwBJAGQAcwBJAEoARQB1AFIAZAAwADYATABhAHEAcwAyAGoAdwA9AD0APAAvAEQAUwBfAEkARAA+ADwAQwBIAEUAQwBLAFMAVQBNAD4AaAB3AFIAcAA2AG8AagBvAGMARgBRAD0APAAvAEMASABFAEMASwBTAFUATQA+ADwALwBEAEEAVABBAD4APAAvAFcAUgBNAEgARQBBAEQARQBSAD4A</mspr:pro> | |
49 | </ContentProtection> | |
50 | <SegmentTemplate timescale="48000" media="segment_uhzbbkq1n_ctaudio_cfm4s_rid$RepresentationID$_cs$Time$_mpd.m4s" initialization="segment_uhzbbkq1n_ctaudio_cfm4s_rid$RepresentationID$_cinit_mpd.m4s"> | |
51 | <SegmentTimeline> | |
52 | <S t="95687382337" d="392208"/> | |
53 | <S d="381984"/> | |
54 | <S d="381936"/> | |
55 | <S d="381936"/> | |
56 | <S d="381999"/> | |
57 | </SegmentTimeline> | |
58 | </SegmentTemplate> | |
59 | <Representation id="p0aa0br128000" codecs="mp4a.40.2" audioSamplingRate="48000" bandwidth="128000"> | |
60 | </Representation> | |
61 | </AdaptationSet> | |
62 | </Period> | |
63 | <UTCTiming schemeIdUri="urn:mpeg:dash:utc:direct:2014" value="2021-05-30T11:18:01.421Z"/> | |
64 | </MPD> |
0 | <?xml version="1.0"?> | |
1 | <MPD xmlns="urn:mpeg:dash:schema:mpd:2011" availabilityStartTime="2021-06-06T18:49:02Z" maxSegmentDuration="PT4.096S" minBufferTime="PT4.096S" minimumUpdatePeriod="PT8.000S" profiles="urn:mpeg:dash:profile:isoff-live:2011" publishTime="2021-06-06T19:38:20Z" suggestedPresentationDelay="PT12.288S" timeShiftBufferDepth="PT180.000S" type="dynamic"> | |
2 | <Period id="2924.544000" start="PT2924.544000S"> | |
3 | <AssetIdentifier schemeIdUri="urn:org:dashif:asset-id:2013" value="51aaf401283c45de9aa6d7369c0910d7"/> | |
4 | <AdaptationSet contentType="video" id="1" maxFrameRate="30" maxHeight="504" maxWidth="896" mimeType="video/mp4" segmentAlignment="true" startWithSAP="1"> | |
5 | <SupplementalProperty schemeIdUri="urn:mpeg:dash:adaptation-set-switching:2016" value="2"/> | |
6 | <InbandEventStream schemeIdUri="com.uplynk.asset.metadata"/> | |
7 | <Representation bandwidth="41431" codecs="avc1.42000b" frameRate="22" height="54" id="A" scanType="progressive" width="96"> | |
8 | <BaseURL>https://foo.bar/mpd/slices/</BaseURL> | |
9 | <SegmentTemplate initialization="$RepresentationID$_init.mp4" media="$RepresentationID$$Number%08d$.m4f" presentationTimeOffset="263208960" startNumber="714" timescale="90000"> | |
10 | <SegmentTimeline> | |
11 | <S d="368640" r="7" t="263208960"/> | |
12 | </SegmentTimeline> | |
13 | </SegmentTemplate> | |
14 | </Representation> | |
15 | <Representation bandwidth="41431" codecs="avc1.42000b" frameRate="22" height="54" id="B" scanType="progressive" width="96"> | |
16 | <SegmentTemplate initialization="$RepresentationID$_init.mp4" media="$RepresentationID$$Number%08d$.m4f" presentationTimeOffset="263208960" startNumber="714" timescale="90000"> | |
17 | <SegmentTimeline> | |
18 | <S d="368640" r="7" t="263208960"/> | |
19 | </SegmentTimeline> | |
20 | </SegmentTemplate> | |
21 | </Representation> | |
22 | </AdaptationSet> | |
23 | <AdaptationSet contentType="video" id="2" maxFrameRate="30" maxHeight="504" maxWidth="896" mimeType="video/mp4" segmentAlignment="true" startWithSAP="1"> | |
24 | <BaseURL>https://foo.bar/mpd/slices2/</BaseURL> | |
25 | <SupplementalProperty schemeIdUri="urn:mpeg:dash:adaptation-set-switching:2016" value="2"/> | |
26 | <InbandEventStream schemeIdUri="com.uplynk.asset.metadata"/> | |
27 | <Representation bandwidth="41431" codecs="avc1.42000b" frameRate="22" height="54" id="A" scanType="progressive" width="96"> | |
28 | <BaseURL>https://foo.bar/mpd/slices/</BaseURL> | |
29 | <SegmentTemplate initialization="$RepresentationID$_init.mp4" media="$RepresentationID$$Number%08d$.m4f" presentationTimeOffset="263208960" startNumber="714" timescale="90000"> | |
30 | <SegmentTimeline> | |
31 | <S d="368640" r="7" t="263208960"/> | |
32 | </SegmentTimeline> | |
33 | </SegmentTemplate> | |
34 | </Representation> | |
35 | <Representation bandwidth="41431" codecs="avc1.42000b" frameRate="22" height="54" id="B" scanType="progressive" width="96"> | |
36 | <SegmentTemplate initialization="$RepresentationID$_init.mp4" media="$RepresentationID$$Number%08d$.m4f" presentationTimeOffset="263208960" startNumber="714" timescale="90000"> | |
37 | <SegmentTimeline> | |
38 | <S d="368640" r="7" t="263208960"/> | |
39 | </SegmentTimeline> | |
40 | </SegmentTemplate> | |
41 | </Representation> | |
42 | <Representation bandwidth="41431" codecs="avc1.42000b" frameRate="22" height="54" id="C" scanType="progressive" width="96"> | |
43 | <SegmentTemplate initialization="$RepresentationID$_init.mp4" media="$RepresentationID$$Number%08d$.m4f" presentationTimeOffset="263208960" startNumber="714" timescale="90000"> | |
44 | <SegmentTimeline> | |
45 | <S d="368640" r="7" t="263208960"/> | |
46 | </SegmentTimeline> | |
47 | </SegmentTemplate> | |
48 | </Representation> | |
49 | </AdaptationSet> | |
50 | </Period> | |
51 | <UTCTiming schemeIdUri="urn:mpeg:dash:utc:http-iso:2014" value="https://content-aeui1.uplynk.com/misc/utcservertime"/> | |
52 | </MPD> |
0 | 0 | <?xml version="1.0" encoding="utf-8"?> |
1 | 1 | <MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" availabilityStartTime="1970-01-01T00:00:00Z" maxSegmentDuration="PT2S" minBufferTime="PT2S" minimumUpdatePeriod="P100Y" profiles="urn:mpeg:dash:profile:isoff-live:2011,http://dashif.org/guidelines/dash-if-simple" publishTime="2020-06-08T18:54:24Z" timeShiftBufferDepth="PT5M" type="dynamic" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd"> |
2 | 2 | <Period id="p0" start="PT0S"> |
3 | <AdaptationSet contentType="audio" lang="en" mimeType="audio/mp4" segmentAlignment="true" startWithSAP="1"> | |
4 | <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" /> | |
5 | <SegmentTemplate duration="2" initialization="$RepresentationID$/init.mp4" media="$RepresentationID$/$Number$.m4s" startNumber="0" /> | |
6 | <Representation audioSamplingRate="48000" bandwidth="48000" codecs="mp4a.40.2" id="A48"> | |
7 | <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2" /> | |
8 | </Representation> | |
9 | </AdaptationSet> | |
10 | 3 | <AdaptationSet contentType="video" maxFrameRate="60/2" maxHeight="360" maxWidth="640" mimeType="video/mp4" minHeight="360" minWidth="640" par="16:9" segmentAlignment="true" startWithSAP="1"> |
11 | 4 | <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" /> |
12 | 5 | <SegmentTemplate duration="2" initialization="$RepresentationID$/init.mp4" media="$RepresentationID$/$Number$.m4s" startNumber="0" /> |
13 | 6 | <Representation bandwidth="300000" codecs="avc1.64001e" frameRate="60/2" height="360" id="V300" sar="1:1" width="640" /> |
14 | 7 | </AdaptationSet> |
8 | <AdaptationSet contentType="audio" lang="en" mimeType="audio/mp4" segmentAlignment="true" startWithSAP="1"> | |
9 | <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" /> | |
10 | <SegmentTemplate duration="2" initialization="/$RepresentationID$/init.mp4" media="/$RepresentationID$/$Number$.m4s" startNumber="0" /> | |
11 | <Representation audioSamplingRate="48000" bandwidth="48000" codecs="mp4a.40.2" id="A48"> | |
12 | <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2" /> | |
13 | </Representation> | |
14 | </AdaptationSet> | |
15 | 15 | </Period> |
16 | 16 | </MPD> |
0 | <?xml version="1.0" encoding="utf-8"?> | |
1 | <MPD mediaPresentationDuration="PT1M38.624S" minBufferTime="PT4S" profiles="urn:mpeg:dash:profile:isoff-main:2011" type="static" xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:cenc="urn:mpeg:cenc:2013" xmlns:mspr="urn:microsoft:playready" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-DASH_schema_files/DASH-MPD.xsd"> | |
2 | <Period duration="PT1M38.624S" id="1" start="PT0S"> | |
3 | <AdaptationSet bitstreamSwitching="false" mimeType="video/mp4" segmentAlignment="true" startWithSAP="1" subsegmentAlignment="true" subsegmentStartsWithSAP="1" xmlns:cenc="urn:mpeg:cenc:2013"> | |
4 | <SegmentTemplate startNumber="5" timescale="120000"/> | |
5 | <Representation bandwidth="600000" codecs="avc1.4d4015" frameRate="30000/1001" height="252" id="1" width="448"> | |
6 | <SegmentTemplate initialization="3c1055cb-a842-4449-b393-7f31693b4a8f_1_448x252init.mp4" media="3c1055cb-a842-4449-b393-7f31693b4a8f_1_448x252_$Number%09d$.mp4" startNumber="3"> | |
7 | <SegmentTimeline> | |
8 | <S d="360360" r="23" t="0"/> | |
9 | <S d="225225" t="8648640"/> | |
10 | </SegmentTimeline> | |
11 | </SegmentTemplate> | |
12 | </Representation> | |
13 | <Representation bandwidth="7000000" codecs="avc1.64002a" frameRate="60000/1001" height="1080" id="2" width="1920"> | |
14 | <SegmentTemplate initialization="3c1055cb-a842-4449-b393-7f31693b4a8f_2_1920x1080init.mp4" media="3c1055cb-a842-4449-b393-7f31693b4a8f_2_1920x1080_$Number%09d$.mp4" timescale="90000"> | |
15 | <SegmentTimeline> | |
16 | <S d="480480" r="23" t="0"/> | |
17 | <S d="298298" t="11531520"/> | |
18 | </SegmentTimeline> | |
19 | </SegmentTemplate> | |
20 | </Representation> | |
21 | </AdaptationSet> | |
22 | <AdaptationSet lang="eng" mimeType="audio/mp4" segmentAlignment="0" xmlns:cenc="urn:mpeg:cenc:2013"> | |
23 | <SegmentTemplate initialization="abc_aac1init.mp4" media="abc2_$Number%09d$.mp4" timescale="48000"/> | |
24 | <Label>AAC1</Label> | |
25 | <Representation audioSamplingRate="48000" bandwidth="96000" codecs="mp4a.40.2" id="3"> | |
26 | <SegmentTemplate initialization="3c1055cb-a842-4449-b393-7f31693b4a8f_aac1init.mp4" media="3c1055cb-a842-4449-b393-7f31693b4a8f_aac1_$Number%09d$.mp4"> | |
27 | <SegmentTimeline> | |
28 | <S d="194560" t="0"/> | |
29 | </SegmentTimeline> | |
30 | </SegmentTemplate> | |
31 | </Representation> | |
32 | </AdaptationSet> | |
33 | <AdaptationSet lang="fr" mimeType="audio/mp4" segmentAlignment="0" xmlns:cenc="urn:mpeg:cenc:2013"> | |
34 | <SegmentTemplate initialization="abc_aac1init.mp4" media="abc2_$Number%09d$.mp4" timescale="48000"/> | |
35 | <Label>AAC1</Label> | |
36 | <Representation audioSamplingRate="48000" bandwidth="96000" codecs="mp4a.40.2" id="4"> | |
37 | <SegmentTemplate startNumber="5" timescale="68000"> | |
38 | <SegmentTimeline> | |
39 | <S d="194560" t="0"/> | |
40 | </SegmentTimeline> | |
41 | </SegmentTemplate> | |
42 | </Representation> | |
43 | </AdaptationSet> | |
44 | </Period> | |
45 | </MPD> |
62 | 62 | |
63 | 63 | } // namespace |
64 | 64 | |
65 | std::atomic<bool> exit_thread_flag; | |
66 | std::atomic<bool> timer_thread_running; | |
67 | ||
65 | 68 | void timerfunc(std::shared_ptr<CdmAdapter> adp, uint64_t delay, void* context) |
66 | 69 | { |
67 | std::this_thread::sleep_for(std::chrono::milliseconds(delay)); | |
68 | adp->TimerExpired(context); | |
70 | timer_thread_running = true; | |
71 | uint64_t waited = 0; | |
72 | while (!exit_thread_flag && delay > waited) | |
73 | { | |
74 | std::this_thread::sleep_for(std::chrono::milliseconds(100)); | |
75 | waited += 100; | |
76 | } | |
77 | if (!exit_thread_flag) | |
78 | { | |
79 | adp->TimerExpired(context); | |
80 | } | |
81 | timer_thread_running = false; | |
69 | 82 | } |
70 | 83 | |
71 | 84 | cdm::AudioDecoderConfig_1 ToAudioDecoderConfig_1( |
120 | 133 | , cdm_config_(cdm_config) |
121 | 134 | , active_buffer_(0) |
122 | 135 | , cdm9_(0), cdm10_(0), cdm11_(0) |
136 | , session_active_(false) | |
123 | 137 | { |
124 | 138 | //DCHECK(!key_system_.empty()); |
125 | 139 | Initialize(); |
127 | 141 | |
128 | 142 | CdmAdapter::~CdmAdapter() |
129 | 143 | { |
144 | exit_thread_flag = true; | |
145 | while (timer_thread_running) | |
146 | { | |
147 | std::this_thread::sleep_for(std::chrono::milliseconds(100)); | |
148 | } | |
130 | 149 | if (cdm9_) |
131 | 150 | cdm9_->Destroy(), cdm9_ = nullptr; |
132 | 151 | else if (cdm10_) |
143 | 162 | |
144 | 163 | void CdmAdapter::Initialize() |
145 | 164 | { |
165 | exit_thread_flag = false; | |
166 | timer_thread_running = false; | |
146 | 167 | if (cdm9_ || cdm10_ || cdm11_) |
147 | 168 | { |
148 | 169 | if (cdm9_) |
159 | 180 | library_ = base::LoadNativeLibrary(cdm_path_, &error); |
160 | 181 | |
161 | 182 | if (!library_) |
183 | { | |
184 | std::string log_error = "CDM LoadNativeLibrary error: " + error.ToString(); | |
185 | client_->CDMLog(log_error.c_str()); | |
162 | 186 | return; |
187 | } | |
163 | 188 | |
164 | 189 | init_cdm_func = reinterpret_cast<InitializeCdmModuleFunc>(base::GetFunctionPointerFromNativeLibrary(library_, MAKE_STRING(INITIALIZE_CDM_MODULE))); |
165 | 190 | deinit_cdm_func = reinterpret_cast<DeinitializeCdmModuleFunc>(base::GetFunctionPointerFromNativeLibrary(library_, "DeinitializeCdmModule")); |
302 | 327 | response, response_size); |
303 | 328 | } |
304 | 329 | |
330 | void CdmAdapter::SetSessionActive(bool isActive) | |
331 | { | |
332 | session_active_ = isActive; | |
333 | } | |
334 | ||
335 | bool CdmAdapter::IsSessionActive() | |
336 | { | |
337 | return session_active_; | |
338 | } | |
339 | ||
305 | 340 | void CdmAdapter::CloseSession(uint32_t promise_id, |
306 | 341 | const char* session_id, |
307 | 342 | uint32_t session_id_size) |
308 | 343 | { |
344 | session_active_ = false; | |
345 | exit_thread_flag = true; | |
346 | while (timer_thread_running) | |
347 | { | |
348 | std::this_thread::sleep_for(std::chrono::milliseconds(100)); | |
349 | } | |
309 | 350 | if (cdm9_) |
310 | 351 | cdm9_->CloseSession(promise_id, session_id, session_id_size); |
311 | 352 | else if (cdm10_) |
474 | 515 | |
475 | 516 | void CdmAdapter::SetTimer(int64_t delay_ms, void* context) |
476 | 517 | { |
477 | //LICENSERENEWAL std::thread(timerfunc, shared_from_this(), delay_ms, context).detach(); | |
518 | //LICENSERENEWAL | |
519 | if (session_active_) | |
520 | { | |
521 | exit_thread_flag = false; | |
522 | std::thread(timerfunc, shared_from_this(), delay_ms, context).detach(); | |
523 | } | |
478 | 524 | } |
479 | 525 | |
480 | 526 | cdm::Time CdmAdapter::GetCurrentWallTime() |
5 | 5 | #include <inttypes.h> |
6 | 6 | #include <memory> |
7 | 7 | #include <mutex> |
8 | #include <atomic> | |
8 | 9 | |
9 | 10 | #include "../../base/native_library.h" |
10 | 11 | #include "../../base/compiler_specific.h" |
99 | 100 | const uint8_t* response, |
100 | 101 | uint32_t response_size); |
101 | 102 | |
103 | void SetSessionActive(bool isActive); | |
104 | ||
105 | bool IsSessionActive(); | |
106 | ||
102 | 107 | void CloseSession(uint32_t promise_id, |
103 | 108 | const char* session_id, |
104 | 109 | uint32_t session_id_size); |
237 | 242 | cdm::ContentDecryptionModule_10 *cdm10_; |
238 | 243 | cdm::ContentDecryptionModule_11 *cdm11_; |
239 | 244 | |
245 | std::atomic<bool> session_active_; | |
246 | ||
240 | 247 | DISALLOW_COPY_AND_ASSIGN(CdmAdapter); |
241 | 248 | }; |
242 | 249 |
168 | 168 | { |
169 | 169 | public: |
170 | 170 | // methods |
171 | WV_CencSingleSampleDecrypter(WV_DRM &drm, AP4_DataBuffer &pssh, const uint8_t *defaultKeyId); | |
171 | WV_CencSingleSampleDecrypter(WV_DRM &drm, AP4_DataBuffer &pssh, const uint8_t *defaultKeyId, bool skipSessionMessage); | |
172 | 172 | virtual ~WV_CencSingleSampleDecrypter(); |
173 | 173 | |
174 | 174 | void GetCapabilities(const uint8_t* key, uint32_t media, SSD_DECRYPTER::SSD_CAPS &caps); |
175 | 175 | virtual const char *GetSessionId() override; |
176 | void SetSessionActive(); | |
177 | void CloseSessionId(); | |
178 | AP4_DataBuffer GetChallengeData(); | |
179 | ||
176 | 180 | void SetSession(const char* session, uint32_t session_size, const uint8_t *data, size_t data_size) |
177 | 181 | { |
178 | 182 | std::lock_guard<std::mutex> lock(renewal_lock_); |
179 | 183 | |
180 | 184 | session_ = std::string(session, session_size); |
181 | 185 | challenge_.SetData(data, data_size); |
186 | Log(SSD_HOST::LL_DEBUG, "%s: opened session with Id: %s", __func__, session_.c_str()); | |
182 | 187 | } |
183 | 188 | |
184 | 189 | void AddSessionKey(const uint8_t *data, size_t data_size, uint32_t status); |
387 | 392 | return; |
388 | 393 | |
389 | 394 | if (msg == CDMADPMSG::kSessionMessage) |
395 | { | |
390 | 396 | (*b)->SetSession(session, session_size, data, data_size); |
397 | (*b)->SetSessionActive(); | |
398 | } | |
391 | 399 | else if (msg == CDMADPMSG::kSessionKeysChange) |
392 | 400 | (*b)->AddSessionKey(data, data_size, status); |
393 | 401 | }; |
396 | 404 | | WV_CencSingleSampleDecrypter::WV_CencSingleSampleDecrypter |
397 | 405 | +---------------------------------------------------------------------*/ |
398 | 406 | |
399 | WV_CencSingleSampleDecrypter::WV_CencSingleSampleDecrypter(WV_DRM &drm, AP4_DataBuffer &pssh, const uint8_t *defaultKeyId) | |
407 | WV_CencSingleSampleDecrypter::WV_CencSingleSampleDecrypter(WV_DRM &drm, AP4_DataBuffer &pssh, const uint8_t *defaultKeyId, bool skipSessionMessage) | |
400 | 408 | : AP4_CencSingleSampleDecrypter(0) |
401 | 409 | , drm_(drm) |
402 | 410 | , pssh_(pssh) |
462 | 470 | reinterpret_cast<const uint8_t *>(pssh_.GetData()), pssh_.GetDataSize()); |
463 | 471 | |
464 | 472 | int retrycount=0; |
465 | while (session_.empty() && ++retrycount < 100) | |
473 | while (!drm.GetCdmAdapter()->IsSessionActive() && ++retrycount < 100) | |
466 | 474 | std::this_thread::sleep_for(std::chrono::milliseconds(10)); |
467 | 475 | |
468 | 476 | if (session_.empty()) |
471 | 479 | return; |
472 | 480 | } |
473 | 481 | |
482 | if (skipSessionMessage) | |
483 | return; | |
484 | ||
474 | 485 | while (challenge_.GetDataSize() > 0 && SendSessionMessage()); |
475 | 486 | |
476 | 487 | if (keys_.empty()) |
477 | 488 | { |
478 | 489 | Log(SSD_HOST::LL_ERROR, "License update not successful (no keys)"); |
479 | drm_.GetCdmAdapter()->CloseSession(++promise_id_, session_.data(), session_.size()); | |
480 | session_.clear(); | |
490 | CloseSessionId(); | |
481 | 491 | return; |
482 | 492 | } |
483 | 493 | Log(SSD_HOST::LL_DEBUG, "License update successful"); |
485 | 495 | |
486 | 496 | WV_CencSingleSampleDecrypter::~WV_CencSingleSampleDecrypter() |
487 | 497 | { |
488 | if (!session_.empty()) | |
489 | drm_.GetCdmAdapter()->CloseSession(++promise_id_, session_.data(), session_.size()); | |
490 | 498 | drm_.removessd(this); |
491 | 499 | free(subsample_buffer_decrypt_); |
492 | 500 | free(subsample_buffer_video_); |
570 | 578 | const char *WV_CencSingleSampleDecrypter::GetSessionId() |
571 | 579 | { |
572 | 580 | return session_.empty()? nullptr : session_.c_str(); |
581 | } | |
582 | ||
583 | void WV_CencSingleSampleDecrypter::SetSessionActive() | |
584 | { | |
585 | drm_.GetCdmAdapter()->SetSessionActive(true); | |
586 | } | |
587 | ||
588 | void WV_CencSingleSampleDecrypter::CloseSessionId() | |
589 | { | |
590 | if (!session_.empty()) | |
591 | { | |
592 | Log(SSD_HOST::LL_DEBUG, "%s: close session with Id: %s", __func__, session_.c_str()); | |
593 | drm_.GetCdmAdapter()->CloseSession(++promise_id_, session_.data(), session_.size()); | |
594 | session_.clear(); | |
595 | ||
596 | Log(SSD_HOST::LL_DEBUG, "%s: session closed", __func__); | |
597 | } | |
598 | } | |
599 | ||
600 | AP4_DataBuffer WV_CencSingleSampleDecrypter::GetChallengeData() | |
601 | { | |
602 | return challenge_; | |
573 | 603 | } |
574 | 604 | |
575 | 605 | void WV_CencSingleSampleDecrypter::CheckLicenseRenewal() |
773 | 803 | |
774 | 804 | if (!resLimit.empty()) |
775 | 805 | { |
776 | std::string::size_type posMax = resLimit.find("max=", 0); | |
806 | std::string::size_type posMax = resLimit.find("max="); | |
777 | 807 | if (posMax != std::string::npos) |
778 | 808 | resolution_limit_ = atoi(resLimit.data() + (posMax + 4)); |
779 | 809 | } |
1140 | 1170 | |
1141 | 1171 | bool useSingleDecrypt(false); |
1142 | 1172 | |
1143 | if ((fragInfo.decrypter_flags_ & SSD_DECRYPTER::SSD_CAPS::SSD_SINGLE_DECRYPT) != 0 && subsample_count > 1) | |
1173 | // CDM should get 1 block of encrypted data per sample, encrypted data | |
1174 | // from all subsamples should be formed into a contiguous block. | |
1175 | // Even if there is only 1 subsample, we should remove cleartext data | |
1176 | // from it before passing to CDM. | |
1177 | if ((fragInfo.decrypter_flags_ & SSD_DECRYPTER::SSD_CAPS::SSD_SINGLE_DECRYPT) != 0) | |
1144 | 1178 | { |
1145 | 1179 | decrypt_in_.Reserve(data_in.GetDataSize()); |
1146 | 1180 | decrypt_in_.SetDataSize(0); |
1199 | 1233 | CdmDecryptedBlock cdm_out; |
1200 | 1234 | cdm_out.SetDecryptedBuffer(&buf); |
1201 | 1235 | |
1202 | //LICENSERENEWAL: CheckLicenseRenewal(); | |
1236 | //LICENSERENEWAL: | |
1237 | CheckLicenseRenewal(); | |
1203 | 1238 | cdm::Status ret = drm_.GetCdmAdapter()->Decrypt(cdm_in, &cdm_out); |
1204 | 1239 | |
1205 | 1240 | if (ret == cdm::Status::kSuccess && useSingleDecrypt) |
1295 | 1330 | drained_ = false; |
1296 | 1331 | |
1297 | 1332 | //DecryptAndDecode calls Alloc wich cals kodi VideoCodec. Set instance handle. |
1298 | //LICENSERENEWAL: CheckLicenseRenewal(); | |
1333 | //LICENSERENEWAL: | |
1334 | CheckLicenseRenewal(); | |
1299 | 1335 | media::CdmVideoFrame frame; |
1300 | 1336 | cdm::Status ret = drm_.DecryptAndDecodeFrame(hostInstance, cdm_in, &frame); |
1301 | 1337 | |
1397 | 1433 | return cdmsession_->GetCdmAdapter() != nullptr; |
1398 | 1434 | } |
1399 | 1435 | |
1400 | virtual AP4_CencSingleSampleDecrypter *CreateSingleSampleDecrypter(AP4_DataBuffer &pssh, const char *optionalKeyParameter, const uint8_t *defaultkeyid) override | |
1401 | { | |
1402 | WV_CencSingleSampleDecrypter *decrypter = new WV_CencSingleSampleDecrypter(*cdmsession_, pssh, defaultkeyid); | |
1436 | virtual AP4_CencSingleSampleDecrypter *CreateSingleSampleDecrypter(AP4_DataBuffer &pssh, const char *optionalKeyParameter, const uint8_t *defaultkeyid, bool skipSessionMessage) override | |
1437 | { | |
1438 | WV_CencSingleSampleDecrypter *decrypter = new WV_CencSingleSampleDecrypter(*cdmsession_, pssh, defaultkeyid, skipSessionMessage); | |
1403 | 1439 | if (!decrypter->GetSessionId()) |
1404 | 1440 | { |
1405 | 1441 | delete decrypter; |
1411 | 1447 | virtual void DestroySingleSampleDecrypter(AP4_CencSingleSampleDecrypter* decrypter) override |
1412 | 1448 | { |
1413 | 1449 | if (decrypter) |
1450 | { | |
1451 | // close session before dispose | |
1452 | static_cast<WV_CencSingleSampleDecrypter*>(decrypter)->CloseSessionId(); | |
1414 | 1453 | delete static_cast<WV_CencSingleSampleDecrypter*>(decrypter); |
1454 | } | |
1415 | 1455 | } |
1416 | 1456 | |
1417 | 1457 | virtual void GetCapabilities(AP4_CencSingleSampleDecrypter* decrypter, const uint8_t *keyid, uint32_t media, SSD_DECRYPTER::SSD_CAPS &caps) override |
1430 | 1470 | if (decrypter) |
1431 | 1471 | return static_cast<WV_CencSingleSampleDecrypter*>(decrypter)->HasKeyId(keyid); |
1432 | 1472 | return false; |
1473 | } | |
1474 | ||
1475 | virtual bool HasCdmSession() | |
1476 | { | |
1477 | return cdmsession_ != nullptr; | |
1478 | } | |
1479 | ||
1480 | virtual std::string GetChallengeB64Data(AP4_CencSingleSampleDecrypter* decrypter) override | |
1481 | { | |
1482 | if (!decrypter) | |
1483 | return nullptr; | |
1484 | ||
1485 | AP4_DataBuffer challengeData = static_cast<WV_CencSingleSampleDecrypter*>(decrypter)->GetChallengeData(); | |
1486 | // Keep b64_encode urlEncode enabled otherwise the data will not be sent correctly in the HTTP header | |
1487 | return b64_encode(challengeData.GetData(), challengeData.GetDataSize(), true); | |
1433 | 1488 | } |
1434 | 1489 | |
1435 | 1490 | virtual bool OpenVideoDecoder(AP4_CencSingleSampleDecrypter* decrypter, const SSD_VIDEOINITDATA *initData) override |