diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000000..d7cf3d882e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,76 @@ +--- +name: Bug Report +description: File a bug report +title: "[Bug]: " +labels: ["bug", "needs-triage"] +assignees: [] +body: + - type: checkboxes + attributes: + label: Please confirm you have already done the following + options: + - label: I have searched the repository for related/existing bug reports + - label: I have all the details the issue requires + validations: + required: true + - type: textarea + id: description + attributes: + label: Describe the bug + description: What is the problem? A clear and concise description of the bug. + validations: + required: true + - type: textarea + id: expected + attributes: + label: Expected Behavior + description: | + What is the expected behavior? + validations: + required: true + - type: textarea + id: current + attributes: + label: Current Behavior + description: | + What actually happened? + + Please include full errors, uncaught exceptions, stack traces, and relevant VERBOSE logs. + To get relevant VERBOSE logs from the SDK, you can retrieve by running `export AWS_KVS_LOG_LEVEL=1` + validations: + required: true + - type: textarea + id: reproduction + attributes: + label: Reproduction Steps + description: | + Provide a self-contained, concise snippet of code that can be used to reproduce the issue. + For more complex issues provide a repo with the smallest sample that reproduces the bug. + Avoid including business logic or unrelated code, it makes diagnosis more difficult. + validations: + required: true + - type: input + id: sdk-version + attributes: + label: WebRTC C SDK version being used + validations: + required: true + - type: input + id: compiler-version + attributes: + label: Compiler and Version used + description: gcc --version / Visual Studio / clang --version + validations: + required: true + - type: input + id: operating-system + attributes: + label: Operating System and version + validations: + required: true + - type: input + id: platform + attributes: + label: Platform being used + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000..d31b60f5ae --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,6 @@ +--- +blank_issues_enabled: false +contact_links: + - name: General Question + url: https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-c/discussions + about: Please ask and answer questions as a discussion thread \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/contribution.md b/.github/ISSUE_TEMPLATE/contribution.md deleted file mode 100644 index 35e4281634..0000000000 --- a/.github/ISSUE_TEMPLATE/contribution.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -name: Contribution -about: We always welcome open-source contributions! Please open an issue to tag your pull request -title: "[CONTRIBUTION]" -labels: contribution -assignees: '' - ---- - -PLEASE ADD THE APPROPRIATE TAG TO ALLOW BUCKETIZATION OF THE SOLUTIONS. IF THE TAG IS NOT AVAILABLE, DO NOT WORRY, WE WILL TAKE CARE OF IT! - -** Describe the issue you are trying to solve ** -Add a one line description of the issue you are trying to solve - -** Details of the changes ** -Give a couple of points to describe the changes you have made - -** Test cases ** -Give a detailed description of the tests you are running, if applicable - -** Additional context ** -Any details that can be preserved for the future diff --git a/.github/ISSUE_TEMPLATE/documentation.yml b/.github/ISSUE_TEMPLATE/documentation.yml new file mode 100644 index 0000000000..c3c1da1b03 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/documentation.yml @@ -0,0 +1,31 @@ +--- +name: "Documentation Issue" +description: Report an issue in the github Readme. For issues in AWS documentation pages, submit feedback on the concerned AWS page +title: "[Documentation]: " +labels: ["documentation", "needs-triage"] +assignees: [] +body: + - type: checkboxes + attributes: + label: Please confirm you have already done the following + options: + - label: I have searched the repository for related/existing documentation issue reports + - label: I have all the details the issue requires + validations: + required: true + - type: textarea + id: description + attributes: + label: Describe the issue + description: A clear and concise description of the issue. + validations: + required: true + + - type: textarea + id: links + attributes: + label: Links + description: | + Include links to affected documentation page(s). + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 8403b86c9a..0000000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: "[FEATURE] " -labels: enhancement -assignees: '' - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000000..70914715b7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,46 @@ +--- +name: Feature Request +description: Suggest an idea for this project +title: "[Feature request]: " +labels: [feature-request, needs-triage] +assignees: [] +body: + - type: checkboxes + attributes: + label: Please confirm you have already done the following + options: + - label: I have searched the repository for related/existing feature requests + - label: I have all the details the issue requires + validations: + required: true + - type: textarea + id: description + attributes: + label: Describe the feature + description: A clear and concise description of the feature you are proposing. + validations: + required: true + - type: textarea + id: use-case + attributes: + label: Use Case + description: | + Why do you need this feature? + validations: + required: true + - type: textarea + id: solution + attributes: + label: Proposed Solution + description: | + Suggest how to implement the addition or change. Please include prototype/workaround/sketch/reference implementation. + validations: + required: false + - type: textarea + id: other + attributes: + label: Other Information + description: | + Any alternative solutions or features you considered, a more detailed explanation, stack traces, related issues, links for context, etc. + validations: + required: false \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 6bdaa999fc..e2ba13dcb7 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,6 +1,11 @@ *Issue #, if available:* -*Description of changes:* +*What was changed?* +*Why was it changed?* + +*How was it changed?* + +*What testing was done for the changes?* By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice. diff --git a/.github/build_windows_mbedtls.bat b/.github/build_windows_mbedtls.bat new file mode 100644 index 0000000000..0e3c9eb1a9 --- /dev/null +++ b/.github/build_windows_mbedtls.bat @@ -0,0 +1,6 @@ +call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" +mkdir build +cd build +cmd.exe /c cmake -G "NMake Makefiles" .. +cmake -G "NMake Makefiles" -DUSE_OPENSSL=OFF -DUSE_MBEDTLS=ON -DBUILD_TEST=TRUE -DEXT_PTHREAD_INCLUDE_DIR="C:/tools/pthreads-w32-2-9-1-release/Pre-built.2/include/" -DEXT_PTHREAD_LIBRARIES="C:/tools/pthreads-w32-2-9-1-release/Pre-built.2/lib/x64/libpthreadGC2.a" .. +nmake \ No newline at end of file diff --git a/.github/build_windows_openssl.bat b/.github/build_windows_openssl.bat new file mode 100644 index 0000000000..c168aa96b4 --- /dev/null +++ b/.github/build_windows_openssl.bat @@ -0,0 +1,6 @@ +call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x86_amd64 +mkdir build +cd build +cmd.exe /c cmake -G "NMake Makefiles" .. +cmake -G "NMake Makefiles" -DBUILD_TEST=TRUE -DEXT_PTHREAD_INCLUDE_DIR="C:/tools/pthreads-w32-2-9-1-release/Pre-built.2/include/" -DEXT_PTHREAD_LIBRARIES="C:/tools/pthreads-w32-2-9-1-release/Pre-built.2/lib/x64/libpthreadGC2.a" .. +nmake \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9e77b11b21..158c07fe91 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,10 +11,10 @@ on: - master jobs: clang-format-check: - runs-on: macos-latest + runs-on: macos-11 steps: - name: Clone repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Install clang-format run: | brew install clang-format @@ -23,59 +23,100 @@ jobs: run: | bash scripts/check-clang.sh mac-os-build-clang: - runs-on: macos-latest + runs-on: macos-11 env: CC: /usr/bin/clang CXX: /usr/bin/clang++ AWS_KVS_LOG_LEVEL: 2 LDFLAGS: -L/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib CPATH: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/ + permissions: + id-token: write + contents: read steps: - name: Clone repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v2 + with: + role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }} + aws-region: ${{ secrets.AWS_REGION }} - name: Build repository run: | mkdir build && cd build cmake .. -DBUILD_TEST=TRUE -DCOMPILER_WARNINGS=TRUE make + - name: Run tests + run: | + cd build ./tst/webrtc_client_test mac-os-build-gcc: - runs-on: macos-10.15 + runs-on: macos-11 env: CC: gcc CXX: g++ AWS_KVS_LOG_LEVEL: 2 + permissions: + id-token: write + contents: read steps: - name: Clone repository - uses: actions/checkout@v2 - - name: Build repository and run tests + uses: actions/checkout@v3 + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v2 + with: + role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }} + aws-region: ${{ secrets.AWS_REGION }} + - name: Build repository run: | mkdir build && cd build cmake .. -DBUILD_TEST=TRUE -DCOMPILER_WARNINGS=TRUE make + - name: Run tests + run: | + cd build ./tst/webrtc_client_test static-build-mac: - runs-on: macos-latest + runs-on: macos-11 env: AWS_KVS_LOG_LEVEL: 2 LDFLAGS: -L/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib CPATH: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/ + permissions: + id-token: write + contents: read steps: - name: Clone repository - uses: actions/checkout@v2 - - name: Build repository and run tests + uses: actions/checkout@v3 + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v2 + with: + role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }} + aws-region: ${{ secrets.AWS_REGION }} + - name: Build repository run: | mkdir build && cd build cmake .. -DBUILD_STATIC_LIBS=TRUE -DBUILD_TEST=TRUE make - ./tst/webrtc_client_test + - name: Run tests + run: | + cd build + ./tst/webrtc_client_test linux-gcc-code-coverage: - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 env: AWS_KVS_LOG_LEVEL: 2 + permissions: + id-token: write + contents: read steps: - name: Clone repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v2 + with: + role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }} + aws-region: ${{ secrets.AWS_REGION }} - name: Build repository run: | sudo sh -c 'echo 0 > /proc/sys/net/ipv6/conf/all/disable_ipv6' @@ -89,20 +130,28 @@ jobs: for test_file in $(find CMakeFiles/kvsWebrtcClient.dir CMakeFiles/kvsWebrtcSignalingClient.dir -name '*.gcno'); do gcov $test_file; done bash <(curl -s https://codecov.io/bash) address-sanitizer: - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 env: ASAN_OPTIONS: detect_odr_violation=0:detect_leaks=1 LSAN_OPTIONS: suppressions=../tst/suppressions/LSAN.supp - CC: clang-7 - CXX: clang++-7 + CC: clang + CXX: clang++ AWS_KVS_LOG_LEVEL: 2 + permissions: + id-token: write + contents: read steps: - name: Clone repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v2 + with: + role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }} + aws-region: ${{ secrets.AWS_REGION }} - name: Install dependencies run: | - sudo apt-get update - sudo apt-get -y install clang-7 + sudo apt clean && sudo apt update + sudo apt-get -y install clang - name: Build repository run: | # TODO: Remove the following line. This is only a workaround for enabling IPv6, https://github.com/travis-ci/travis-ci/issues/8891. @@ -111,21 +160,32 @@ jobs: cmake .. -DBUILD_TEST=TRUE -DADDRESS_SANITIZER=TRUE make ulimit -c unlimited -S + - name: Run tests + run: | + cd build timeout --signal=SIGABRT 60m ./tst/webrtc_client_test undefined-behavior-sanitizer: - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 env: UBSAN_OPTIONS: halt_on_error=1 - CC: clang-7 - CXX: clang++-7 + CC: clang + CXX: clang++ AWS_KVS_LOG_LEVEL: 2 + permissions: + id-token: write + contents: read steps: - name: Clone repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v2 + with: + role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }} + aws-region: ${{ secrets.AWS_REGION }} - name: Install dependencies run: | - sudo apt-get update - sudo apt-get -y install clang-7 + sudo apt clean && sudo apt update + sudo apt-get -y install clang - name: Build repository run: | # TODO: Remove the following line. This is only a workaround for enabling IPv6, https://github.com/travis-ci/travis-ci/issues/8891. @@ -134,7 +194,10 @@ jobs: cmake .. -DBUILD_TEST=TRUE -DUNDEFINED_BEHAVIOR_SANITIZER=TRUE make ulimit -c unlimited -S - timeout --signal=SIGABRT 60m ./tst/webrtc_client_test + - name: Run tests + run: | + cd build + timeout --signal=SIGABRT 60m ./tst/webrtc_client_test # memory-sanitizer: # runs-on: ubuntu-18.04 # env: @@ -143,10 +206,10 @@ jobs: # AWS_KVS_LOG_LEVEL: 2 # steps: # - name: Clone repository - # uses: actions/checkout@v2 + # uses: actions/checkout@v3 # - name: Install dependencies # run: | - # sudo apt-get update + # sudo apt clean && sudo apt update # sudo apt-get -y install clang-7 # - name: Build repository # run: | @@ -155,21 +218,29 @@ jobs: # cmake .. -DMEMORY_SANITIZER=TRUE -DBUILD_TEST=TRUE # make # ulimit -c unlimited -S - # timeout --signal=SIGABRT 60m ./tst/webrtc_client_test + # timeout --signal=SIGABRT 60m build/tst/webrtc_client_test thread-sanitizer: - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 env: - TSAN_OPTIONS: halt_on_error=1:suppressions=../tst/suppressions/TSAN.supp - CC: clang-7 - CXX: clang++-7 + TSAN_OPTIONS: second_deadlock_stack=1:halt_on_error=1:suppressions=../tst/suppressions/TSAN.supp + CC: clang + CXX: clang++ AWS_KVS_LOG_LEVEL: 2 + permissions: + id-token: write + contents: read steps: - name: Clone repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v2 + with: + role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }} + aws-region: ${{ secrets.AWS_REGION }} - name: Install dependencies run: | - sudo apt-get update - sudo apt-get -y install clang-7 + sudo apt clean && sudo apt update + sudo apt-get -y install clang - name: Build repository run: | sudo sh -c 'echo 0 > /proc/sys/net/ipv6/conf/all/disable_ipv6' @@ -177,17 +248,29 @@ jobs: cmake .. -DBUILD_TEST=TRUE -DTHREAD_SANITIZER=TRUE make ulimit -c unlimited -S + - name: Run tests + run: | + cd build timeout --signal=SIGABRT 60m ./tst/webrtc_client_test linux-gcc-4_4: - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 env: AWS_KVS_LOG_LEVEL: 2 CC: gcc-4.4 + permissions: + id-token: write + contents: read steps: - name: Clone repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v2 + with: + role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }} + aws-region: ${{ secrets.AWS_REGION }} - name: Install deps run: | + sudo apt clean && sudo apt update sudo sh -c 'echo 0 > /proc/sys/net/ipv6/conf/all/disable_ipv6' sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test sudo add-apt-repository 'deb http://archive.ubuntu.com/ubuntu/ trusty main' @@ -201,37 +284,52 @@ jobs: cmake .. -DBUILD_TEST=TRUE make ulimit -c unlimited -S + - name: Run tests + run: | + cd build timeout --signal=SIGABRT 60m ./tst/webrtc_client_test static-build-linux: - runs-on: ubuntu-18.04 - container: - image: alpine:latest + runs-on: ubuntu-20.04 + container: + image: alpine:3.15.4 env: CC: gcc CXX: g++ AWS_KVS_LOG_LEVEL: 2 + permissions: + id-token: write + contents: read steps: - name: Clone repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Install dependencies run: | apk update apk upgrade apk add alpine-sdk cmake clang linux-headers perl bash openssl-dev - name: Build Repository - run: | + run: | mkdir build && cd build cmake .. -DBUILD_STATIC_LIBS=TRUE -DBUILD_TEST=TRUE make mbedtls-ubuntu-gcc: - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 env: AWS_KVS_LOG_LEVEL: 2 + permissions: + id-token: write + contents: read steps: - name: Clone repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v2 + with: + role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }} + aws-region: ${{ secrets.AWS_REGION }} - name: Install deps run: | + sudo apt clean && sudo apt update sudo sh -c 'echo 0 > /proc/sys/net/ipv6/conf/all/disable_ipv6' sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test sudo add-apt-repository 'deb http://archive.ubuntu.com/ubuntu/ trusty main' @@ -245,20 +343,31 @@ jobs: cmake .. -DBUILD_TEST=TRUE -DUSE_OPENSSL=OFF -DUSE_MBEDTLS=ON make ulimit -c unlimited -S + - name: Run tests + run: | + cd build timeout --signal=SIGABRT 60m ./tst/webrtc_client_test mbedtls-ubuntu-clang: - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 env: - CC: clang-7 - CXX: clang++-7 + CC: clang + CXX: clang++ AWS_KVS_LOG_LEVEL: 2 + permissions: + id-token: write + contents: read steps: - name: Clone repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v2 + with: + role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }} + aws-region: ${{ secrets.AWS_REGION }} - name: Install dependencies run: | - sudo apt-get update - sudo apt-get -y install clang-7 + sudo apt clean && sudo apt update + sudo apt-get -y install clang - name: Build repository run: | sudo sh -c 'echo 0 > /proc/sys/net/ipv6/conf/all/disable_ipv6' @@ -266,10 +375,13 @@ jobs: cmake .. -DBUILD_TEST=TRUE -DUSE_OPENSSL=OFF -DUSE_MBEDTLS=ON make ulimit -c unlimited -S + - name: Run tests + run: | + cd build timeout --signal=SIGABRT 60m ./tst/webrtc_client_test sample-check: if: github.repository == 'awslabs/amazon-kinesis-video-streams-webrtc-sdk-c' - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 env: AWS_KVS_LOG_LEVEL: 2 permissions: @@ -277,12 +389,11 @@ jobs: contents: read steps: - name: Clone repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v1 + uses: aws-actions/configure-aws-credentials@v2 with: role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }} - role-session-name: ${{ secrets.AWS_ROLE_SESSION_NAME }} aws-region: ${{ secrets.AWS_REGION }} - name: Build repository run: | @@ -293,12 +404,20 @@ jobs: cd .. ./scripts/check-sample.sh ubuntu-os-build: - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 env: AWS_KVS_LOG_LEVEL: 2 + permissions: + id-token: write + contents: read steps: - name: Clone repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v2 + with: + role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }} + aws-region: ${{ secrets.AWS_REGION }} - name: Build repository run: | # TODO: Remove the following line. This is only a workaround for enabling IPv6, https://github.com/travis-ci/travis-ci/issues/8891. @@ -306,36 +425,102 @@ jobs: mkdir build && cd build cmake .. -DBUILD_TEST=TRUE make - ./tst/webrtc_client_test - # windows-msvc: - # runs-on: windows-2019 - # permissions: - # id-token: write - # contents: read + - name: Run tests + run: | + cd build + timeout --signal=SIGABRT 60m ./tst/webrtc_client_test + windows-msvc-openssl: + runs-on: windows-2022 + env: + AWS_KVS_LOG_LEVEL: 1 + permissions: + id-token: write + contents: read + steps: + - name: Clone repository + uses: actions/checkout@v3 + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v2 + with: + role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }} + aws-region: ${{ secrets.AWS_REGION }} + - name: Move cloned repo + shell: powershell + run: | + mkdir C:\webrtc + Move-Item -Path "D:\a\amazon-kinesis-video-streams-webrtc-sdk-c\amazon-kinesis-video-streams-webrtc-sdk-c\*" -Destination "C:\webrtc" + - name: Install dependencies + shell: powershell + run: | + choco install gstreamer --version=1.16.2 + choco install gstreamer-devel --version=1.16.2 + curl.exe -o C:\tools\pthreads-w32-2-9-1-release.zip ftp://sourceware.org/pub/pthreads-win32/pthreads-w32-2-9-1-release.zip + mkdir C:\tools\pthreads-w32-2-9-1-release\ + Expand-Archive -Path C:\tools\pthreads-w32-2-9-1-release.zip -DestinationPath C:\tools\pthreads-w32-2-9-1-release + # - name: Build libwebsockets from source + # shell: powershell + # run: | + # $env:Path += ';C:\Strawberry\perl\site\bin;C:\Strawberry\perl\bin;C:\Strawberry\c\bin;C:\Program Files\NASM;D:\a\amazon-kinesis-video-streams-webrtc-sdk-c\amazon-kinesis-video-streams-webrtc-sdk-c\open-source\bin;C:\tools\pthreads-w32-2-9-1-release\Pre-built.2\lib\x64;C:\tools\pthreads-w32-2-9-1-release\Pre-built.2\include' + # git config --system core.longpaths true + # cd C:\tools\ + # git clone https://github.com/warmcat/libwebsockets.git + # git checkout v4.2.2 + # cd libwebsockets + # mkdir build + # cd build + # cmake .. -DLWS_HAVE_PTHREAD_H=1 -DLWS_EXT_PTHREAD_INCLUDE_DIR="C:\\tools\\pthreads-w32-2-9-1-release\\Pre-built.2\\include" -DLWS_EXT_PTHREAD_LIBRARIES="C:\\tools\\pthreads-w32-2-9-1-release\\Pre-built.2\\lib\\x64\\libpthreadGC2.a" -DLWS_WITH_MINIMAL_EXAMPLES=1 -DLWS_OPENSSL_INCLUDE_DIRS="C:\\Program Files\\OpenSSL\\include" -DLWS_OPENSSL_LIBRARIES="C:\\Program Files\\OpenSSL\\lib\\libssl.lib;C:\\Program Files\\OpenSSL\\lib\\libcrypto.lib" + # cmake --build . --config DEBUG + - name: Build repository + shell: powershell + run: | + cd C:\webrtc + git config --system core.longpaths true + .github\build_windows_openssl.bat + - name: Run tests + shell: powershell + run: | + $env:Path += ';C:\webrtc\open-source\bin;C:\tools\pthreads-w32-2-9-1-release\Pre-built.2\dll\x64' + & "C:\webrtc\build\tst\webrtc_client_test.exe" --gtest_filter="-DataChannelFunctionalityTest.*:IceApiTest.*:IceFunctionalityTest.*:PeerConnectionFunctionalityTest.*:SignalingApiFunctionalityTest.*:TurnConnectionFunctionalityTest.*:RtpFunctionalityTest.marshallUnmarshallH264Data:RtpFunctionalityTest.packingUnpackingVerifySameH264Frame:RtcpFunctionalityTest.onRtcpPacketCompound:RtcpFunctionalityTest.twcc3" + # windows-msvc-mbedtls: + # runs-on: windows-2022 + # env: + # AWS_KVS_LOG_LEVEL: 7 # steps: - # - name: Setup MSVC - # uses: ilammy/msvc-dev-cmd@v1 # - name: Clone repository - # uses: actions/checkout@v2 - # - name: Build and run + # uses: actions/checkout@v3 + # - name: Move cloned repo + # shell: powershell + # run: | + # mkdir D:\a\webrtc + # Move-Item -Path "D:\a\amazon-kinesis-video-streams-webrtc-sdk-c\amazon-kinesis-video-streams-webrtc-sdk-c\*" -Destination "D:\a\webrtc" + # cd D:\a\webrtc + # dir + # - name: Install dependencies + # shell: powershell # run: | - # choco install nasm strawberryperl - # $env:Path += ';C:\Strawberry\perl\site\bin;C:\Strawberry\perl\bin;C:\Strawberry\c\bin;C:\Program Files\NASM;D:\a\amazon-kinesis-video-streams-producer-c\amazon-kinesis-video-streams-producer-c\open-source\lib;D:\a\amazon-kinesis-video-streams-producer-c\amazon-kinesis-video-streams-producer-c\open-source\bin' + # choco install gstreamer --version=1.16.2 + # choco install gstreamer-devel --version=1.16.2 + # curl.exe -o C:\tools\pthreads-w32-2-9-1-release.zip ftp://sourceware.org/pub/pthreads-win32/pthreads-w32-2-9-1-release.zip + # mkdir C:\tools\pthreads-w32-2-9-1-release\ + # Expand-Archive -Path C:\tools\pthreads-w32-2-9-1-release.zip -DestinationPath C:\tools\pthreads-w32-2-9-1-release + # - name: Build repository + # shell: powershell + # run: | + # cd D:\a\webrtc # git config --system core.longpaths true - # .github/build_windows.bat - # cd tst && .\webrtc_client_test.exe --gtest_filter="-DataChannelFunctionalityTest.*:IceApiTest.*:IceFunctionalityTest.*:PeerConnectionFunctionalityTest.*:SignalingApiFunctionalityTest.*:TurnConnectionFunctionalityTest.*:RtpFunctionalityTest.marshallUnmarshallH264Data:RtpFunctionalityTest.packingUnpackingVerifySameH264Frame:RtcpFunctionalityTest.onRtcpPacketCompound:RtcpFunctionalityTest.twcc3" + # .github\build_windows_mbedtls.bat arm64-cross-compilation: - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 env: CC: aarch64-linux-gnu-gcc CXX: aarch64-linux-gnu-g++ steps: - name: Install dependencies run: | - sudo apt update + sudo apt clean && sudo apt update sudo apt-get -y install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu binutils-aarch64-linux-gnu - name: Clone repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Build Repository run: | sudo sh -c 'echo 0 > /proc/sys/net/ipv6/conf/all/disable_ipv6' @@ -343,17 +528,17 @@ jobs: cmake .. -DBUILD_OPENSSL=TRUE -DBUILD_OPENSSL_PLATFORM=linux-generic64 -DBUILD_LIBSRTP_HOST_PLATFORM=x86_64-unknown-linux-gnu -DBUILD_LIBSRTP_DESTINATION_PLATFORM=arm-unknown-linux-uclibcgnueabi make linux-aarch64-cross-compilation: - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 env: CC: aarch64-linux-gnu-gcc CXX: aarch64-linux-gnu-g++ steps: - name: Install dependencies run: | - sudo apt update + sudo apt clean && sudo apt update sudo apt-get -y install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu binutils-aarch64-linux-gnu - name: Clone repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Build Repository run: | sudo sh -c 'echo 0 > /proc/sys/net/ipv6/conf/all/disable_ipv6' @@ -361,20 +546,20 @@ jobs: cmake .. -DBUILD_OPENSSL=TRUE -DBUILD_OPENSSL_PLATFORM=linux-aarch64 -DBUILD_LIBSRTP_HOST_PLATFORM=x86_64-unknown-linux-gnu -DBUILD_LIBSRTP_DESTINATION_PLATFORM=arm-unknown-linux-uclibcgnueabi make arm32-cross-compilation: - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 env: CC: arm-linux-gnueabi-gcc CXX: arm-linux-gnueabi-g++ steps: - name: Install dependencies run: | - sudo apt update + sudo apt clean && sudo apt update sudo apt-get -y install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi binutils-arm-linux-gnueabi - name: Clone repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Build Repository run: | sudo sh -c 'echo 0 > /proc/sys/net/ipv6/conf/all/disable_ipv6' mkdir build && cd build cmake .. -DBUILD_OPENSSL=TRUE -DBUILD_OPENSSL_PLATFORM=linux-generic32 -DBUILD_LIBSRTP_HOST_PLATFORM=x86_64-unknown-linux-gnu -DBUILD_LIBSRTP_DESTINATION_PLATFORM=arm-unknown-linux-uclibcgnueabi - make + make \ No newline at end of file diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml index dd7093eacb..368292b147 100644 --- a/.github/workflows/codecov.yml +++ b/.github/workflows/codecov.yml @@ -11,11 +11,19 @@ on: jobs: linux-gcc-codecov: runs-on: ubuntu-latest + permissions: + id-token: write + contents: read steps: - name: Fetch - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 2 + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v2 + with: + role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }} + aws-region: ${{ secrets.AWS_REGION }} - name: Run code coverage run: | mkdir build diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index ec9d11cfb0..23e91aaf11 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -22,11 +22,11 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v1 + uses: github/codeql-action/init@v2 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -37,7 +37,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v1 + uses: github/codeql-action/autobuild@v2 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -51,4 +51,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/doxygen-gh-pages.yml b/.github/workflows/doxygen-gh-pages.yml index 488b4fb1fd..d8a2393618 100644 --- a/.github/workflows/doxygen-gh-pages.yml +++ b/.github/workflows/doxygen-gh-pages.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Install requirements run: sudo apt-get install doxygen graphviz -y diff --git a/.github/workflows/pr-desc-lint.yml b/.github/workflows/pr-desc-lint.yml new file mode 100644 index 0000000000..0fe1117916 --- /dev/null +++ b/.github/workflows/pr-desc-lint.yml @@ -0,0 +1,56 @@ +name: PR Description Check + +on: + pull_request: + branches: + - develop + - master + types: + - opened + - synchronize + - reopened + - edited + +jobs: + check-description: + runs-on: macos-latest + steps: + - name: Install GitHub CLI + run: | + brew install gh + + - name: Check PR Description + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + pr_description=$(gh pr view https://github.com/${GITHUB_REPOSITORY}/pull/${{ github.event.pull_request.number }} --json body -q ".body") + error_occurred=0 + # Define minimum character count for each section + MIN_CHARS=25 + + # Extract contents + # Extract contents + what_changed=$(echo "$pr_description" | sed -n -e '/\*What was changed?\*/,/\*/p' | sed '$d' | sed '1d') + why_changed=$(echo "$pr_description" | sed -n -e '/\*Why was it changed?\*/,/\*/p' | sed '$d' | sed '1d') + how_changed=$(echo "$pr_description" | sed -n -e '/\*How was it changed?\*/,/\*/p' | sed '$d' | sed '1d') + testing_done=$(echo "$pr_description" | sed -n -e '/\*What testing was done for the changes?\*/,/\*/p' | sed '$d' | sed '1d') + + if [[ ${#what_changed} -lt $MIN_CHARS ]]; then + echo "PR description for what changed section is either missing or too short." + error_occurred=1 + fi + if [[ ${#why_changed} -lt $MIN_CHARS ]]; then + echo "PR description for why it changed section is either missing or too short." + error_occurred=1 + fi + if [[ ${#how_changed} -lt $MIN_CHARS ]]; then + echo "PR description for how was it changed section is either missing or too short." + error_occurred=1 + fi + if [[ ${#testing_done} -lt $MIN_CHARS ]]; then + echo "PR description for testing section are either missing or too short." + error_occurred=1 + fi + if [[ $error_occurred -eq 1 ]]; then + exit 1 + fi diff --git a/.gitignore b/.gitignore index ab8c440fa0..6cd9353247 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ open-source/ outputs tags CMakeLists.txt.user +*.swp diff --git a/CMake/Dependencies/libbenchmark-CMakeLists.txt b/CMake/Dependencies/libbenchmark-CMakeLists.txt index 6e05e20ce2..21b375e398 100644 --- a/CMake/Dependencies/libbenchmark-CMakeLists.txt +++ b/CMake/Dependencies/libbenchmark-CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8) +cmake_minimum_required(VERSION 3.6.3) project(libbenchmark-download NONE) diff --git a/CMake/Dependencies/libgperftools-CMakeLists.txt b/CMake/Dependencies/libgperftools-CMakeLists.txt index 721cad6657..96bf6b7de4 100644 --- a/CMake/Dependencies/libgperftools-CMakeLists.txt +++ b/CMake/Dependencies/libgperftools-CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8) +cmake_minimum_required(VERSION 3.6.3) project(libgperftools-download NONE) diff --git a/CMake/Dependencies/libgtest-CMakeLists.txt b/CMake/Dependencies/libgtest-CMakeLists.txt index ebf7bf3be0..916087e762 100644 --- a/CMake/Dependencies/libgtest-CMakeLists.txt +++ b/CMake/Dependencies/libgtest-CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8) +cmake_minimum_required(VERSION 3.6.3) project(libgtest-download NONE) @@ -6,7 +6,7 @@ include(ExternalProject) ExternalProject_Add(libgtest-download GIT_REPOSITORY https://github.com/google/googletest.git - GIT_TAG release-1.8.1 + GIT_TAG release-1.12.1 PREFIX ${CMAKE_CURRENT_BINARY_DIR}/build CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${OPEN_SRC_INSTALL_PREFIX} diff --git a/CMake/Dependencies/libjsmn-CMakeLists.txt b/CMake/Dependencies/libjsmn-CMakeLists.txt index c5940ca177..ef68de8866 100644 --- a/CMake/Dependencies/libjsmn-CMakeLists.txt +++ b/CMake/Dependencies/libjsmn-CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8) +cmake_minimum_required(VERSION 3.6.3) project(libjsmn-download NONE) diff --git a/CMake/Dependencies/libjsmn-add-cmakelists.patch b/CMake/Dependencies/libjsmn-add-cmakelists.patch index 5fe1aea26d..133c61d9d5 100644 --- a/CMake/Dependencies/libjsmn-add-cmakelists.patch +++ b/CMake/Dependencies/libjsmn-add-cmakelists.patch @@ -4,7 +4,7 @@ index 0000000..f4a1d44 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,11 @@ -+cmake_minimum_required(VERSION 2.8) ++cmake_minimum_required(VERSION 3.6.3) +project(jsmn C) + + diff --git a/CMake/Dependencies/libkvsCommonLws-CMakeLists.txt b/CMake/Dependencies/libkvsCommonLws-CMakeLists.txt index 6db57e03db..b68c3c6384 100644 --- a/CMake/Dependencies/libkvsCommonLws-CMakeLists.txt +++ b/CMake/Dependencies/libkvsCommonLws-CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8) +cmake_minimum_required(VERSION 3.6.3) project(libkvsCommonLws-download NONE) @@ -6,7 +6,7 @@ include(ExternalProject) ExternalProject_Add(libkvsCommonLws-download GIT_REPOSITORY https://github.com/awslabs/amazon-kinesis-video-streams-producer-c.git - GIT_TAG c7fce9e06021452ff3c42dc70c8360606b22ad53 + GIT_TAG 7d1b76f53680c1e23afb6f35f0cca97ccdb35e3f PREFIX ${CMAKE_CURRENT_BINARY_DIR}/build CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${OPEN_SRC_INSTALL_PREFIX} diff --git a/CMake/Dependencies/libmbedtls-CMakeLists.txt b/CMake/Dependencies/libmbedtls-CMakeLists.txt index a2700eed4d..66ae44d0e0 100644 --- a/CMake/Dependencies/libmbedtls-CMakeLists.txt +++ b/CMake/Dependencies/libmbedtls-CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8) +cmake_minimum_required(VERSION 3.6.3) project(libmbedtls-download NONE) diff --git a/CMake/Dependencies/libopenssl-CMakeLists.txt b/CMake/Dependencies/libopenssl-CMakeLists.txt index cf95d01224..1180b72f9c 100644 --- a/CMake/Dependencies/libopenssl-CMakeLists.txt +++ b/CMake/Dependencies/libopenssl-CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8) +cmake_minimum_required(VERSION 3.6.3) project(libopenssl-download NONE) @@ -17,16 +17,16 @@ else() endif() if (DEFINED BUILD_OPENSSL_PLATFORM AND NOT BUILD_OPENSSL_PLATFORM STREQUAL OFF) - SET(CONFIGURE_COMMAND ${CMAKE_CURRENT_BINARY_DIR}/build/src/project_libopenssl/Configure ${OPENSSL_EXTRA} no-async --prefix=${OPEN_SRC_INSTALL_PREFIX} --openssldir=${OPEN_SRC_INSTALL_PREFIX} ${BUILD_OPENSSL_PLATFORM}) + SET(CONFIGURE_COMMAND ${CMAKE_CURRENT_BINARY_DIR}/build/src/project_libopenssl/Configure ${OPENSSL_EXTRA} no-async --prefix=${OPEN_SRC_INSTALL_PREFIX} --openssldir=${OPEN_SRC_INSTALL_PREFIX} ${BUILD_OPENSSL_PLATFORM} -Wno-nullability-completeness -Wno-expansion-to-defined) else() - SET(CONFIGURE_COMMAND ${CMAKE_CURRENT_BINARY_DIR}/build/src/project_libopenssl/config ${OPENSSL_EXTRA} --prefix=${OPEN_SRC_INSTALL_PREFIX} --openssldir=${OPEN_SRC_INSTALL_PREFIX}) + SET(CONFIGURE_COMMAND ${CMAKE_CURRENT_BINARY_DIR}/build/src/project_libopenssl/config ${OPENSSL_EXTRA} --prefix=${OPEN_SRC_INSTALL_PREFIX} --openssldir=${OPEN_SRC_INSTALL_PREFIX} -Wno-nullability-completeness -Wno-expansion-to-defined) endif() endif() include(ExternalProject) ExternalProject_Add(project_libopenssl GIT_REPOSITORY https://github.com/openssl/openssl.git - GIT_TAG OpenSSL_1_1_1g + GIT_TAG OpenSSL_1_1_1t PREFIX ${CMAKE_CURRENT_BINARY_DIR}/build CONFIGURE_COMMAND ${CONFIGURE_COMMAND} BUILD_COMMAND ${MAKE_EXE} diff --git a/CMake/Dependencies/libsrtp-CMakeLists.txt b/CMake/Dependencies/libsrtp-CMakeLists.txt index b2491d786c..6ba8ab0ed3 100644 --- a/CMake/Dependencies/libsrtp-CMakeLists.txt +++ b/CMake/Dependencies/libsrtp-CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8) +cmake_minimum_required(VERSION 3.6.3) project(libsrtp-download NONE) @@ -52,6 +52,7 @@ ExternalProject_Add(project_libsrtp -D ENABLE_OPENSSL=${LIBSRTP_ENABLE_OPENSSL} -D BUILD_SHARED_LIBS=${LIBSRTP_SHARED_LIBS} -D OPENSSL_ROOT_DIR=${OPEN_SRC_INSTALL_PREFIX} + -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} CONFIGURE_COMMAND ${CONFIGURE_COMMAND} TEST_COMMAND "" ) diff --git a/CMake/Dependencies/libusrsctp-CMakeLists.txt b/CMake/Dependencies/libusrsctp-CMakeLists.txt index bae5c8a435..7ccc63f5bf 100644 --- a/CMake/Dependencies/libusrsctp-CMakeLists.txt +++ b/CMake/Dependencies/libusrsctp-CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8) +cmake_minimum_required(VERSION 3.6.3) project(libusrsctp-download NONE) @@ -8,7 +8,9 @@ ExternalProject_Add(project_libusrsctp GIT_REPOSITORY https://github.com/sctplab/usrsctp.git GIT_TAG 1ade45cbadfd19298d2c47dc538962d4425ad2dd PREFIX ${CMAKE_CURRENT_BINARY_DIR}/build - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${OPEN_SRC_INSTALL_PREFIX} -DCMAKE_C_FLAGS=-fPIC -Dsctp_werror=0 + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${OPEN_SRC_INSTALL_PREFIX} + "-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} -fPIC" + -Dsctp_werror=0 BUILD_ALWAYS TRUE TEST_COMMAND "" ) diff --git a/CMake/Dependencies/libwebsockets-CMakeLists.txt b/CMake/Dependencies/libwebsockets-CMakeLists.txt index 5700a3e4a2..90bec7d553 100644 --- a/CMake/Dependencies/libwebsockets-CMakeLists.txt +++ b/CMake/Dependencies/libwebsockets-CMakeLists.txt @@ -1,18 +1,15 @@ -cmake_minimum_required(VERSION 2.8) +cmake_minimum_required(VERSION 3.6.3) project(libwebsocket-download NONE) SET(PATCH_COMMAND git apply --ignore-whitespace ${CMAKE_CURRENT_LIST_DIR}/libwebsockets-old-gcc-fix-cast-cmakelists.patch ${CMAKE_CURRENT_LIST_DIR}/libwebsockets-leak-pipe-fix.patch) include(ExternalProject) - if (BUILD_STATIC_LIBS) - set(LWS_WITH_STATIC 1) set(LWS_WITH_SHARED 0) else() - set(LWS_WITH_STATIC 0) set(LWS_WITH_SHARED 1) - if (USE_OPENSSL) + if (USE_OPENSSL AND NOT WIN32) find_package(OpenSSL REQUIRED) endif() endif() @@ -23,13 +20,23 @@ else() set(LWS_WITH_MBEDTLS ON) endif() +if (WIN32) + set(LWS_WITH_THREADPOOL ${LWS_WITH_THREADPOOL}) + set(LWS_EXT_PTHREAD_INCLUDE_DIR ${LWS_EXT_PTHREAD_INCLUDE_DIR}) + set(LWS_EXT_PTHREAD_LIBRARIES ${LWS_EXT_PTHREAD_LIBRARIES}) + set(LWS_OPENSSL_INCLUDE_DIRS ${LWS_OPENSSL_INCLUDE_DIRS}) + set(LWS_OPENSSL_LIBRARIES ${LWS_OPENSSL_LIBRARIES}) +endif() + ExternalProject_Add(project_libwebsockets GIT_REPOSITORY https://github.com/warmcat/libwebsockets.git GIT_TAG v4.2.2 PATCH_COMMAND ${PATCH_COMMAND} PREFIX ${CMAKE_CURRENT_BINARY_DIR}/build + LIST_SEPARATOR | CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${OPEN_SRC_INSTALL_PREFIX} + -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} -DLWS_WITH_HTTP2=1 -DLWS_HAVE_HMAC_CTX_new=1 -DLWS_HAVE_SSL_EXTRA_CHAIN_CERTS=1 @@ -37,21 +44,22 @@ ExternalProject_Add(project_libwebsockets -DLWS_HAVE_EVP_MD_CTX_free=1 -DLWS_WITHOUT_SERVER=1 -DLWS_WITHOUT_TESTAPPS=1 - -DLWS_WITH_THREADPOOL=1 -DLWS_WITHOUT_TEST_SERVER_EXTPOLL=1 -DLWS_WITHOUT_TEST_PING=1 -DLWS_WITHOUT_TEST_CLIENT=1 - -DLWS_WITH_STATIC=${LWS_WITH_STATIC} - -DLWS_WITH_SHARED=${LWS_WITH_SHARED} -DLWS_STATIC_PIC=1 + -DLWS_WITH_STATIC=1 + -DLWS_WITH_SHARED=${LWS_WITH_SHARED} + -DLWS_WITH_MBEDTLS=${LWS_WITH_MBEDTLS} + -DLWS_WITH_MINIMAL_EXAMPLES=1 + -DLWS_HAVE_PTHREAD_H=1 + -DLWS_WITH_THREADPOOL=${LWS_WITH_THREADPOOL} -DLWS_WITH_ZLIB=0 -DLWS_HAVE_EVENTFD=0 - -DLWS_WITH_MBEDTLS=${LWS_WITH_MBEDTLS} -# enable for debug output -DCMAKE_BUILD_TYPE=DEBUG - -DLWS_OPENSSL_INCLUDE_DIRS=${OPENSSL_INCLUDE_DIR} - -DLWS_OPENSSL_CRYPTO_LIBRARY=${OPENSSL_CRYPTO_LIBRARY} - -DLWS_OPENSSL_SSL_LIBRARY=${OPENSSL_SSL_LIBRARY} - -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} - BUILD_ALWAYS TRUE + -DLWS_EXT_PTHREAD_INCLUDE_DIR=${LWS_EXT_PTHREAD_INCLUDE_DIR} + -DLWS_EXT_PTHREAD_LIBRARIES=${LWS_EXT_PTHREAD_LIBRARIES} + -DLWS_OPENSSL_INCLUDE_DIRS=${LWS_OPENSSL_INCLUDE_DIRS} + -DLWS_OPENSSL_LIBRARIES=${LWS_OPENSSL_LIBRARIES} + BUILD_ALWAYS TRUE TEST_COMMAND "" -) +) \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index f3dc73f9e2..f466a1dab9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,8 @@ include(Utilities) include(CheckIncludeFiles) include(CheckFunctionExists) -project(KinesisVideoWebRTCClient LANGUAGES C) +# The version MUST be updated before every release +project(KinesisVideoWebRTCClient VERSION 1.8.0 LANGUAGES C) # User Flags option(ADD_MUCLIBC "Add -muclibc c flag" OFF) @@ -30,6 +31,11 @@ option(THREAD_SANITIZER "Build with ThreadSanitizer." OFF) option(UNDEFINED_BEHAVIOR_SANITIZER "Build with UndefinedBehaviorSanitizer." OFF) option(LINK_PROFILER "Link gperftools profiler" OFF) +if(WIN32) + set(EXT_PTHREAD_INCLUDE_DIR "" CACHE PATH "Path to the PThread dir") + set(EXT_PTHREAD_LIBRARIES "" CACHE FILEPATH "Path to PThread libraries") +endif() + execute_process( COMMAND git rev-parse HEAD WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} @@ -37,6 +43,7 @@ execute_process( OUTPUT_STRIP_TRAILING_WHITESPACE) add_definitions(-DSDK_VERSION=\"${GIT_COMMIT_HASH}\") +add_definitions(-DVERSION_STRING=\"${PROJECT_VERSION}\") add_definitions(-DDETECTED_GIT_HASH) if(NOT OPEN_SRC_INSTALL_PREFIX OR OPEN_SRC_INSTALL_PREFIX STREQUAL "") @@ -79,6 +86,10 @@ endif() set(KINESIS_VIDEO_WEBRTC_CLIENT_SRC "${CMAKE_CURRENT_SOURCE_DIR}") +if(ADD_MUCLIBC) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -muclibc") +endif() + message(STATUS "Kinesis Video WebRTC Client path is ${KINESIS_VIDEO_WEBRTC_CLIENT_SRC}") message(STATUS "dependencies install path is ${OPEN_SRC_INSTALL_PREFIX}") @@ -92,8 +103,8 @@ if(USE_OPENSSL) elseif(USE_MBEDTLS) add_definitions(-DKVS_USE_MBEDTLS) # FIXME: there's probably a better way to inject MBEDTLS_USER_CONFIG_FILE flag without mutating the global CMAKE_C_FLAGS and CMAKE_CXX_FLAGS - set(CMAKE_C_FLAGS "-I${CMAKE_CURRENT_SOURCE_DIR}/configs -DMBEDTLS_USER_CONFIG_FILE='' ${CMAKE_C_FLAGS}") - set(CMAKE_CXX_FLAGS "-I${CMAKE_CURRENT_SOURCE_DIR}/configs -DMBEDTLS_USER_CONFIG_FILE='' ${CMAKE_CXX_FLAGS}") + set(CMAKE_C_FLAGS "-I${CMAKE_CURRENT_SOURCE_DIR}/configs -DMBEDTLS_USER_CONFIG_FILE=\"\" ${CMAKE_C_FLAGS}") + set(CMAKE_CXX_FLAGS "-I${CMAKE_CURRENT_SOURCE_DIR}/configs -DMBEDTLS_USER_CONFIG_FILE=\"\" ${CMAKE_CXX_FLAGS}") endif() if(BUILD_DEPENDENCIES) @@ -121,16 +132,35 @@ if(BUILD_DEPENDENCIES) set(OPENSSL_ROOT_DIR ${OPEN_SRC_INSTALL_PREFIX}) elseif(USE_MBEDTLS) set(BUILD_ARGS -DBUILD_STATIC_LIBS=${BUILD_STATIC_LIBS} - -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}) + "-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} -std=c99") build_dependency(mbedtls ${BUILD_ARGS}) endif() - set(BUILD_ARGS -DBUILD_STATIC_LIBS=${BUILD_STATIC_LIBS} - -DOPENSSL_DIR=${OPEN_SRC_INSTALL_PREFIX} - -DUSE_OPENSSL=${USE_OPENSSL} - -DUSE_MBEDTLS=${USE_MBEDTLS} - -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}) + if(WIN32) + set(OPENSSL_INCLUDE_DIRS "${OPEN_SRC_INSTALL_PREFIX}/include/") + set(OPENSSL_CRYPTO_LIBRARY "${OPEN_SRC_INSTALL_PREFIX}/lib/libcrypto.lib") + set(OPENSSL_SSL_LIBRARY "${OPEN_SRC_INSTALL_PREFIX}/lib/libssl.lib") + set(OPENSSL_LIBRARIES ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY}) + string(REPLACE ";" "|" OPENSSL_LIBRARIES_ALT_SEP "${OPENSSL_LIBRARIES}") + set(BUILD_ARGS -DBUILD_STATIC_LIBS=${BUILD_STATIC_LIBS} + -DUSE_OPENSSL=${USE_OPENSSL} + -DUSE_MBEDTLS=${USE_MBEDTLS} + -DLWS_EXT_PTHREAD_INCLUDE_DIR=${EXT_PTHREAD_INCLUDE_DIR} + -DLWS_EXT_PTHREAD_LIBRARIES=${EXT_PTHREAD_LIBRARIES} + -DLWS_OPENSSL_INCLUDE_DIRS=${OPENSSL_INCLUDE_DIRS} + -DLWS_OPENSSL_LIBRARIES=${OPENSSL_LIBRARIES_ALT_SEP} + -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}) + else() + set(BUILD_ARGS -DBUILD_STATIC_LIBS=${BUILD_STATIC_LIBS} + -DOPENSSL_DIR=${OPEN_SRC_INSTALL_PREFIX} + -DUSE_OPENSSL=${USE_OPENSSL} + -DUSE_MBEDTLS=${USE_MBEDTLS} + -DLWS_OPENSSL_CRYPTO_LIBRARY=${OPENSSL_CRYPTO_LIBRARY} + -DLWS_OPENSSL_SSL_LIBRARY=${OPENSSL_SSL_LIBRARY} + -DLWS_OPENSSL_INCLUDE_DIRS=${OPENSSL_INCLUDE_DIR} + -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}) + endif() build_dependency(websockets ${BUILD_ARGS}) set(BUILD_ARGS @@ -140,10 +170,14 @@ if(BUILD_DEPENDENCIES) -DBUILD_LIBSRTP_DESTINATION_PLATFORM=${BUILD_LIBSRTP_DESTINATION_PLATFORM} -DUSE_OPENSSL=${USE_OPENSSL} -DUSE_MBEDTLS=${USE_MBEDTLS} - ) + -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}) + build_dependency(srtp ${BUILD_ARGS}) - build_dependency(usrsctp) + set(BUILD_ARGS + -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}) + + build_dependency(usrsctp ${BUILD_ARGS}) if(BUILD_TEST) build_dependency(gtest) endif() @@ -155,18 +189,17 @@ if(BUILD_DEPENDENCIES) if (LINK_PROFILER) build_dependency(gperftools) endif() - - # building kvsCommonLws also builds kvspic - set(BUILD_ARGS - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DUSE_OPENSSL=${USE_OPENSSL} - -DUSE_MBEDTLS=${USE_MBEDTLS} - -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}) - build_dependency(kvsCommonLws ${BUILD_ARGS}) - message(STATUS "Finished building dependencies.") endif() +# building kvsCommonLws also builds kvspic +set(BUILD_ARGS + -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DUSE_OPENSSL=${USE_OPENSSL} + -DUSE_MBEDTLS=${USE_MBEDTLS} + -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}) +build_dependency(kvsCommonLws ${BUILD_ARGS}) + ############# find dependent libraries ############ find_package(Threads) @@ -204,7 +237,7 @@ endif() find_library( Usrsctp NAMES ${USRSCTP_LIBNAME} usrsctp REQUIRED - PATHS ${OPEN_SRC_INSTALL_PREFIX}/lib) + PATHS ${OPEN_SRC_INSTALL_PREFIX}/lib ${OPEN_SRC_INSTALL_PREFIX}/lib64) set(OPEN_SRC_INCLUDE_DIRS ${OPEN_SRC_INCLUDE_DIRS} ${LIBSRTP_INCLUDE_DIRS} ${CURL_INCLUDE_DIRS} ${LIBWEBSOCKETS_INCLUDE_DIRS}) @@ -212,15 +245,13 @@ set(OPEN_SRC_INCLUDE_DIRS ${OPEN_SRC_INCLUDE_DIRS} ${LIBSRTP_INCLUDE_DIRS} link_directories(${LIBSRTP_LIBRARY_DIRS}) link_directories(${LIBWEBSOCKETS_LIBRARY_DIRS}) link_directories(${OPEN_SRC_INSTALL_PREFIX}/lib) +link_directories(${OPEN_SRC_INSTALL_PREFIX}/lib64) ############# find dependent libraries end ############ if("${CMAKE_C_COMPILER_ID}" MATCHES "GNU|Clang") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") - if(ADD_MUCLIBC) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -muclibc") - endif() if(CODE_COVERAGE) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -g -fprofile-arcs -ftest-coverage") @@ -254,6 +285,10 @@ endif() if (ENABLE_DATA_CHANNEL) add_definitions(-DENABLE_DATA_CHANNEL) + set (DATACHANNEL_SRC + src/source/PeerConnection/DataChannel.c + src/source/Sctp/Sctp.c + ) endif() if (INSTRUMENTED_ALLOCATORS) @@ -265,14 +300,19 @@ file( WEBRTC_CLIENT_SOURCE_FILES "src/source/Crypto/*.c" "src/source/Ice/*.c" - "src/source/PeerConnection/*.c" + "src/source/PeerConnection/JitterBuffer.c" + "src/source/PeerConnection/jsmn.c" + "src/source/PeerConnection/PeerConnection.c" + "src/source/PeerConnection/Retransmitter.c" + "src/source/PeerConnection/Rtcp.c" + "src/source/PeerConnection/Rtp.c" + "src/source/PeerConnection/SessionDescription.c" "src/source/Rtcp/*.c" "src/source/Rtp/*.c" "src/source/Rtp/Codecs/*.c" "src/source/Sdp/*.c" "src/source/Srtp/*.c" "src/source/Stun/*.c" - "src/source/Sctp/*.c" "src/source/Metrics/*.c") if (USE_OPENSSL) @@ -289,7 +329,11 @@ include_directories(${OPEN_SRC_INSTALL_PREFIX}/include) include_directories(${KINESIS_VIDEO_WEBRTC_CLIENT_SRC}/src/include) include_directories(${KINESIS_VIDEO_WEBRTC_CLIENT_SRC}/src/ice) -add_library(kvsWebrtcClient ${LINKAGE} ${WEBRTC_CLIENT_SOURCE_FILES}) +add_library(kvsWebrtcClient ${LINKAGE} ${WEBRTC_CLIENT_SOURCE_FILES} ${DATACHANNEL_SRC}) + +if(USE_MBEDTLS) + target_compile_definitions(kvsWebrtcClient PRIVATE LWS_WITH_MBEDTLS) +endif() target_link_libraries( kvsWebrtcClient @@ -307,6 +351,10 @@ target_link_libraries( add_library(kvsWebrtcSignalingClient ${LINKAGE} ${WEBRTC_SIGNALING_CLIENT_SOURCE_FILES}) +if(USE_MBEDTLS) + target_compile_definitions(kvsWebrtcSignalingClient PRIVATE LWS_WITH_MBEDTLS) +endif() + target_link_libraries( kvsWebrtcSignalingClient PUBLIC diff --git a/Doxyfile b/Doxyfile index 4b2a44b734..b8d0a373e4 100644 --- a/Doxyfile +++ b/Doxyfile @@ -5,7 +5,7 @@ #--------------------------------------------------------------------------- PROJECT_NAME = "Amazon Kinesis Webrtc C SDK" OUTPUT_DIRECTORY = doc -INPUT = ../src/include Introduction.md ../src/source/ +INPUT = src/include Introduction.md src/source/ FILE_PATTERNS = *.h *.c RECURSIVE = YES EXAMPLE_PATTERNS = * diff --git a/README.md b/README.md index a824f36eb3..a3f527b8a1 100644 --- a/README.md +++ b/README.md @@ -5,10 +5,6 @@

Pure C WebRTC Client for Amazon Kinesis Video Streams

-

- Coverage Status -

-

Key FeaturesBuild • @@ -20,6 +16,9 @@ License

+## New feature announcements +Please refer to the release notes in [Releases](https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-c/releases) page + ## Key Features * Audio/Video Support - VP8 @@ -51,7 +50,7 @@ To download run the following command: `git clone --recursive https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-c.git` -You will also need to install `pkg-config` and `CMake` and a build enviroment +You will also need to install `pkg-config` and `CMake` and a build environment ### Configure Create a build directory in the newly checked out repository, and execute CMake from it. @@ -63,12 +62,20 @@ GStreamer is installed on your system. On Ubuntu and Raspberry Pi OS you can get the libraries by running ``` -$ sudo apt-get install libssl-dev libcurl4-openssl-dev liblog4cplus-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-base-apps gstreamer1.0-plugins-bad gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-tools +$ sudo apt-get install libssl-dev libcurl4-openssl-dev liblog4cplus-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-base-apps gstreamer1.0-plugins-bad gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-tools ``` By default we download all the libraries from GitHub and build them locally, so should require nothing to be installed ahead of time. If you do wish to link to existing libraries you can use the following flags to customize your build. +### Dependency requirements + +These would be applicable if the SDK is being linked with system dependencies instead of building from source by the SDK. +`libmbedtls`: `>= 2.25.0 & < 3.x.x` +`libopenssl`: `= 1.1.1x` +`libsrtp2` : `<= 2.5.0` +`libusrsctp` : `<= 0.9.5.0` +`libwebsockets` : `>= 4.2.0` #### Cross-Compilation @@ -84,9 +91,9 @@ You can pass the following options to `cmake ..`. * `-DBUILD_STATIC_LIBS` -- Build all KVS WebRTC and third-party libraries as static libraries. * `-DADD_MUCLIBC` -- Add -muclibc c flag * `-DBUILD_DEPENDENCIES` -- Whether or not to build depending libraries from source -* `-DBUILD_OPENSSL_PLATFORM` -- If buildng OpenSSL what is the target platform -* `-DBUILD_LIBSRTP_HOST_PLATFORM` -- If buildng LibSRTP what is the current platform -* `-DBUILD_LIBSRTP_DESTINATION_PLATFORM` -- If buildng LibSRTP what is the destination platform +* `-DBUILD_OPENSSL_PLATFORM` -- If building OpenSSL what is the target platform +* `-DBUILD_LIBSRTP_HOST_PLATFORM` -- If building LibSRTP what is the current platform +* `-DBUILD_LIBSRTP_DESTINATION_PLATFORM` -- If building LibSRTP what is the destination platform * `-DBUILD_TEST=TRUE` -- Build unit/integration tests, may be useful for confirm support for your device. `./tst/webrtc_client_test` * `-DCODE_COVERAGE` -- Enable coverage reporting * `-DCOMPILER_WARNINGS` -- Enable all compiler warnings @@ -111,6 +118,29 @@ To build the library and the provided samples run make in the build directory yo `make` +### Building with dependencies off + +In addition to the dependencies already installed, install the dependencies using the appropriate package manager. + +On Ubuntu: +`sudo apt-get install libsrtp2-dev libusrsctp-dev libwebsockets-dev` + +On MacOS: +`brew install srtp libusrsctp libwebsockets ` + +To use OpenSSL: +``` +cmake .. -DBUILD_DEPENDENCIES=OFF -DUSE_OPENSSL=ON +``` + +To use MBedTLS: +``` +cmake .. -DBUILD_DEPENDENCIES=OFF -DUSE_OPENSSL=OFF -DUSE_MBEDTLS=ON +``` + +Note: Please follow the dependency requirements to confirm the version requirements are satisfied to use the SDK with system installed dependencies. +If the versions are not satisfied, this option would not work and enabling the SDK to build dependencies for you would be the best option to go ahead with. + ## Run ### Setup your environment with your AWS account credentials and AWS region: * First set the appropriate environment variables so you can connect to KVS. If you want to use IoT certificate instead, check Setup IoT. @@ -132,7 +162,7 @@ export AWS_SESSION_TOKEN= export AWS_DEFAULT_REGION= ``` -### Setup desired log level: +### Setup logging: Set up the desired log level. The log levels and corresponding values currently available are: 1. `LOG_LEVEL_VERBOSE` ---- 1 2. `LOG_LEVEL_DEBUG` ---- 2 @@ -141,6 +171,7 @@ Set up the desired log level. The log levels and corresponding values currently 5. `LOG_LEVEL_ERROR` ---- 5 6. `LOG_LEVEL_FATAL` ---- 6 7. `LOG_LEVEL_SILENT` ---- 7 +8. `LOG_LEVEL_PROFILE` ---- 8 To set a log level, run the following command: ``` @@ -154,34 +185,58 @@ export AWS_KVS_LOG_LEVEL = 2 switches on DEBUG level logs while runnning the sam Note: The default log level is `LOG_LEVEL_WARN`. -* Optionally, set path to SSL CA certificate with variable (`../certs/cert.pem` is default one and points to file in this repository): +Starting v1.8.0, by default, the SDK creates a log file that would have execution timing details of certain steps in connection establishment. It would be stored in the `build` directory as `kvsFileLogFilter.x`. In case you do not want to use defaults, you can modify certain parameters such as log file directory, log file size and file rotation index in the `createFileLoggerWithLevelFiltering` function in the samples. +In addition to these logs, if you would like to have other level logs in a file as well, run: + +``` +export AWS_ENABLE_FILE_LOGGING=TRUE +``` + +### Set path to SSL CA certificate (**Optional**) + +If you have a custom CA certificate path to set, you can set it using: ``` export AWS_KVS_CACERT_PATH=../certs/cert.pem ``` +By defaut, the SSL CA certificate is set to `../certs/cert.pem` which points to the file in this repository: + ### Running the Samples -After executing `make` you will have the following sample applications in your `build/samples` directory: +After executing `make` you will have sample applications in your `build/samples` directory. From the `build/` directory, run any of the sample applications by passing to it the name of your signaling channel. If a signaling channel does not exist with the name you provide, the application creates one. -* `kvsWebrtcClientMaster` - This application sends sample H264/Opus frames (path: `/samples/h264SampleFrames` and `/samples/opusSampleFrames`) via WebRTC. It also accepts incoming audio, if enabled in the browser. When checked in the browser, it prints the metadata of the received audio packets in your terminal. -* `kvsWebrtcClientViewer` - This application accepts sample H264/Opus frames and prints them out. -* `kvsWebrtcClientMasterGstSample` - This application sends sample H264/Opus frames from a GStreamer pipeline. It also will playback incoming audio via an `autoaudiosink`. +#### Sample: kvsWebrtcClientMaster +This application sends sample H264/Opus frames (path: `/samples/h264SampleFrames` and `/samples/opusSampleFrames`) via WebRTC. It also accepts incoming audio, if enabled in the browser. When checked in the browser, it prints the metadata of the received audio packets in your terminal. To run: +``` +./samples/kvsWebrtcClientMaster +``` -Run any of the sample applications by passing to it the name that you want to give to your signaling channel. The application creates the signaling channel using the name you provide. For example, to create a signaling channel called myChannel and to start sending sample H264/Opus frames via this channel, run the following command from `build/` directory: +#### Sample: kvsWebrtcClientMasterGstSample +This application can send media from a GStreamer pipeline using test H264/Opus frames, device `autovideosrc` and `autoaudiosrc` input, or a received RTSP stream. It also will playback incoming audio via an `autoaudiosink`. To run: +``` +./samples/kvsWebrtcClientMasterGstSample +``` +Pass the desired media and source type when running the sample. The mediaType can be `audio-video` or `video-only`. The source type can be `testsrc`, `devicesrc`, or `rtspsrc`. Specify the RTSP URI if using `rtspsrc`: +``` +./samples/kvsWebrtcClientMasterGstSample rtspsrc rtsp:// +``` +#### Sample: kvsWebrtcClientViewer +This application accepts sample H264/Opus frames and prints them out. To run: ``` -./samples/kvsWebrtcClientMaster myChannel +./samples/kvsWebrtcClientMaster ``` +### Viewing Master Samples -When the command line application prints "Signaling client connection to socket established", you can proceed to the next step. +After running one of the master samples, when the command line application prints "Signaling client connection to socket established", indicating that your signaling channel is created and the connected master is streaming media to it, you can view the stream. To do so, check the media playback viewer on the KVS Signaling Channels console or open the [WebRTC SDK Test Page](https://awslabs.github.io/amazon-kinesis-video-streams-webrtc-sdk-js/examples/index.html). -Now that your signaling channel is created and the connected master is streaming media to it, you can view this stream. To do so, open the [WebRTC SDK Test Page](https://awslabs.github.io/amazon-kinesis-video-streams-webrtc-sdk-js/examples/index.html) using the steps in Using the Kinesis Video Streams with WebRTC Test Page and set the following values using the same AWS credentials and the same signaling channel that you specified for the master above: +If using the WebRTC SDK Test Page, set the following values using the same AWS credentials and the same signaling channel that you specified for the master above: * Access key ID * Secret access key * Signaling channel name * Client ID (optional) - -Choose Start viewer to start live video streaming of the sample H264/Opus frames. + +Then choose Start Viewer to start live video streaming of the sample H264/Opus frames. ## Setup IoT * To use IoT certificate to authenticate with KVS signaling, please refer to [Controlling Access to Kinesis Video Streams Resources Using AWS IoT](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/how-iot.html) for provisioning details. @@ -198,7 +253,7 @@ Choose Start viewer to start live video streaming of the sample H264/Opus frames "kinesisvideo:CreateSignalingChannel", "kinesisvideo:GetSignalingChannelEndpoint", "kinesisvideo:GetIceServerConfig", - "kinesisvideo:ConnectAsMaster", + "kinesisvideo:ConnectAsMaster" ], "Resource":"arn:aws:kinesisvideo:*:*:channel/${credentials-iot:ThingName}/*" } @@ -253,11 +308,6 @@ In the mbedTLS version, the SDK uses /dev/urandom on Unix and CryptGenRandom API If you would like to print out the SDPs, run this command: `export DEBUG_LOG_SDP=TRUE` -### File logging -If you would like to enable file logging, run this command: -`export AWS_ENABLE_FILE_LOGGING=TRUE` -You can also change settings such as buffer size, number of log files for rotation and log file path in the samples - ### Adjust MTU If ICE connection can be established successfully but media can not be transferred, make sure the actual MTU is higher than the MTU setting here: https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-c/blob/master/src/source/PeerConnection/Rtp.h#L12. @@ -294,6 +344,19 @@ More information about what environment variables you can configure can be found This is useful to reduce candidate gathering time when it is known for certain network interfaces to not work well. A sample callback is available in `Common.c`. The `iceSetInterfaceFilterFunc` in `KvsRtcConfiguration` must be set to the required callback. In the sample, it can be done this way in `initializePeerConnection()`: `configuration.kvsRtcConfiguration.iceSetInterfaceFilterFunc = sampleFilterNetworkInterfaces` +### Building on MacOS M1 +When building on MacOS M1, if the build fails while trying to build OpenSSL or Websockets, run the following command: +`cmake .. -DBUILD_OPENSSL_PLATFORM=darwin64-arm64-cc` + +### Building on 32 bit Raspbian GNU/Linux 11 + +To build on a 32-bit Raspbian GNU/Linux 11 on 64-bit hardware, the OpenSSL library must be manually configured. This is due to the OpenSSL autoconfiguration script detecting 64-bit hardware and emitting 64-bit ARM assembly instructions which are not allowed in 32-bit executables. A 32-bit ARM version of OpenSSL can be configured by setting 32-bit ARM platform: +`cmake .. -DBUILD_OPENSSL_PLATFORM=linux-armv4` + +### Threadpool for Signaling Channel messages +The threadpool is enabled by default, and starts with 3 threads that it can increase up to 5 if all 3 are actively in use. To change these values to better match the resources of your use case +please edit samples/Samples.h defines `KVS_SIGNALING_THREADPOOL_MIN` and `KVS_SIGNALING_THREADPOOL_MAX`. You can also disable the threadpool to instead create and detach each thread +to handle signaling messages by commenting out `KVS_USE_SIGNALING_CHANNEL_THREADPOOL`. ## Documentation All Public APIs are documented in our [Include.h](https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-c/blob/master/src/include/com/amazonaws/kinesis/video/webrtcclient/Include.h), we also generate a [Doxygen](https://awslabs.github.io/amazon-kinesis-video-streams-webrtc-sdk-c/) each commit for easier navigation. diff --git a/bench/CMakeLists.txt b/bench/CMakeLists.txt index 917ae14f09..b74103d12e 100644 --- a/bench/CMakeLists.txt +++ b/bench/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8) +cmake_minimum_required(VERSION 3.6.3) project (WebRTCClientBenchmark) diff --git a/configs/config_mbedtls.h b/configs/config_mbedtls.h index b3e62b228e..52cc0ab10f 100644 --- a/configs/config_mbedtls.h +++ b/configs/config_mbedtls.h @@ -30,7 +30,7 @@ extern "C" { * * Uncomment to use your own hardware entropy collector. */ -//#define MBEDTLS_ENTROPY_HARDWARE_ALT +// #define MBEDTLS_ENTROPY_HARDWARE_ALT #ifdef __cplusplus } diff --git a/samples/CMakeLists.txt b/samples/CMakeLists.txt index ae738c135d..513182b907 100644 --- a/samples/CMakeLists.txt +++ b/samples/CMakeLists.txt @@ -66,7 +66,7 @@ if(GST_FOUND) add_executable( kvsWebrtcClientMasterGstSample Common.c - kvsWebRTCClientMasterGstreamerSample.c + kvsWebrtcClientMasterGstSample.c ) target_link_libraries(kvsWebrtcClientMasterGstSample kvsWebrtcClient kvsWebrtcSignalingClient ${GST_SAMPLE_LIBRARIES} kvsCommonLws kvspicUtils websockets) diff --git a/samples/Common.c b/samples/Common.c index b1588693c2..97898a13da 100644 --- a/samples/Common.c +++ b/samples/Common.c @@ -12,6 +12,18 @@ VOID sigintHandler(INT32 sigNum) } } +UINT32 setLogLevel() +{ + PCHAR pLogLevel; + UINT32 logLevel = LOG_LEVEL_DEBUG; + if (NULL == (pLogLevel = GETENV(DEBUG_LOG_LEVEL_ENV_VAR)) || STATUS_SUCCESS != STRTOUI32(pLogLevel, NULL, 10, &logLevel) || + logLevel < LOG_LEVEL_VERBOSE || logLevel > LOG_LEVEL_SILENT) { + logLevel = LOG_LEVEL_WARN; + } + SET_LOGGER_LOG_LEVEL(logLevel); + return logLevel; +} + STATUS signalingCallFailed(STATUS status) { return (STATUS_SIGNALING_GET_TOKEN_CALL_FAILED == status || STATUS_SIGNALING_DESCRIBE_CALL_FAILED == status || @@ -22,7 +34,6 @@ STATUS signalingCallFailed(STATUS status) VOID onDataChannelMessage(UINT64 customData, PRtcDataChannel pDataChannel, BOOL isBinary, PBYTE pMessage, UINT32 pMessageLen) { UNUSED_PARAM(customData); - UNUSED_PARAM(pDataChannel); if (isBinary) { DLOGI("DataChannel Binary Message"); } else { @@ -46,7 +57,6 @@ VOID onConnectionStateChange(UINT64 customData, RTC_PEER_CONNECTION_STATE newSta { STATUS retStatus = STATUS_SUCCESS; PSampleStreamingSession pSampleStreamingSession = (PSampleStreamingSession) customData; - CHK(pSampleStreamingSession != NULL && pSampleStreamingSession->pSampleConfiguration != NULL, STATUS_INTERNAL_ERROR); PSampleConfiguration pSampleConfiguration = pSampleStreamingSession->pSampleConfiguration; @@ -56,6 +66,10 @@ VOID onConnectionStateChange(UINT64 customData, RTC_PEER_CONNECTION_STATE newSta case RTC_PEER_CONNECTION_STATE_CONNECTED: ATOMIC_STORE_BOOL(&pSampleConfiguration->connected, TRUE); CVAR_BROADCAST(pSampleConfiguration->cvar); + + CHK_STATUS(peerConnectionGetMetrics(pSampleStreamingSession->pPeerConnection, &pSampleStreamingSession->peerConnectionMetrics)); + CHK_STATUS(iceAgentGetMetrics(pSampleStreamingSession->pPeerConnection, &pSampleStreamingSession->iceMetrics)); + if (STATUS_FAILED(retStatus = logSelectedIceCandidatesInformation(pSampleStreamingSession))) { DLOGW("Failed to get information about selected Ice candidates: 0x%08x", retStatus); } @@ -71,6 +85,7 @@ VOID onConnectionStateChange(UINT64 customData, RTC_PEER_CONNECTION_STATE newSta default: ATOMIC_STORE_BOOL(&pSampleConfiguration->connected, FALSE); CVAR_BROADCAST(pSampleConfiguration->cvar); + break; } @@ -159,7 +174,9 @@ PVOID mediaSenderRoutine(PVOID customData) { STATUS retStatus = STATUS_SUCCESS; PSampleConfiguration pSampleConfiguration = (PSampleConfiguration) customData; - TID videoSenderTid = INVALID_TID_VALUE, audioSenderTid = INVALID_TID_VALUE; + CHK(pSampleConfiguration != NULL, STATUS_NULL_ARG); + pSampleConfiguration->videoSenderTid = INVALID_TID_VALUE; + pSampleConfiguration->audioSenderTid = INVALID_TID_VALUE; MUTEX_LOCK(pSampleConfiguration->sampleConfigurationObjLock); while (!ATOMIC_LOAD_BOOL(&pSampleConfiguration->connected) && !ATOMIC_LOAD_BOOL(&pSampleConfiguration->appTerminateFlag)) { @@ -170,19 +187,19 @@ PVOID mediaSenderRoutine(PVOID customData) CHK(!ATOMIC_LOAD_BOOL(&pSampleConfiguration->appTerminateFlag), retStatus); if (pSampleConfiguration->videoSource != NULL) { - THREAD_CREATE(&videoSenderTid, pSampleConfiguration->videoSource, (PVOID) pSampleConfiguration); + THREAD_CREATE(&pSampleConfiguration->videoSenderTid, pSampleConfiguration->videoSource, (PVOID) pSampleConfiguration); } if (pSampleConfiguration->audioSource != NULL) { - THREAD_CREATE(&audioSenderTid, pSampleConfiguration->audioSource, (PVOID) pSampleConfiguration); + THREAD_CREATE(&pSampleConfiguration->audioSenderTid, pSampleConfiguration->audioSource, (PVOID) pSampleConfiguration); } - if (videoSenderTid != INVALID_TID_VALUE) { - THREAD_JOIN(videoSenderTid, NULL); + if (pSampleConfiguration->videoSenderTid != INVALID_TID_VALUE) { + THREAD_JOIN(pSampleConfiguration->videoSenderTid, NULL); } - if (audioSenderTid != INVALID_TID_VALUE) { - THREAD_JOIN(audioSenderTid, NULL); + if (pSampleConfiguration->audioSenderTid != INVALID_TID_VALUE) { + THREAD_JOIN(pSampleConfiguration->audioSenderTid, NULL); } CleanUp: @@ -218,8 +235,6 @@ STATUS handleOffer(PSampleConfiguration pSampleConfiguration, PSampleStreamingSe if (pSampleStreamingSession->remoteCanTrickleIce) { CHK_STATUS(createAnswer(pSampleStreamingSession->pPeerConnection, &pSampleStreamingSession->answerSessionDescriptionInit)); CHK_STATUS(respondWithAnswer(pSampleStreamingSession)); - DLOGD("time taken to send answer %" PRIu64 " ms", - (GETTIME() - pSampleStreamingSession->offerReceiveTime) / HUNDREDS_OF_NANOS_IN_A_MILLISECOND); } mediaThreadStarted = ATOMIC_EXCHANGE_BOOL(&pSampleConfiguration->mediaThreadStarted, TRUE); @@ -243,16 +258,23 @@ STATUS sendSignalingMessage(PSampleStreamingSession pSampleStreamingSession, PSi { STATUS retStatus = STATUS_SUCCESS; BOOL locked = FALSE; - + PSampleConfiguration pSampleConfiguration; // Validate the input params CHK(pSampleStreamingSession != NULL && pSampleStreamingSession->pSampleConfiguration != NULL && pMessage != NULL, STATUS_NULL_ARG); - CHK(IS_VALID_MUTEX_VALUE(pSampleStreamingSession->pSampleConfiguration->signalingSendMessageLock) && - IS_VALID_SIGNALING_CLIENT_HANDLE(pSampleStreamingSession->pSampleConfiguration->signalingClientHandle), + + pSampleConfiguration = pSampleStreamingSession->pSampleConfiguration; + + CHK(IS_VALID_MUTEX_VALUE(pSampleConfiguration->signalingSendMessageLock) && + IS_VALID_SIGNALING_CLIENT_HANDLE(pSampleConfiguration->signalingClientHandle), STATUS_INVALID_OPERATION); - MUTEX_LOCK(pSampleStreamingSession->pSampleConfiguration->signalingSendMessageLock); + MUTEX_LOCK(pSampleConfiguration->signalingSendMessageLock); locked = TRUE; - CHK_STATUS(signalingClientSendMessageSync(pSampleStreamingSession->pSampleConfiguration->signalingClientHandle, pMessage)); + CHK_STATUS(signalingClientSendMessageSync(pSampleConfiguration->signalingClientHandle, pMessage)); + if (pMessage->messageType == SIGNALING_MESSAGE_TYPE_ANSWER) { + CHK_STATUS(signalingClientGetMetrics(pSampleConfiguration->signalingClientHandle, &pSampleConfiguration->signalingClientMetrics)); + DLOGP("[Signaling offer to answer] %" PRIu64 " ms", pSampleConfiguration->signalingClientMetrics.signalingClientStats.offerToAnswerTime); + } CleanUp: @@ -314,8 +336,6 @@ VOID onIceCandidateHandler(UINT64 customData, PCHAR candidateJson) !pSampleStreamingSession->remoteCanTrickleIce) { CHK_STATUS(createAnswer(pSampleStreamingSession->pPeerConnection, &pSampleStreamingSession->answerSessionDescriptionInit)); CHK_STATUS(respondWithAnswer(pSampleStreamingSession)); - DLOGD("time taken to send answer %" PRIu64 " ms", - (GETTIME() - pSampleStreamingSession->offerReceiveTime) / HUNDREDS_OF_NANOS_IN_A_MILLISECOND); } else if (pSampleStreamingSession->pSampleConfiguration->channelInfo.channelRoleType == SIGNALING_CHANNEL_ROLE_TYPE_VIEWER && !pSampleStreamingSession->pSampleConfiguration->trickleIce) { CVAR_BROADCAST(pSampleStreamingSession->pSampleConfiguration->cvar); @@ -343,7 +363,7 @@ STATUS initializePeerConnection(PSampleConfiguration pSampleConfiguration, PRtcP RtcConfiguration configuration; UINT32 i, j, iceConfigCount, uriCount = 0, maxTurnServer = 1; PIceConfigInfo pIceConfigInfo; - UINT64 data, curTime; + UINT64 data; PRtcCertificate pRtcCertificate = NULL; CHK(pSampleConfiguration != NULL && ppRtcPeerConnection != NULL, STATUS_NULL_ARG); @@ -380,7 +400,7 @@ STATUS initializePeerConnection(PSampleConfiguration pSampleConfiguration, PRtcP * if configuration.iceServers[uriCount + 1].urls is "turn:ip:port?transport=tcp" then ICE will try TURN over TCP/TLS * if configuration.iceServers[uriCount + 1].urls is "turns:ip:port?transport=udp", it's currently ignored because sdk dont do TURN * over DTLS yet. if configuration.iceServers[uriCount + 1].urls is "turns:ip:port?transport=tcp" then ICE will try TURN over TCP/TLS - * if configuration.iceServers[uriCount + 1].urls is "turn:ip:port" then ICE will try both TURN over UPD and TCP/TLS + * if configuration.iceServers[uriCount + 1].urls is "turn:ip:port" then ICE will try both TURN over UDP and TCP/TLS * * It's recommended to not pass too many TURN iceServers to configuration because it will slow down ice gathering in non-trickle mode. */ @@ -409,10 +429,7 @@ STATUS initializePeerConnection(PSampleConfiguration pSampleConfiguration, PRtcP configuration.certificates[0] = *pRtcCertificate; } - curTime = GETTIME(); CHK_STATUS(createPeerConnection(&configuration, ppRtcPeerConnection)); - DLOGD("time taken to create peer connection %" PRIu64 " ms", (GETTIME() - curTime) / HUNDREDS_OF_NANOS_IN_A_MILLISECOND); - CleanUp: CHK_LOG_ERR(retStatus); @@ -464,6 +481,8 @@ STATUS createSampleStreamingSession(PSampleConfiguration pSampleConfiguration, P CHK((isMaster && peerId != NULL) || !isMaster, STATUS_INVALID_ARG); pSampleStreamingSession = (PSampleStreamingSession) MEMCALLOC(1, SIZEOF(SampleStreamingSession)); + pSampleStreamingSession->firstFrame = TRUE; + pSampleStreamingSession->offerReceiveTime = GETTIME(); CHK(pSampleStreamingSession != NULL, STATUS_NOT_ENOUGH_MEMORY); if (isMaster) { @@ -473,8 +492,15 @@ STATUS createSampleStreamingSession(PSampleConfiguration pSampleConfiguration, P } ATOMIC_STORE_BOOL(&pSampleStreamingSession->peerIdReceived, TRUE); + pSampleStreamingSession->pAudioRtcRtpTransceiver = NULL; + pSampleStreamingSession->pVideoRtcRtpTransceiver = NULL; + pSampleStreamingSession->pSampleConfiguration = pSampleConfiguration; pSampleStreamingSession->rtcMetricsHistory.prevTs = GETTIME(); + + pSampleStreamingSession->peerConnectionMetrics.version = PEER_CONNECTION_METRICS_CURRENT_VERSION; + pSampleStreamingSession->iceMetrics.version = ICE_AGENT_METRICS_CURRENT_VERSION; + // if we're the viewer, we control the trickle ice mode pSampleStreamingSession->remoteCanTrickleIce = !isMaster && pSampleConfiguration->trickleIce; @@ -520,7 +546,6 @@ STATUS createSampleStreamingSession(PSampleConfiguration pSampleConfiguration, P // twcc bandwidth estimation CHK_STATUS(peerConnectionOnSenderBandwidthEstimation(pSampleStreamingSession->pPeerConnection, (UINT64) pSampleStreamingSession, sampleSenderBandwidthEstimationHandler)); - pSampleStreamingSession->firstFrame = TRUE; pSampleStreamingSession->startUpLatency = 0; CleanUp: @@ -564,7 +589,7 @@ STATUS freeSampleStreamingSession(PSampleStreamingSession* ppSampleStreamingSess // the running thread but it's OK as it's re-entrant MUTEX_LOCK(pSampleConfiguration->sampleConfigurationObjLock); if (pSampleConfiguration->iceCandidatePairStatsTimerId != MAX_UINT32 && pSampleConfiguration->streamingSessionCount == 0 && - pSampleConfiguration->iceCandidatePairStatsTimerId != MAX_UINT32 && IS_VALID_TIMER_QUEUE_HANDLE(pSampleConfiguration->timerQueueHandle)) { + IS_VALID_TIMER_QUEUE_HANDLE(pSampleConfiguration->timerQueueHandle)) { CHK_LOG_ERR(timerQueueCancelTimer(pSampleConfiguration->timerQueueHandle, pSampleConfiguration->iceCandidatePairStatsTimerId, (UINT64) pSampleConfiguration)); pSampleConfiguration->iceCandidatePairStatsTimerId = MAX_UINT32; @@ -597,16 +622,16 @@ STATUS streamingSessionOnShutdown(PSampleStreamingSession pSampleStreamingSessio return retStatus; } -VOID sampleFrameHandler(UINT64 customData, PFrame pFrame) +VOID sampleVideoFrameHandler(UINT64 customData, PFrame pFrame) { UNUSED_PARAM(customData); - DLOGV("Frame received. TrackId: %" PRIu64 ", Size: %u, Flags %u", pFrame->trackId, pFrame->size, pFrame->flags); - PSampleStreamingSession pSampleStreamingSession = (PSampleStreamingSession) customData; - if (pSampleStreamingSession->firstFrame) { - pSampleStreamingSession->firstFrame = FALSE; - pSampleStreamingSession->startUpLatency = (GETTIME() - pSampleStreamingSession->offerReceiveTime) / HUNDREDS_OF_NANOS_IN_A_MILLISECOND; - printf("Start up latency from offer to first frame: %" PRIu64 "ms\n", pSampleStreamingSession->startUpLatency); - } + DLOGV("Video Frame received. TrackId: %" PRIu64 ", Size: %u, Flags %u", pFrame->trackId, pFrame->size, pFrame->flags); +} + +VOID sampleAudioFrameHandler(UINT64 customData, PFrame pFrame) +{ + UNUSED_PARAM(customData); + DLOGV("Audio Frame received. TrackId: %" PRIu64 ", Size: %u, Flags %u", pFrame->trackId, pFrame->size, pFrame->flags); } VOID sampleBandwidthEstimationHandler(UINT64 customData, DOUBLE maximumBitrate) @@ -710,20 +735,19 @@ STATUS lookForSslCert(PSampleConfiguration* ppSampleConfiguration) return retStatus; } -STATUS createSampleConfiguration(PCHAR channelName, SIGNALING_CHANNEL_ROLE_TYPE roleType, BOOL trickleIce, BOOL useTurn, +STATUS createSampleConfiguration(PCHAR channelName, SIGNALING_CHANNEL_ROLE_TYPE roleType, BOOL trickleIce, BOOL useTurn, UINT32 logLevel, PSampleConfiguration* ppSampleConfiguration) { STATUS retStatus = STATUS_SUCCESS; - PCHAR pAccessKey, pSecretKey, pSessionToken, pLogLevel; + PCHAR pAccessKey, pSecretKey, pSessionToken; PSampleConfiguration pSampleConfiguration = NULL; - UINT32 logLevel = LOG_LEVEL_DEBUG; CHK(ppSampleConfiguration != NULL, STATUS_NULL_ARG); CHK(NULL != (pSampleConfiguration = (PSampleConfiguration) MEMCALLOC(1, SIZEOF(SampleConfiguration))), STATUS_NOT_ENOUGH_MEMORY); #ifdef IOT_CORE_ENABLE_CREDENTIALS - PCHAR pIotCoreCredentialEndPoint, pIotCoreCert, pIotCorePrivateKey, pIotCoreRoleAlias, pIotCoreThingName; + PCHAR pIotCoreCredentialEndPoint, pIotCoreCert, pIotCorePrivateKey, pIotCoreRoleAlias, pIotCoreCertificateId; CHK_ERR((pIotCoreCredentialEndPoint = getenv(IOT_CORE_CREDENTIAL_ENDPOINT)) != NULL, STATUS_INVALID_OPERATION, "AWS_IOT_CORE_CREDENTIAL_ENDPOINT must be set"); CHK_ERR((pIotCoreCert = getenv(IOT_CORE_CERT)) != NULL, STATUS_INVALID_OPERATION, "AWS_IOT_CORE_CERT must be set"); @@ -735,24 +759,35 @@ STATUS createSampleConfiguration(PCHAR channelName, SIGNALING_CHANNEL_ROLE_TYPE #endif pSessionToken = getenv(SESSION_TOKEN_ENV_VAR); - pSampleConfiguration->enableFileLogging = FALSE; + + // If the env is set, we generate normal log files apart from filtered profile log files + // If not set, we generate only the filtered profile log files if (NULL != getenv(ENABLE_FILE_LOGGING)) { - pSampleConfiguration->enableFileLogging = TRUE; + retStatus = createFileLoggerWithLevelFiltering(FILE_LOGGING_BUFFER_SIZE, MAX_NUMBER_OF_LOG_FILES, (PCHAR) FILE_LOGGER_LOG_FILE_DIRECTORY_PATH, + TRUE, TRUE, TRUE, LOG_LEVEL_PROFILE, NULL); + + if (retStatus != STATUS_SUCCESS) { + DLOGW("[KVS Master] createFileLogger(): operation returned status code: 0x%08x", retStatus); + } else { + pSampleConfiguration->enableFileLogging = TRUE; + } + } else { + retStatus = createFileLoggerWithLevelFiltering(FILE_LOGGING_BUFFER_SIZE, MAX_NUMBER_OF_LOG_FILES, (PCHAR) FILE_LOGGER_LOG_FILE_DIRECTORY_PATH, + TRUE, TRUE, FALSE, LOG_LEVEL_PROFILE, NULL); + + if (retStatus != STATUS_SUCCESS) { + DLOGW("[KVS Master] createFileLogger(): operation returned status code: 0x%08x", retStatus); + } else { + pSampleConfiguration->enableFileLogging = TRUE; + } } + if ((pSampleConfiguration->channelInfo.pRegion = getenv(DEFAULT_REGION_ENV_VAR)) == NULL) { pSampleConfiguration->channelInfo.pRegion = DEFAULT_AWS_REGION; } CHK_STATUS(lookForSslCert(&pSampleConfiguration)); - // Set the logger log level - if (NULL == (pLogLevel = getenv(DEBUG_LOG_LEVEL_ENV_VAR)) || STATUS_SUCCESS != STRTOUI32(pLogLevel, NULL, 10, &logLevel) || - logLevel < LOG_LEVEL_VERBOSE || logLevel > LOG_LEVEL_SILENT) { - logLevel = LOG_LEVEL_WARN; - } - - SET_LOGGER_LOG_LEVEL(logLevel); - #ifdef IOT_CORE_ENABLE_CREDENTIALS CHK_STATUS(createLwsIotCredentialProvider(pIotCoreCredentialEndPoint, pIotCoreCert, pIotCorePrivateKey, pSampleConfiguration->pCaCertPath, pIotCoreRoleAlias, channelName, &pSampleConfiguration->pCredentialProvider)); @@ -762,6 +797,8 @@ STATUS createSampleConfiguration(PCHAR channelName, SIGNALING_CHANNEL_ROLE_TYPE #endif pSampleConfiguration->mediaSenderTid = INVALID_TID_VALUE; + pSampleConfiguration->audioSenderTid = INVALID_TID_VALUE; + pSampleConfiguration->videoSenderTid = INVALID_TID_VALUE; pSampleConfiguration->signalingClientHandle = INVALID_SIGNALING_CLIENT_HANDLE_VALUE; pSampleConfiguration->sampleConfigurationObjLock = MUTEX_CREATE(TRUE); pSampleConfiguration->cvar = CVAR_CREATE(); @@ -774,6 +811,11 @@ STATUS createSampleConfiguration(PCHAR channelName, SIGNALING_CHANNEL_ROLE_TYPE pSampleConfiguration->channelInfo.version = CHANNEL_INFO_CURRENT_VERSION; pSampleConfiguration->channelInfo.pChannelName = channelName; +#ifdef IOT_CORE_ENABLE_CREDENTIALS + if ((pIotCoreCertificateId = getenv(IOT_CORE_CERTIFICATE_ID)) != NULL) { + pSampleConfiguration->channelInfo.pChannelName = pIotCoreCertificateId; + } +#endif pSampleConfiguration->channelInfo.pKmsKeyId = NULL; pSampleConfiguration->channelInfo.tagCount = 0; pSampleConfiguration->channelInfo.pTags = NULL; @@ -796,8 +838,11 @@ STATUS createSampleConfiguration(PCHAR channelName, SIGNALING_CHANNEL_ROLE_TYPE pSampleConfiguration->clientInfo.loggingLevel = logLevel; pSampleConfiguration->clientInfo.cacheFilePath = NULL; // Use the default path pSampleConfiguration->clientInfo.signalingClientCreationMaxRetryAttempts = CREATE_SIGNALING_CLIENT_RETRY_ATTEMPTS_SENTINEL_VALUE; + pSampleConfiguration->clientInfo.signalingMessagesMinimumThreads = KVS_SIGNALING_THREADPOOL_MIN; + pSampleConfiguration->clientInfo.signalingMessagesMaximumThreads = KVS_SIGNALING_THREADPOOL_MAX; pSampleConfiguration->iceCandidatePairStatsTimerId = MAX_UINT32; pSampleConfiguration->pregenerateCertTimerId = MAX_UINT32; + pSampleConfiguration->signalingClientMetrics.version = SIGNALING_CLIENT_METRICS_CURRENT_VERSION; ATOMIC_STORE_BOOL(&pSampleConfiguration->interrupted, FALSE); ATOMIC_STORE_BOOL(&pSampleConfiguration->mediaThreadStarted, FALSE); @@ -835,6 +880,38 @@ STATUS createSampleConfiguration(PCHAR channelName, SIGNALING_CHANNEL_ROLE_TYPE return retStatus; } +STATUS initSignaling(PSampleConfiguration pSampleConfiguration, PCHAR clientId) +{ + STATUS retStatus = STATUS_SUCCESS; + SignalingClientMetrics signalingClientMetrics = pSampleConfiguration->signalingClientMetrics; + pSampleConfiguration->signalingClientCallbacks.messageReceivedFn = signalingMessageReceived; + STRCPY(pSampleConfiguration->clientInfo.clientId, clientId); + CHK_STATUS(createSignalingClientSync(&pSampleConfiguration->clientInfo, &pSampleConfiguration->channelInfo, + &pSampleConfiguration->signalingClientCallbacks, pSampleConfiguration->pCredentialProvider, + &pSampleConfiguration->signalingClientHandle)); + + // Enable the processing of the messages + CHK_STATUS(signalingClientFetchSync(pSampleConfiguration->signalingClientHandle)); + CHK_STATUS(signalingClientConnectSync(pSampleConfiguration->signalingClientHandle)); + + signalingClientGetMetrics(pSampleConfiguration->signalingClientHandle, &signalingClientMetrics); + + // Logging this here since the logs in signaling library do not get routed to file + DLOGP("[Signaling Get token] %" PRIu64 " ms", signalingClientMetrics.signalingClientStats.getTokenCallTime); + DLOGP("[Signaling Describe] %" PRIu64 " ms", signalingClientMetrics.signalingClientStats.describeCallTime); + DLOGP("[Signaling Create Channel] %" PRIu64 " ms", signalingClientMetrics.signalingClientStats.createCallTime); + DLOGP("[Signaling Get endpoint] %" PRIu64 " ms", signalingClientMetrics.signalingClientStats.getEndpointCallTime); + DLOGP("[Signaling Get ICE config] %" PRIu64 " ms", signalingClientMetrics.signalingClientStats.getIceConfigCallTime); + DLOGP("[Signaling Connect] %" PRIu64 " ms", signalingClientMetrics.signalingClientStats.connectCallTime); + DLOGP("[Signaling create client] %" PRIu64 " ms", signalingClientMetrics.signalingClientStats.createClientTime); + DLOGP("[Signaling fetch client] %" PRIu64 " ms", signalingClientMetrics.signalingClientStats.fetchClientTime); + DLOGP("[Signaling connect client] %" PRIu64 " ms", signalingClientMetrics.signalingClientStats.connectClientTime); + pSampleConfiguration->signalingClientMetrics = signalingClientMetrics; + gSampleConfiguration = pSampleConfiguration; +CleanUp: + return retStatus; +} + STATUS logSignalingClientStats(PSignalingClientMetrics pSignalingClientMetrics) { ENTERS(); @@ -877,9 +954,12 @@ STATUS getIceCandidatePairStatsCallback(UINT32 timerId, UINT64 currentTime, UINT pSampleConfiguration->rtcIceCandidatePairMetrics.requestedTypeOfStats = RTC_STATS_TYPE_CANDIDATE_PAIR; - // We need to execute this under the object lock due to race conditions that it could pose - MUTEX_LOCK(pSampleConfiguration->sampleConfigurationObjLock); - locked = TRUE; + // Use MUTEX_TRYLOCK to avoid possible dead lock when canceling timerQueue + if (!MUTEX_TRYLOCK(pSampleConfiguration->sampleConfigurationObjLock)) { + return retStatus; + } else { + locked = TRUE; + } for (i = 0; i < pSampleConfiguration->streamingSessionCount; ++i) { if (STATUS_SUCCEEDED(rtcPeerConnectionGetMetrics(pSampleConfiguration->sampleStreamingSessionList[i]->pPeerConnection, NULL, @@ -970,8 +1050,12 @@ STATUS pregenerateCertTimerCallback(UINT32 timerId, UINT64 currentTime, UINT64 c CHK_WARN(pSampleConfiguration != NULL, STATUS_NULL_ARG, "[KVS Master] pregenerateCertTimerCallback(): Passed argument is NULL"); - MUTEX_LOCK(pSampleConfiguration->sampleConfigurationObjLock); - locked = TRUE; + // Use MUTEX_TRYLOCK to avoid possible dead lock when canceling timerQueue + if (!MUTEX_TRYLOCK(pSampleConfiguration->sampleConfigurationObjLock)) { + return retStatus; + } else { + locked = TRUE; + } // Quick check if there is anything that needs to be done. CHK_STATUS(stackQueueGetCount(pSampleConfiguration->pregeneratedCertificates, &certCount)); @@ -1018,7 +1102,6 @@ STATUS freeSampleConfiguration(PSampleConfiguration* ppSampleConfiguration) pSampleConfiguration = *ppSampleConfiguration; CHK(pSampleConfiguration != NULL, retStatus); - if (IS_VALID_TIMER_QUEUE_HANDLE(pSampleConfiguration->timerQueueHandle)) { if (pSampleConfiguration->iceCandidatePairStatsTimerId != MAX_UINT32) { retStatus = timerQueueCancelTimer(pSampleConfiguration->timerQueueHandle, pSampleConfiguration->iceCandidatePairStatsTimerId, @@ -1118,7 +1201,9 @@ STATUS freeSampleConfiguration(PSampleConfiguration* ppSampleConfiguration) CHK_LOG_ERR(stackQueueFree(pSampleConfiguration->pregeneratedCertificates)); pSampleConfiguration->pregeneratedCertificates = NULL; } - + if (pSampleConfiguration->enableFileLogging) { + freeFileLogger(); + } SAFE_MEMFREE(*ppSampleConfiguration); CleanUp: @@ -1133,7 +1218,7 @@ STATUS sessionCleanupWait(PSampleConfiguration pSampleConfiguration) STATUS retStatus = STATUS_SUCCESS; PSampleStreamingSession pSampleStreamingSession = NULL; UINT32 i, clientIdHash; - BOOL locked = FALSE, peerConnectionFound = FALSE; + BOOL sampleConfigurationObjLockLocked = FALSE, streamingSessionListReadLockLocked = FALSE, peerConnectionFound = FALSE; SIGNALING_CLIENT_STATE signalingClientState; CHK(pSampleConfiguration != NULL, STATUS_NULL_ARG); @@ -1141,7 +1226,7 @@ STATUS sessionCleanupWait(PSampleConfiguration pSampleConfiguration) while (!ATOMIC_LOAD_BOOL(&pSampleConfiguration->interrupted)) { // Keep the main set of operations interlocked until cvar wait which would atomically unlock MUTEX_LOCK(pSampleConfiguration->sampleConfigurationObjLock); - locked = TRUE; + sampleConfigurationObjLockLocked = TRUE; // scan and cleanup terminated streaming session for (i = 0; i < pSampleConfiguration->streamingSessionCount; ++i) { @@ -1149,6 +1234,7 @@ STATUS sessionCleanupWait(PSampleConfiguration pSampleConfiguration) pSampleStreamingSession = pSampleConfiguration->sampleStreamingSessionList[i]; MUTEX_LOCK(pSampleConfiguration->streamingSessionListReadLock); + streamingSessionListReadLockLocked = TRUE; // swap with last element and decrement count pSampleConfiguration->streamingSessionCount--; @@ -1163,6 +1249,7 @@ STATUS sessionCleanupWait(PSampleConfiguration pSampleConfiguration) } MUTEX_UNLOCK(pSampleConfiguration->streamingSessionListReadLock); + streamingSessionListReadLockLocked = FALSE; CHK_STATUS(freeSampleStreamingSession(&pSampleStreamingSession)); } @@ -1197,17 +1284,21 @@ STATUS sessionCleanupWait(PSampleConfiguration pSampleConfiguration) // periodically wake up and clean up terminated streaming session CVAR_WAIT(pSampleConfiguration->cvar, pSampleConfiguration->sampleConfigurationObjLock, SAMPLE_SESSION_CLEANUP_WAIT_PERIOD); MUTEX_UNLOCK(pSampleConfiguration->sampleConfigurationObjLock); - locked = FALSE; + sampleConfigurationObjLockLocked = FALSE; } CleanUp: CHK_LOG_ERR(retStatus); - if (locked) { + if (sampleConfigurationObjLockLocked) { MUTEX_UNLOCK(pSampleConfiguration->sampleConfigurationObjLock); } + if (streamingSessionListReadLockLocked) { + MUTEX_UNLOCK(pSampleConfiguration->streamingSessionListReadLock); + } + LEAVES(); return retStatus; } @@ -1280,6 +1371,7 @@ STATUS signalingMessageReceived(UINT64 customData, PReceivedSignalingMessage pRe * any ice candidate messages queued in pPendingSignalingMessageForRemoteClient. If so then submit * all of them. */ + if (pSampleConfiguration->streamingSessionCount == ARRAY_SIZE(pSampleConfiguration->sampleStreamingSessionList)) { DLOGW("Max simultaneous streaming session count reached."); @@ -1293,7 +1385,6 @@ STATUS signalingMessageReceived(UINT64 customData, PReceivedSignalingMessage pRe } CHK_STATUS(createSampleStreamingSession(pSampleConfiguration, pReceivedSignalingMessage->signalingMessage.peerClientId, TRUE, &pSampleStreamingSession)); - pSampleStreamingSession->offerReceiveTime = GETTIME(); MUTEX_LOCK(pSampleConfiguration->streamingSessionListReadLock); pSampleConfiguration->sampleStreamingSessionList[pSampleConfiguration->streamingSessionCount++] = pSampleStreamingSession; MUTEX_UNLOCK(pSampleConfiguration->streamingSessionListReadLock); @@ -1334,6 +1425,10 @@ STATUS signalingMessageReceived(UINT64 customData, PReceivedSignalingMessage pRe // NULL the pointer to avoid it being freed in the cleanup pPendingMessageQueue = NULL; } + + startStats = pSampleConfiguration->iceCandidatePairStatsTimerId == MAX_UINT32; + CHK_STATUS(signalingClientGetMetrics(pSampleConfiguration->signalingClientHandle, &pSampleConfiguration->signalingClientMetrics)); + DLOGP("[Signaling offer to answer] %" PRIu64 " ms", pSampleConfiguration->signalingClientMetrics.signalingClientStats.offerToAnswerTime); break; case SIGNALING_MESSAGE_TYPE_ICE_CANDIDATE: diff --git a/samples/Samples.h b/samples/Samples.h index 6b721a8d6f..dedd53d65e 100644 --- a/samples/Samples.h +++ b/samples/Samples.h @@ -34,29 +34,45 @@ extern "C" { #define CA_CERT_PEM_FILE_EXTENSION ".pem" -#define FILE_LOGGING_BUFFER_SIZE (100 * 1024) +#define FILE_LOGGING_BUFFER_SIZE (10 * 1024) #define MAX_NUMBER_OF_LOG_FILES 5 #define SAMPLE_HASH_TABLE_BUCKET_COUNT 50 #define SAMPLE_HASH_TABLE_BUCKET_LENGTH 2 +#define RTSP_PIPELINE_MAX_CHAR_COUNT 1000 + #define IOT_CORE_CREDENTIAL_ENDPOINT ((PCHAR) "AWS_IOT_CORE_CREDENTIAL_ENDPOINT") #define IOT_CORE_CERT ((PCHAR) "AWS_IOT_CORE_CERT") #define IOT_CORE_PRIVATE_KEY ((PCHAR) "AWS_IOT_CORE_PRIVATE_KEY") #define IOT_CORE_ROLE_ALIAS ((PCHAR) "AWS_IOT_CORE_ROLE_ALIAS") #define IOT_CORE_THING_NAME ((PCHAR) "AWS_IOT_CORE_THING_NAME") +#define IOT_CORE_CERTIFICATE_ID ((PCHAR) "AWS_IOT_CORE_CERTIFICATE_ID") #define MASTER_DATA_CHANNEL_MESSAGE "This message is from the KVS Master" #define VIEWER_DATA_CHANNEL_MESSAGE "This message is from the KVS Viewer" +// Signaling client threadpool for handling messages +#define KVS_SIGNALING_THREADPOOL_MIN 3 +#define KVS_SIGNALING_THREADPOOL_MAX 5 + +// comment out this line to disable the feature +#define KVS_USE_SIGNALING_CHANNEL_THREADPOOL 1 + /* Uncomment the following line in order to enable IoT credentials checks in the provided samples */ -//#define IOT_CORE_ENABLE_CREDENTIALS 1 +// #define IOT_CORE_ENABLE_CREDENTIALS 1 typedef enum { SAMPLE_STREAMING_VIDEO_ONLY, SAMPLE_STREAMING_AUDIO_VIDEO, } SampleStreamingMediaType; +typedef enum { + TEST_SOURCE, + DEVICE_SOURCE, + RTSP_SOURCE, +} SampleSourceType; + typedef struct __SampleStreamingSession SampleStreamingSession; typedef struct __SampleStreamingSession* PSampleStreamingSession; @@ -75,7 +91,7 @@ typedef struct { volatile ATOMIC_BOOL mediaThreadStarted; volatile ATOMIC_BOOL recreateSignalingClient; volatile ATOMIC_BOOL connected; - BOOL useTestSrc; + SampleSourceType srcType; ChannelInfo channelInfo; PCHAR pCaCertPath; PAwsCredentialProvider pCredentialProvider; @@ -85,6 +101,8 @@ typedef struct { PBYTE pVideoFrameBuffer; UINT32 videoBufferSize; TID mediaSenderTid; + TID audioSenderTid; + TID videoSenderTid; TIMER_QUEUE_HANDLE timerQueueHandle; UINT32 iceCandidatePairStatsTimerId; SampleStreamingMediaType mediaType; @@ -92,6 +110,7 @@ typedef struct { startRoutine videoSource; startRoutine receiveAudioVideoSource; RtcOnDataChannel onDataChannel; + SignalingClientMetrics signalingClientMetrics; PStackQueue pPendingSignalingMessageForRemoteClient; PHashTable pRtcPeerConnectionForRemoteClient; @@ -114,6 +133,9 @@ typedef struct { UINT32 pregenerateCertTimerId; PStackQueue pregeneratedCertificates; // Max MAX_RTCCONFIGURATION_CERTIFICATES certificates + + PCHAR rtspUri; + UINT32 logLevel; } SampleConfiguration, *PSampleConfiguration; typedef struct { @@ -128,6 +150,7 @@ struct __SampleStreamingSession { volatile ATOMIC_BOOL terminateFlag; volatile ATOMIC_BOOL candidateGatheringDone; volatile ATOMIC_BOOL peerIdReceived; + volatile ATOMIC_BOOL firstFrame; volatile SIZE_T frameIndex; PRtcPeerConnection pPeerConnection; PRtcRtpTransceiver pVideoRtcRtpTransceiver; @@ -138,15 +161,16 @@ struct __SampleStreamingSession { UINT64 videoTimestamp; CHAR peerId[MAX_SIGNALING_CLIENT_ID_LEN + 1]; TID receiveAudioVideoSenderTid; - UINT64 offerReceiveTime; UINT64 startUpLatency; - BOOL firstFrame; RtcMetricsHistory rtcMetricsHistory; BOOL remoteCanTrickleIce; // this is called when the SampleStreamingSession is being freed StreamSessionShutdownCallback shutdownCallback; UINT64 shutdownCallbackCustomData; + UINT64 offerReceiveTime; + PeerConnectionMetrics peerConnectionMetrics; + KvsIceAgentMetrics iceMetrics; }; VOID sigintHandler(INT32); @@ -154,11 +178,11 @@ STATUS readFrameFromDisk(PBYTE, PUINT32, PCHAR); PVOID sendVideoPackets(PVOID); PVOID sendAudioPackets(PVOID); PVOID sendGstreamerAudioVideo(PVOID); -PVOID sampleReceiveVideoFrame(PVOID args); +PVOID sampleReceiveAudioVideoFrame(PVOID); PVOID getPeriodicIceCandidatePairStats(PVOID); STATUS getIceCandidatePairStatsCallback(UINT32, UINT64, UINT64); STATUS pregenerateCertTimerCallback(UINT32, UINT64, UINT64); -STATUS createSampleConfiguration(PCHAR, SIGNALING_CHANNEL_ROLE_TYPE, BOOL, BOOL, PSampleConfiguration*); +STATUS createSampleConfiguration(PCHAR, SIGNALING_CHANNEL_ROLE_TYPE, BOOL, BOOL, UINT32, PSampleConfiguration*); STATUS freeSampleConfiguration(PSampleConfiguration*); STATUS signalingClientStateChanged(UINT64, SIGNALING_CLIENT_STATE); STATUS signalingMessageReceived(UINT64, PReceivedSignalingMessage); @@ -173,7 +197,8 @@ STATUS streamingSessionOnShutdown(PSampleStreamingSession, UINT64, StreamSession STATUS sendSignalingMessage(PSampleStreamingSession, PSignalingMessage); STATUS respondWithAnswer(PSampleStreamingSession); STATUS resetSampleConfigurationState(PSampleConfiguration); -VOID sampleFrameHandler(UINT64, PFrame); +VOID sampleVideoFrameHandler(UINT64, PFrame); +VOID sampleAudioFrameHandler(UINT64, PFrame); VOID sampleBandwidthEstimationHandler(UINT64, DOUBLE); VOID sampleSenderBandwidthEstimationHandler(UINT64, UINT32, UINT32, UINT32, UINT32, UINT64); VOID onDataChannel(UINT64, PRtcDataChannel); @@ -187,7 +212,9 @@ STATUS freeMessageQueue(PPendingMessageQueue); STATUS submitPendingIceCandidate(PPendingMessageQueue, PSampleStreamingSession); STATUS removeExpiredMessageQueues(PStackQueue); STATUS getPendingMessageQueueForHash(PStackQueue, UINT64, BOOL, PPendingMessageQueue*); +STATUS initSignaling(PSampleConfiguration, PCHAR); BOOL sampleFilterNetworkInterfaces(UINT64, PCHAR); +UINT32 setLogLevel(); #ifdef __cplusplus } diff --git a/samples/h264SampleFrames/README.md b/samples/h264SampleFrames/README.md index 3a0f155515..159c9c5c85 100644 --- a/samples/h264SampleFrames/README.md +++ b/samples/h264SampleFrames/README.md @@ -1,7 +1,7 @@ GStreamer Pipeline to reproduce sample frames -```sh -gst-launch-1.0 videotestsrc pattern=ball num-buffers=1500 ! timeoverlay ! videoconvert ! video/x-raw,format=I420,width=1280,height=720,framerate=25/1 ! queue ! x264enc bframes=0 speed-preset=veryfast bitrate=512 byte-stream=TRUE tune=zerolatency ! video/x-h264,stream-format=byte-stream,alignment=au,profile=baseline ! multifilesink location="frame-%04d.h264" index=1 +``` +gst-launch-1.0 videotestsrc pattern=ball num-buffers=1500 ! timeoverlay ! videoconvert ! video/x-raw,format=I420,width=1280,height=720,framerate=25/1 ! queue ! x264enc bframes=0 speed-preset=veryfast bitrate=512 byte-stream=TRUE tune=zerolatency key-int-max=25 ! video/x-h264,stream-format=byte-stream,alignment=au,profile=baseline ! multifilesink location="frame-%04d.h264" index=1 ``` Note: since the fps is 25, we need 1500 frames to create a 60 seconds video diff --git a/samples/h264SampleFrames/frame-0001.h264 b/samples/h264SampleFrames/frame-0001.h264 index c22968a107..3e2bf501b7 100644 Binary files a/samples/h264SampleFrames/frame-0001.h264 and b/samples/h264SampleFrames/frame-0001.h264 differ diff --git a/samples/h264SampleFrames/frame-0002.h264 b/samples/h264SampleFrames/frame-0002.h264 index 26a426ef8c..437f912d81 100644 Binary files a/samples/h264SampleFrames/frame-0002.h264 and b/samples/h264SampleFrames/frame-0002.h264 differ diff --git a/samples/h264SampleFrames/frame-0003.h264 b/samples/h264SampleFrames/frame-0003.h264 index dc39cc4ea3..38e0395c86 100644 Binary files a/samples/h264SampleFrames/frame-0003.h264 and b/samples/h264SampleFrames/frame-0003.h264 differ diff --git a/samples/h264SampleFrames/frame-0004.h264 b/samples/h264SampleFrames/frame-0004.h264 index f7afaaeab5..ed2dd86e3a 100644 Binary files a/samples/h264SampleFrames/frame-0004.h264 and b/samples/h264SampleFrames/frame-0004.h264 differ diff --git a/samples/h264SampleFrames/frame-0005.h264 b/samples/h264SampleFrames/frame-0005.h264 index e307bec171..42b2f08aa9 100644 Binary files a/samples/h264SampleFrames/frame-0005.h264 and b/samples/h264SampleFrames/frame-0005.h264 differ diff --git a/samples/h264SampleFrames/frame-0006.h264 b/samples/h264SampleFrames/frame-0006.h264 index de52a750dd..88a8d25ee6 100644 Binary files a/samples/h264SampleFrames/frame-0006.h264 and b/samples/h264SampleFrames/frame-0006.h264 differ diff --git a/samples/h264SampleFrames/frame-0007.h264 b/samples/h264SampleFrames/frame-0007.h264 index 142c888f58..a241438a12 100644 Binary files a/samples/h264SampleFrames/frame-0007.h264 and b/samples/h264SampleFrames/frame-0007.h264 differ diff --git a/samples/h264SampleFrames/frame-0008.h264 b/samples/h264SampleFrames/frame-0008.h264 index 0a9c509d26..2fb236cb1f 100644 Binary files a/samples/h264SampleFrames/frame-0008.h264 and b/samples/h264SampleFrames/frame-0008.h264 differ diff --git a/samples/h264SampleFrames/frame-0009.h264 b/samples/h264SampleFrames/frame-0009.h264 index 7e6817520c..9485c35ff6 100644 Binary files a/samples/h264SampleFrames/frame-0009.h264 and b/samples/h264SampleFrames/frame-0009.h264 differ diff --git a/samples/h264SampleFrames/frame-0010.h264 b/samples/h264SampleFrames/frame-0010.h264 index 1e93ebcdb0..53066cafef 100644 Binary files a/samples/h264SampleFrames/frame-0010.h264 and b/samples/h264SampleFrames/frame-0010.h264 differ diff --git a/samples/h264SampleFrames/frame-0011.h264 b/samples/h264SampleFrames/frame-0011.h264 index 4510cabf1a..c451b3e114 100644 Binary files a/samples/h264SampleFrames/frame-0011.h264 and b/samples/h264SampleFrames/frame-0011.h264 differ diff --git a/samples/h264SampleFrames/frame-0012.h264 b/samples/h264SampleFrames/frame-0012.h264 index 8c5cea8ff8..f00deb340f 100644 Binary files a/samples/h264SampleFrames/frame-0012.h264 and b/samples/h264SampleFrames/frame-0012.h264 differ diff --git a/samples/h264SampleFrames/frame-0013.h264 b/samples/h264SampleFrames/frame-0013.h264 index 3fdda23fd5..83e0d4db04 100644 Binary files a/samples/h264SampleFrames/frame-0013.h264 and b/samples/h264SampleFrames/frame-0013.h264 differ diff --git a/samples/h264SampleFrames/frame-0014.h264 b/samples/h264SampleFrames/frame-0014.h264 index e0831d7e70..2818b02d40 100644 Binary files a/samples/h264SampleFrames/frame-0014.h264 and b/samples/h264SampleFrames/frame-0014.h264 differ diff --git a/samples/h264SampleFrames/frame-0015.h264 b/samples/h264SampleFrames/frame-0015.h264 index ee4e1f05da..18a61a0283 100644 Binary files a/samples/h264SampleFrames/frame-0015.h264 and b/samples/h264SampleFrames/frame-0015.h264 differ diff --git a/samples/h264SampleFrames/frame-0016.h264 b/samples/h264SampleFrames/frame-0016.h264 index 75a60082be..4c7803132c 100644 Binary files a/samples/h264SampleFrames/frame-0016.h264 and b/samples/h264SampleFrames/frame-0016.h264 differ diff --git a/samples/h264SampleFrames/frame-0017.h264 b/samples/h264SampleFrames/frame-0017.h264 index c937ba5a08..3d6a66d13b 100644 Binary files a/samples/h264SampleFrames/frame-0017.h264 and b/samples/h264SampleFrames/frame-0017.h264 differ diff --git a/samples/h264SampleFrames/frame-0018.h264 b/samples/h264SampleFrames/frame-0018.h264 index f258ec0482..80323d4be3 100644 Binary files a/samples/h264SampleFrames/frame-0018.h264 and b/samples/h264SampleFrames/frame-0018.h264 differ diff --git a/samples/h264SampleFrames/frame-0019.h264 b/samples/h264SampleFrames/frame-0019.h264 index 3cc198ea77..629cf78c69 100644 Binary files a/samples/h264SampleFrames/frame-0019.h264 and b/samples/h264SampleFrames/frame-0019.h264 differ diff --git a/samples/h264SampleFrames/frame-0020.h264 b/samples/h264SampleFrames/frame-0020.h264 index 0807910c7c..5fb929cd80 100644 Binary files a/samples/h264SampleFrames/frame-0020.h264 and b/samples/h264SampleFrames/frame-0020.h264 differ diff --git a/samples/h264SampleFrames/frame-0021.h264 b/samples/h264SampleFrames/frame-0021.h264 index 7d74c4b317..466939bcbe 100644 Binary files a/samples/h264SampleFrames/frame-0021.h264 and b/samples/h264SampleFrames/frame-0021.h264 differ diff --git a/samples/h264SampleFrames/frame-0022.h264 b/samples/h264SampleFrames/frame-0022.h264 index 5f7b733d9f..dbaf9793d5 100644 Binary files a/samples/h264SampleFrames/frame-0022.h264 and b/samples/h264SampleFrames/frame-0022.h264 differ diff --git a/samples/h264SampleFrames/frame-0023.h264 b/samples/h264SampleFrames/frame-0023.h264 index f179935b48..fb3ead0e44 100644 Binary files a/samples/h264SampleFrames/frame-0023.h264 and b/samples/h264SampleFrames/frame-0023.h264 differ diff --git a/samples/h264SampleFrames/frame-0024.h264 b/samples/h264SampleFrames/frame-0024.h264 index f1fa2ad4ef..7d7a4a83d3 100644 Binary files a/samples/h264SampleFrames/frame-0024.h264 and b/samples/h264SampleFrames/frame-0024.h264 differ diff --git a/samples/h264SampleFrames/frame-0025.h264 b/samples/h264SampleFrames/frame-0025.h264 index 1954a832bc..c724c06b7b 100644 Binary files a/samples/h264SampleFrames/frame-0025.h264 and b/samples/h264SampleFrames/frame-0025.h264 differ diff --git a/samples/h264SampleFrames/frame-0026.h264 b/samples/h264SampleFrames/frame-0026.h264 index 76a20e2932..230b02ecc7 100644 Binary files a/samples/h264SampleFrames/frame-0026.h264 and b/samples/h264SampleFrames/frame-0026.h264 differ diff --git a/samples/h264SampleFrames/frame-0027.h264 b/samples/h264SampleFrames/frame-0027.h264 index 568097cf3f..0ccdd95b3b 100644 Binary files a/samples/h264SampleFrames/frame-0027.h264 and b/samples/h264SampleFrames/frame-0027.h264 differ diff --git a/samples/h264SampleFrames/frame-0028.h264 b/samples/h264SampleFrames/frame-0028.h264 index 8e690f2ca0..b6de0f22b4 100644 Binary files a/samples/h264SampleFrames/frame-0028.h264 and b/samples/h264SampleFrames/frame-0028.h264 differ diff --git a/samples/h264SampleFrames/frame-0029.h264 b/samples/h264SampleFrames/frame-0029.h264 index f13b8922ed..75817757d1 100644 Binary files a/samples/h264SampleFrames/frame-0029.h264 and b/samples/h264SampleFrames/frame-0029.h264 differ diff --git a/samples/h264SampleFrames/frame-0030.h264 b/samples/h264SampleFrames/frame-0030.h264 index eddcae8368..d8d00264df 100644 Binary files a/samples/h264SampleFrames/frame-0030.h264 and b/samples/h264SampleFrames/frame-0030.h264 differ diff --git a/samples/h264SampleFrames/frame-0031.h264 b/samples/h264SampleFrames/frame-0031.h264 index 4469974581..0619290e60 100644 Binary files a/samples/h264SampleFrames/frame-0031.h264 and b/samples/h264SampleFrames/frame-0031.h264 differ diff --git a/samples/h264SampleFrames/frame-0032.h264 b/samples/h264SampleFrames/frame-0032.h264 index a0cabdde5f..b70b630108 100644 Binary files a/samples/h264SampleFrames/frame-0032.h264 and b/samples/h264SampleFrames/frame-0032.h264 differ diff --git a/samples/h264SampleFrames/frame-0033.h264 b/samples/h264SampleFrames/frame-0033.h264 index a94ae50558..b5ace03636 100644 Binary files a/samples/h264SampleFrames/frame-0033.h264 and b/samples/h264SampleFrames/frame-0033.h264 differ diff --git a/samples/h264SampleFrames/frame-0034.h264 b/samples/h264SampleFrames/frame-0034.h264 index 6e78e66ae5..c69e00c7db 100644 Binary files a/samples/h264SampleFrames/frame-0034.h264 and b/samples/h264SampleFrames/frame-0034.h264 differ diff --git a/samples/h264SampleFrames/frame-0035.h264 b/samples/h264SampleFrames/frame-0035.h264 index 866db8cf80..a1c05e95f7 100644 Binary files a/samples/h264SampleFrames/frame-0035.h264 and b/samples/h264SampleFrames/frame-0035.h264 differ diff --git a/samples/h264SampleFrames/frame-0036.h264 b/samples/h264SampleFrames/frame-0036.h264 index cda3494541..d8126fbcca 100644 Binary files a/samples/h264SampleFrames/frame-0036.h264 and b/samples/h264SampleFrames/frame-0036.h264 differ diff --git a/samples/h264SampleFrames/frame-0037.h264 b/samples/h264SampleFrames/frame-0037.h264 index 6df028b58f..56f3778c7c 100644 Binary files a/samples/h264SampleFrames/frame-0037.h264 and b/samples/h264SampleFrames/frame-0037.h264 differ diff --git a/samples/h264SampleFrames/frame-0038.h264 b/samples/h264SampleFrames/frame-0038.h264 index a1e5799feb..aecefe00a3 100644 Binary files a/samples/h264SampleFrames/frame-0038.h264 and b/samples/h264SampleFrames/frame-0038.h264 differ diff --git a/samples/h264SampleFrames/frame-0039.h264 b/samples/h264SampleFrames/frame-0039.h264 index cc9d36c64b..1698455500 100644 Binary files a/samples/h264SampleFrames/frame-0039.h264 and b/samples/h264SampleFrames/frame-0039.h264 differ diff --git a/samples/h264SampleFrames/frame-0040.h264 b/samples/h264SampleFrames/frame-0040.h264 index 3c605b2d68..6286e5839c 100644 Binary files a/samples/h264SampleFrames/frame-0040.h264 and b/samples/h264SampleFrames/frame-0040.h264 differ diff --git a/samples/h264SampleFrames/frame-0041.h264 b/samples/h264SampleFrames/frame-0041.h264 index 7c03c893a0..197cc82eac 100644 Binary files a/samples/h264SampleFrames/frame-0041.h264 and b/samples/h264SampleFrames/frame-0041.h264 differ diff --git a/samples/h264SampleFrames/frame-0042.h264 b/samples/h264SampleFrames/frame-0042.h264 index 602c55a3dd..e3c12486b2 100644 Binary files a/samples/h264SampleFrames/frame-0042.h264 and b/samples/h264SampleFrames/frame-0042.h264 differ diff --git a/samples/h264SampleFrames/frame-0043.h264 b/samples/h264SampleFrames/frame-0043.h264 index b483c7b3a3..2b358f7376 100644 Binary files a/samples/h264SampleFrames/frame-0043.h264 and b/samples/h264SampleFrames/frame-0043.h264 differ diff --git a/samples/h264SampleFrames/frame-0044.h264 b/samples/h264SampleFrames/frame-0044.h264 index eb482fac33..4785cabdbb 100644 Binary files a/samples/h264SampleFrames/frame-0044.h264 and b/samples/h264SampleFrames/frame-0044.h264 differ diff --git a/samples/h264SampleFrames/frame-0045.h264 b/samples/h264SampleFrames/frame-0045.h264 index c92063ab58..887b1917b8 100644 Binary files a/samples/h264SampleFrames/frame-0045.h264 and b/samples/h264SampleFrames/frame-0045.h264 differ diff --git a/samples/h264SampleFrames/frame-0046.h264 b/samples/h264SampleFrames/frame-0046.h264 index 7c972d5036..15b718fcec 100644 Binary files a/samples/h264SampleFrames/frame-0046.h264 and b/samples/h264SampleFrames/frame-0046.h264 differ diff --git a/samples/h264SampleFrames/frame-0047.h264 b/samples/h264SampleFrames/frame-0047.h264 index fff3400ed7..22cc69fa7c 100644 Binary files a/samples/h264SampleFrames/frame-0047.h264 and b/samples/h264SampleFrames/frame-0047.h264 differ diff --git a/samples/h264SampleFrames/frame-0048.h264 b/samples/h264SampleFrames/frame-0048.h264 index 69049b3060..70b3612855 100644 Binary files a/samples/h264SampleFrames/frame-0048.h264 and b/samples/h264SampleFrames/frame-0048.h264 differ diff --git a/samples/h264SampleFrames/frame-0049.h264 b/samples/h264SampleFrames/frame-0049.h264 index 9e4b28d1b3..8e6b31d578 100644 Binary files a/samples/h264SampleFrames/frame-0049.h264 and b/samples/h264SampleFrames/frame-0049.h264 differ diff --git a/samples/h264SampleFrames/frame-0050.h264 b/samples/h264SampleFrames/frame-0050.h264 index 1465169c66..d2a47779d4 100644 Binary files a/samples/h264SampleFrames/frame-0050.h264 and b/samples/h264SampleFrames/frame-0050.h264 differ diff --git a/samples/h264SampleFrames/frame-0051.h264 b/samples/h264SampleFrames/frame-0051.h264 index 0d5f6e9d72..5ed90ce117 100644 Binary files a/samples/h264SampleFrames/frame-0051.h264 and b/samples/h264SampleFrames/frame-0051.h264 differ diff --git a/samples/h264SampleFrames/frame-0052.h264 b/samples/h264SampleFrames/frame-0052.h264 index a81e5d544f..8fb9c3bc80 100644 Binary files a/samples/h264SampleFrames/frame-0052.h264 and b/samples/h264SampleFrames/frame-0052.h264 differ diff --git a/samples/h264SampleFrames/frame-0053.h264 b/samples/h264SampleFrames/frame-0053.h264 index cfd4d59a85..8c2cf3aa33 100644 Binary files a/samples/h264SampleFrames/frame-0053.h264 and b/samples/h264SampleFrames/frame-0053.h264 differ diff --git a/samples/h264SampleFrames/frame-0054.h264 b/samples/h264SampleFrames/frame-0054.h264 index 655ddeb6e0..e8dd4a12ce 100644 Binary files a/samples/h264SampleFrames/frame-0054.h264 and b/samples/h264SampleFrames/frame-0054.h264 differ diff --git a/samples/h264SampleFrames/frame-0055.h264 b/samples/h264SampleFrames/frame-0055.h264 index 05de97c8ab..848e1ea508 100644 Binary files a/samples/h264SampleFrames/frame-0055.h264 and b/samples/h264SampleFrames/frame-0055.h264 differ diff --git a/samples/h264SampleFrames/frame-0056.h264 b/samples/h264SampleFrames/frame-0056.h264 index f992bf508f..8fdbd0cf6b 100644 Binary files a/samples/h264SampleFrames/frame-0056.h264 and b/samples/h264SampleFrames/frame-0056.h264 differ diff --git a/samples/h264SampleFrames/frame-0057.h264 b/samples/h264SampleFrames/frame-0057.h264 index 7182a112bd..af5712f8ab 100644 Binary files a/samples/h264SampleFrames/frame-0057.h264 and b/samples/h264SampleFrames/frame-0057.h264 differ diff --git a/samples/h264SampleFrames/frame-0058.h264 b/samples/h264SampleFrames/frame-0058.h264 index 9ba87b50f8..218179209f 100644 Binary files a/samples/h264SampleFrames/frame-0058.h264 and b/samples/h264SampleFrames/frame-0058.h264 differ diff --git a/samples/h264SampleFrames/frame-0059.h264 b/samples/h264SampleFrames/frame-0059.h264 index 02dd724fc7..d88160595d 100644 Binary files a/samples/h264SampleFrames/frame-0059.h264 and b/samples/h264SampleFrames/frame-0059.h264 differ diff --git a/samples/h264SampleFrames/frame-0060.h264 b/samples/h264SampleFrames/frame-0060.h264 index 9b554f0362..f945ba77b3 100644 Binary files a/samples/h264SampleFrames/frame-0060.h264 and b/samples/h264SampleFrames/frame-0060.h264 differ diff --git a/samples/h264SampleFrames/frame-0061.h264 b/samples/h264SampleFrames/frame-0061.h264 index 0092a2800d..92f77bd080 100644 Binary files a/samples/h264SampleFrames/frame-0061.h264 and b/samples/h264SampleFrames/frame-0061.h264 differ diff --git a/samples/h264SampleFrames/frame-0062.h264 b/samples/h264SampleFrames/frame-0062.h264 index 7098f745fa..4194cba160 100644 Binary files a/samples/h264SampleFrames/frame-0062.h264 and b/samples/h264SampleFrames/frame-0062.h264 differ diff --git a/samples/h264SampleFrames/frame-0063.h264 b/samples/h264SampleFrames/frame-0063.h264 index 063a9ab133..74173c284e 100644 Binary files a/samples/h264SampleFrames/frame-0063.h264 and b/samples/h264SampleFrames/frame-0063.h264 differ diff --git a/samples/h264SampleFrames/frame-0064.h264 b/samples/h264SampleFrames/frame-0064.h264 index 0ae69a7e6c..36ad2f2d92 100644 Binary files a/samples/h264SampleFrames/frame-0064.h264 and b/samples/h264SampleFrames/frame-0064.h264 differ diff --git a/samples/h264SampleFrames/frame-0065.h264 b/samples/h264SampleFrames/frame-0065.h264 index 626d6dee8f..e2ccb7a5ba 100644 Binary files a/samples/h264SampleFrames/frame-0065.h264 and b/samples/h264SampleFrames/frame-0065.h264 differ diff --git a/samples/h264SampleFrames/frame-0066.h264 b/samples/h264SampleFrames/frame-0066.h264 index d1897919ef..c71c790759 100644 Binary files a/samples/h264SampleFrames/frame-0066.h264 and b/samples/h264SampleFrames/frame-0066.h264 differ diff --git a/samples/h264SampleFrames/frame-0067.h264 b/samples/h264SampleFrames/frame-0067.h264 index 4f208e08eb..6c22a2737d 100644 Binary files a/samples/h264SampleFrames/frame-0067.h264 and b/samples/h264SampleFrames/frame-0067.h264 differ diff --git a/samples/h264SampleFrames/frame-0068.h264 b/samples/h264SampleFrames/frame-0068.h264 index f36aef7b0a..44d4328580 100644 Binary files a/samples/h264SampleFrames/frame-0068.h264 and b/samples/h264SampleFrames/frame-0068.h264 differ diff --git a/samples/h264SampleFrames/frame-0069.h264 b/samples/h264SampleFrames/frame-0069.h264 index 9040389f95..640eb24dcf 100644 Binary files a/samples/h264SampleFrames/frame-0069.h264 and b/samples/h264SampleFrames/frame-0069.h264 differ diff --git a/samples/h264SampleFrames/frame-0070.h264 b/samples/h264SampleFrames/frame-0070.h264 index 6ca8047e22..79f5f77e71 100644 Binary files a/samples/h264SampleFrames/frame-0070.h264 and b/samples/h264SampleFrames/frame-0070.h264 differ diff --git a/samples/h264SampleFrames/frame-0071.h264 b/samples/h264SampleFrames/frame-0071.h264 index 52bc211a2b..1c04be3a8d 100644 Binary files a/samples/h264SampleFrames/frame-0071.h264 and b/samples/h264SampleFrames/frame-0071.h264 differ diff --git a/samples/h264SampleFrames/frame-0072.h264 b/samples/h264SampleFrames/frame-0072.h264 index f2860cd1c2..8f120ceace 100644 Binary files a/samples/h264SampleFrames/frame-0072.h264 and b/samples/h264SampleFrames/frame-0072.h264 differ diff --git a/samples/h264SampleFrames/frame-0073.h264 b/samples/h264SampleFrames/frame-0073.h264 index 909e7e7648..00f8e3645f 100644 Binary files a/samples/h264SampleFrames/frame-0073.h264 and b/samples/h264SampleFrames/frame-0073.h264 differ diff --git a/samples/h264SampleFrames/frame-0074.h264 b/samples/h264SampleFrames/frame-0074.h264 index 49d4bf82b1..9cc3bb0d2b 100644 Binary files a/samples/h264SampleFrames/frame-0074.h264 and b/samples/h264SampleFrames/frame-0074.h264 differ diff --git a/samples/h264SampleFrames/frame-0075.h264 b/samples/h264SampleFrames/frame-0075.h264 index d2908d8b94..48e2313368 100644 Binary files a/samples/h264SampleFrames/frame-0075.h264 and b/samples/h264SampleFrames/frame-0075.h264 differ diff --git a/samples/h264SampleFrames/frame-0076.h264 b/samples/h264SampleFrames/frame-0076.h264 index 89ea86dda0..6a14a014ad 100644 Binary files a/samples/h264SampleFrames/frame-0076.h264 and b/samples/h264SampleFrames/frame-0076.h264 differ diff --git a/samples/h264SampleFrames/frame-0077.h264 b/samples/h264SampleFrames/frame-0077.h264 index 3976a110c5..4e1776bf35 100644 Binary files a/samples/h264SampleFrames/frame-0077.h264 and b/samples/h264SampleFrames/frame-0077.h264 differ diff --git a/samples/h264SampleFrames/frame-0078.h264 b/samples/h264SampleFrames/frame-0078.h264 index 3bc42125c7..a5f58329db 100644 Binary files a/samples/h264SampleFrames/frame-0078.h264 and b/samples/h264SampleFrames/frame-0078.h264 differ diff --git a/samples/h264SampleFrames/frame-0079.h264 b/samples/h264SampleFrames/frame-0079.h264 index 1397d5eb8e..6ff8b4c272 100644 Binary files a/samples/h264SampleFrames/frame-0079.h264 and b/samples/h264SampleFrames/frame-0079.h264 differ diff --git a/samples/h264SampleFrames/frame-0080.h264 b/samples/h264SampleFrames/frame-0080.h264 index c19fd89b2f..ac62036360 100644 Binary files a/samples/h264SampleFrames/frame-0080.h264 and b/samples/h264SampleFrames/frame-0080.h264 differ diff --git a/samples/h264SampleFrames/frame-0081.h264 b/samples/h264SampleFrames/frame-0081.h264 index e995ea180c..2cb3185c1d 100644 Binary files a/samples/h264SampleFrames/frame-0081.h264 and b/samples/h264SampleFrames/frame-0081.h264 differ diff --git a/samples/h264SampleFrames/frame-0082.h264 b/samples/h264SampleFrames/frame-0082.h264 index fb0d8725a0..0b53bd38c0 100644 Binary files a/samples/h264SampleFrames/frame-0082.h264 and b/samples/h264SampleFrames/frame-0082.h264 differ diff --git a/samples/h264SampleFrames/frame-0083.h264 b/samples/h264SampleFrames/frame-0083.h264 index b3c6a29cad..b1b7fe6997 100644 Binary files a/samples/h264SampleFrames/frame-0083.h264 and b/samples/h264SampleFrames/frame-0083.h264 differ diff --git a/samples/h264SampleFrames/frame-0084.h264 b/samples/h264SampleFrames/frame-0084.h264 index 5682468f89..3db69efb61 100644 Binary files a/samples/h264SampleFrames/frame-0084.h264 and b/samples/h264SampleFrames/frame-0084.h264 differ diff --git a/samples/h264SampleFrames/frame-0085.h264 b/samples/h264SampleFrames/frame-0085.h264 index 05a79fddad..ed55c9e9a7 100644 Binary files a/samples/h264SampleFrames/frame-0085.h264 and b/samples/h264SampleFrames/frame-0085.h264 differ diff --git a/samples/h264SampleFrames/frame-0086.h264 b/samples/h264SampleFrames/frame-0086.h264 index d7e8868c1c..bd157f0c65 100644 Binary files a/samples/h264SampleFrames/frame-0086.h264 and b/samples/h264SampleFrames/frame-0086.h264 differ diff --git a/samples/h264SampleFrames/frame-0087.h264 b/samples/h264SampleFrames/frame-0087.h264 index 61f44dcaa8..189b0d480b 100644 Binary files a/samples/h264SampleFrames/frame-0087.h264 and b/samples/h264SampleFrames/frame-0087.h264 differ diff --git a/samples/h264SampleFrames/frame-0088.h264 b/samples/h264SampleFrames/frame-0088.h264 index 88b400b22d..70717e5289 100644 Binary files a/samples/h264SampleFrames/frame-0088.h264 and b/samples/h264SampleFrames/frame-0088.h264 differ diff --git a/samples/h264SampleFrames/frame-0089.h264 b/samples/h264SampleFrames/frame-0089.h264 index 08d5d8c570..8b943eaf97 100644 Binary files a/samples/h264SampleFrames/frame-0089.h264 and b/samples/h264SampleFrames/frame-0089.h264 differ diff --git a/samples/h264SampleFrames/frame-0090.h264 b/samples/h264SampleFrames/frame-0090.h264 index a7b51aade3..4dd7243987 100644 Binary files a/samples/h264SampleFrames/frame-0090.h264 and b/samples/h264SampleFrames/frame-0090.h264 differ diff --git a/samples/h264SampleFrames/frame-0091.h264 b/samples/h264SampleFrames/frame-0091.h264 index 7945434442..110780827e 100644 Binary files a/samples/h264SampleFrames/frame-0091.h264 and b/samples/h264SampleFrames/frame-0091.h264 differ diff --git a/samples/h264SampleFrames/frame-0092.h264 b/samples/h264SampleFrames/frame-0092.h264 index a7e5d74189..c15e0bbaa0 100644 Binary files a/samples/h264SampleFrames/frame-0092.h264 and b/samples/h264SampleFrames/frame-0092.h264 differ diff --git a/samples/h264SampleFrames/frame-0093.h264 b/samples/h264SampleFrames/frame-0093.h264 index 07f5650740..291525143f 100644 Binary files a/samples/h264SampleFrames/frame-0093.h264 and b/samples/h264SampleFrames/frame-0093.h264 differ diff --git a/samples/h264SampleFrames/frame-0094.h264 b/samples/h264SampleFrames/frame-0094.h264 index e13187a9c5..4d63c36503 100644 Binary files a/samples/h264SampleFrames/frame-0094.h264 and b/samples/h264SampleFrames/frame-0094.h264 differ diff --git a/samples/h264SampleFrames/frame-0095.h264 b/samples/h264SampleFrames/frame-0095.h264 index 463dcf3ed5..988dfeb504 100644 Binary files a/samples/h264SampleFrames/frame-0095.h264 and b/samples/h264SampleFrames/frame-0095.h264 differ diff --git a/samples/h264SampleFrames/frame-0096.h264 b/samples/h264SampleFrames/frame-0096.h264 index 8ed139381c..8d8b36fb75 100644 Binary files a/samples/h264SampleFrames/frame-0096.h264 and b/samples/h264SampleFrames/frame-0096.h264 differ diff --git a/samples/h264SampleFrames/frame-0097.h264 b/samples/h264SampleFrames/frame-0097.h264 index f98c74f395..0cba60acaa 100644 Binary files a/samples/h264SampleFrames/frame-0097.h264 and b/samples/h264SampleFrames/frame-0097.h264 differ diff --git a/samples/h264SampleFrames/frame-0098.h264 b/samples/h264SampleFrames/frame-0098.h264 index 8a87870153..70bec1c7ab 100644 Binary files a/samples/h264SampleFrames/frame-0098.h264 and b/samples/h264SampleFrames/frame-0098.h264 differ diff --git a/samples/h264SampleFrames/frame-0099.h264 b/samples/h264SampleFrames/frame-0099.h264 index b1180ed61d..6f714125af 100644 Binary files a/samples/h264SampleFrames/frame-0099.h264 and b/samples/h264SampleFrames/frame-0099.h264 differ diff --git a/samples/h264SampleFrames/frame-0100.h264 b/samples/h264SampleFrames/frame-0100.h264 index 224d524837..4ca231f9eb 100644 Binary files a/samples/h264SampleFrames/frame-0100.h264 and b/samples/h264SampleFrames/frame-0100.h264 differ diff --git a/samples/h264SampleFrames/frame-0101.h264 b/samples/h264SampleFrames/frame-0101.h264 index cb3e1a0803..8a00e2996d 100644 Binary files a/samples/h264SampleFrames/frame-0101.h264 and b/samples/h264SampleFrames/frame-0101.h264 differ diff --git a/samples/h264SampleFrames/frame-0102.h264 b/samples/h264SampleFrames/frame-0102.h264 index 106282b439..7cdaa5ea9d 100644 Binary files a/samples/h264SampleFrames/frame-0102.h264 and b/samples/h264SampleFrames/frame-0102.h264 differ diff --git a/samples/h264SampleFrames/frame-0103.h264 b/samples/h264SampleFrames/frame-0103.h264 index eb0de6e093..8385b601c5 100644 Binary files a/samples/h264SampleFrames/frame-0103.h264 and b/samples/h264SampleFrames/frame-0103.h264 differ diff --git a/samples/h264SampleFrames/frame-0104.h264 b/samples/h264SampleFrames/frame-0104.h264 index 8cf25264be..9895f3ac4f 100644 Binary files a/samples/h264SampleFrames/frame-0104.h264 and b/samples/h264SampleFrames/frame-0104.h264 differ diff --git a/samples/h264SampleFrames/frame-0105.h264 b/samples/h264SampleFrames/frame-0105.h264 index aa83712493..f6526c525b 100644 Binary files a/samples/h264SampleFrames/frame-0105.h264 and b/samples/h264SampleFrames/frame-0105.h264 differ diff --git a/samples/h264SampleFrames/frame-0106.h264 b/samples/h264SampleFrames/frame-0106.h264 index 19be10d14d..dc3d92a8cb 100644 Binary files a/samples/h264SampleFrames/frame-0106.h264 and b/samples/h264SampleFrames/frame-0106.h264 differ diff --git a/samples/h264SampleFrames/frame-0107.h264 b/samples/h264SampleFrames/frame-0107.h264 index 48a6ce5272..b971749971 100644 Binary files a/samples/h264SampleFrames/frame-0107.h264 and b/samples/h264SampleFrames/frame-0107.h264 differ diff --git a/samples/h264SampleFrames/frame-0108.h264 b/samples/h264SampleFrames/frame-0108.h264 index 7f657a36af..bef3ba5aae 100644 Binary files a/samples/h264SampleFrames/frame-0108.h264 and b/samples/h264SampleFrames/frame-0108.h264 differ diff --git a/samples/h264SampleFrames/frame-0109.h264 b/samples/h264SampleFrames/frame-0109.h264 index 6e9c4868dc..6ca2db84a7 100644 Binary files a/samples/h264SampleFrames/frame-0109.h264 and b/samples/h264SampleFrames/frame-0109.h264 differ diff --git a/samples/h264SampleFrames/frame-0110.h264 b/samples/h264SampleFrames/frame-0110.h264 index 8af46c9dd7..5f3ebada97 100644 Binary files a/samples/h264SampleFrames/frame-0110.h264 and b/samples/h264SampleFrames/frame-0110.h264 differ diff --git a/samples/h264SampleFrames/frame-0111.h264 b/samples/h264SampleFrames/frame-0111.h264 index 047f949cd7..9bd880d71c 100644 Binary files a/samples/h264SampleFrames/frame-0111.h264 and b/samples/h264SampleFrames/frame-0111.h264 differ diff --git a/samples/h264SampleFrames/frame-0112.h264 b/samples/h264SampleFrames/frame-0112.h264 index b2bd827d8e..5c09854567 100644 Binary files a/samples/h264SampleFrames/frame-0112.h264 and b/samples/h264SampleFrames/frame-0112.h264 differ diff --git a/samples/h264SampleFrames/frame-0113.h264 b/samples/h264SampleFrames/frame-0113.h264 index bf38dd3e65..e167dd9a29 100644 Binary files a/samples/h264SampleFrames/frame-0113.h264 and b/samples/h264SampleFrames/frame-0113.h264 differ diff --git a/samples/h264SampleFrames/frame-0114.h264 b/samples/h264SampleFrames/frame-0114.h264 index 179af2d6ab..43bc3f22d3 100644 Binary files a/samples/h264SampleFrames/frame-0114.h264 and b/samples/h264SampleFrames/frame-0114.h264 differ diff --git a/samples/h264SampleFrames/frame-0115.h264 b/samples/h264SampleFrames/frame-0115.h264 index 9d46d8c163..aafa90658e 100644 Binary files a/samples/h264SampleFrames/frame-0115.h264 and b/samples/h264SampleFrames/frame-0115.h264 differ diff --git a/samples/h264SampleFrames/frame-0116.h264 b/samples/h264SampleFrames/frame-0116.h264 index 7e9b804167..24ea93aa38 100644 Binary files a/samples/h264SampleFrames/frame-0116.h264 and b/samples/h264SampleFrames/frame-0116.h264 differ diff --git a/samples/h264SampleFrames/frame-0117.h264 b/samples/h264SampleFrames/frame-0117.h264 index 9fad1050cc..95452fc028 100644 Binary files a/samples/h264SampleFrames/frame-0117.h264 and b/samples/h264SampleFrames/frame-0117.h264 differ diff --git a/samples/h264SampleFrames/frame-0118.h264 b/samples/h264SampleFrames/frame-0118.h264 index 6c2510a50d..1ad12f2304 100644 Binary files a/samples/h264SampleFrames/frame-0118.h264 and b/samples/h264SampleFrames/frame-0118.h264 differ diff --git a/samples/h264SampleFrames/frame-0119.h264 b/samples/h264SampleFrames/frame-0119.h264 index 9d4a2113a8..2604b44faa 100644 Binary files a/samples/h264SampleFrames/frame-0119.h264 and b/samples/h264SampleFrames/frame-0119.h264 differ diff --git a/samples/h264SampleFrames/frame-0120.h264 b/samples/h264SampleFrames/frame-0120.h264 index 0784fd1328..4edf221f9a 100644 Binary files a/samples/h264SampleFrames/frame-0120.h264 and b/samples/h264SampleFrames/frame-0120.h264 differ diff --git a/samples/h264SampleFrames/frame-0121.h264 b/samples/h264SampleFrames/frame-0121.h264 index 86b2929737..be079426f5 100644 Binary files a/samples/h264SampleFrames/frame-0121.h264 and b/samples/h264SampleFrames/frame-0121.h264 differ diff --git a/samples/h264SampleFrames/frame-0122.h264 b/samples/h264SampleFrames/frame-0122.h264 index 7e24fea2d6..e89b896d86 100644 Binary files a/samples/h264SampleFrames/frame-0122.h264 and b/samples/h264SampleFrames/frame-0122.h264 differ diff --git a/samples/h264SampleFrames/frame-0123.h264 b/samples/h264SampleFrames/frame-0123.h264 index 61ba0f9999..fb3ed988cd 100644 Binary files a/samples/h264SampleFrames/frame-0123.h264 and b/samples/h264SampleFrames/frame-0123.h264 differ diff --git a/samples/h264SampleFrames/frame-0124.h264 b/samples/h264SampleFrames/frame-0124.h264 index 7b59150b93..da07647ffc 100644 Binary files a/samples/h264SampleFrames/frame-0124.h264 and b/samples/h264SampleFrames/frame-0124.h264 differ diff --git a/samples/h264SampleFrames/frame-0125.h264 b/samples/h264SampleFrames/frame-0125.h264 index ccf0b0f630..88c8f4b384 100644 Binary files a/samples/h264SampleFrames/frame-0125.h264 and b/samples/h264SampleFrames/frame-0125.h264 differ diff --git a/samples/h264SampleFrames/frame-0126.h264 b/samples/h264SampleFrames/frame-0126.h264 index bb728a3819..07a6ca4445 100644 Binary files a/samples/h264SampleFrames/frame-0126.h264 and b/samples/h264SampleFrames/frame-0126.h264 differ diff --git a/samples/h264SampleFrames/frame-0127.h264 b/samples/h264SampleFrames/frame-0127.h264 index 04b6a43f8b..f32f524880 100644 Binary files a/samples/h264SampleFrames/frame-0127.h264 and b/samples/h264SampleFrames/frame-0127.h264 differ diff --git a/samples/h264SampleFrames/frame-0128.h264 b/samples/h264SampleFrames/frame-0128.h264 index 04c1542b25..5877ff622b 100644 Binary files a/samples/h264SampleFrames/frame-0128.h264 and b/samples/h264SampleFrames/frame-0128.h264 differ diff --git a/samples/h264SampleFrames/frame-0129.h264 b/samples/h264SampleFrames/frame-0129.h264 index 282a505142..7e580d26df 100644 Binary files a/samples/h264SampleFrames/frame-0129.h264 and b/samples/h264SampleFrames/frame-0129.h264 differ diff --git a/samples/h264SampleFrames/frame-0130.h264 b/samples/h264SampleFrames/frame-0130.h264 index 08086b92d3..8525d7a7c5 100644 Binary files a/samples/h264SampleFrames/frame-0130.h264 and b/samples/h264SampleFrames/frame-0130.h264 differ diff --git a/samples/h264SampleFrames/frame-0131.h264 b/samples/h264SampleFrames/frame-0131.h264 index dfcd5be491..08ff546812 100644 Binary files a/samples/h264SampleFrames/frame-0131.h264 and b/samples/h264SampleFrames/frame-0131.h264 differ diff --git a/samples/h264SampleFrames/frame-0132.h264 b/samples/h264SampleFrames/frame-0132.h264 index 0252ac71da..da32cfc159 100644 Binary files a/samples/h264SampleFrames/frame-0132.h264 and b/samples/h264SampleFrames/frame-0132.h264 differ diff --git a/samples/h264SampleFrames/frame-0133.h264 b/samples/h264SampleFrames/frame-0133.h264 index ceabe6a663..4c8276f2ae 100644 Binary files a/samples/h264SampleFrames/frame-0133.h264 and b/samples/h264SampleFrames/frame-0133.h264 differ diff --git a/samples/h264SampleFrames/frame-0134.h264 b/samples/h264SampleFrames/frame-0134.h264 index 83086b57ea..5d594a6b03 100644 Binary files a/samples/h264SampleFrames/frame-0134.h264 and b/samples/h264SampleFrames/frame-0134.h264 differ diff --git a/samples/h264SampleFrames/frame-0135.h264 b/samples/h264SampleFrames/frame-0135.h264 index 077a45f204..b8e4165f5e 100644 Binary files a/samples/h264SampleFrames/frame-0135.h264 and b/samples/h264SampleFrames/frame-0135.h264 differ diff --git a/samples/h264SampleFrames/frame-0136.h264 b/samples/h264SampleFrames/frame-0136.h264 index d1cb7785c6..92e16c90ab 100644 Binary files a/samples/h264SampleFrames/frame-0136.h264 and b/samples/h264SampleFrames/frame-0136.h264 differ diff --git a/samples/h264SampleFrames/frame-0137.h264 b/samples/h264SampleFrames/frame-0137.h264 index ca5785ce5d..03a8cab572 100644 Binary files a/samples/h264SampleFrames/frame-0137.h264 and b/samples/h264SampleFrames/frame-0137.h264 differ diff --git a/samples/h264SampleFrames/frame-0138.h264 b/samples/h264SampleFrames/frame-0138.h264 index 9f0d36c322..326b01bc9e 100644 Binary files a/samples/h264SampleFrames/frame-0138.h264 and b/samples/h264SampleFrames/frame-0138.h264 differ diff --git a/samples/h264SampleFrames/frame-0139.h264 b/samples/h264SampleFrames/frame-0139.h264 index 0e5ad83bba..36250ccf35 100644 Binary files a/samples/h264SampleFrames/frame-0139.h264 and b/samples/h264SampleFrames/frame-0139.h264 differ diff --git a/samples/h264SampleFrames/frame-0140.h264 b/samples/h264SampleFrames/frame-0140.h264 index 02625d467a..44b6d96a50 100644 Binary files a/samples/h264SampleFrames/frame-0140.h264 and b/samples/h264SampleFrames/frame-0140.h264 differ diff --git a/samples/h264SampleFrames/frame-0141.h264 b/samples/h264SampleFrames/frame-0141.h264 index 7dc8df4155..0017c28db0 100644 Binary files a/samples/h264SampleFrames/frame-0141.h264 and b/samples/h264SampleFrames/frame-0141.h264 differ diff --git a/samples/h264SampleFrames/frame-0142.h264 b/samples/h264SampleFrames/frame-0142.h264 index 0565398f8c..bcba8e23f1 100644 Binary files a/samples/h264SampleFrames/frame-0142.h264 and b/samples/h264SampleFrames/frame-0142.h264 differ diff --git a/samples/h264SampleFrames/frame-0143.h264 b/samples/h264SampleFrames/frame-0143.h264 index 9cd09c49c3..8a4b207317 100644 Binary files a/samples/h264SampleFrames/frame-0143.h264 and b/samples/h264SampleFrames/frame-0143.h264 differ diff --git a/samples/h264SampleFrames/frame-0144.h264 b/samples/h264SampleFrames/frame-0144.h264 index 9899cbc039..bb98dc28ea 100644 Binary files a/samples/h264SampleFrames/frame-0144.h264 and b/samples/h264SampleFrames/frame-0144.h264 differ diff --git a/samples/h264SampleFrames/frame-0145.h264 b/samples/h264SampleFrames/frame-0145.h264 index eb89e09f6d..d5ce5685a2 100644 Binary files a/samples/h264SampleFrames/frame-0145.h264 and b/samples/h264SampleFrames/frame-0145.h264 differ diff --git a/samples/h264SampleFrames/frame-0146.h264 b/samples/h264SampleFrames/frame-0146.h264 index f4ad47ebc0..118746d05b 100644 Binary files a/samples/h264SampleFrames/frame-0146.h264 and b/samples/h264SampleFrames/frame-0146.h264 differ diff --git a/samples/h264SampleFrames/frame-0147.h264 b/samples/h264SampleFrames/frame-0147.h264 index fc8b8c365e..40a458cb84 100644 Binary files a/samples/h264SampleFrames/frame-0147.h264 and b/samples/h264SampleFrames/frame-0147.h264 differ diff --git a/samples/h264SampleFrames/frame-0148.h264 b/samples/h264SampleFrames/frame-0148.h264 index ac357de783..3c669cf592 100644 Binary files a/samples/h264SampleFrames/frame-0148.h264 and b/samples/h264SampleFrames/frame-0148.h264 differ diff --git a/samples/h264SampleFrames/frame-0149.h264 b/samples/h264SampleFrames/frame-0149.h264 index 05f94a7f89..657f17e844 100644 Binary files a/samples/h264SampleFrames/frame-0149.h264 and b/samples/h264SampleFrames/frame-0149.h264 differ diff --git a/samples/h264SampleFrames/frame-0150.h264 b/samples/h264SampleFrames/frame-0150.h264 index c9adb9432f..8eea12d90e 100644 Binary files a/samples/h264SampleFrames/frame-0150.h264 and b/samples/h264SampleFrames/frame-0150.h264 differ diff --git a/samples/h264SampleFrames/frame-0151.h264 b/samples/h264SampleFrames/frame-0151.h264 index 94ec0f74cb..810645accf 100644 Binary files a/samples/h264SampleFrames/frame-0151.h264 and b/samples/h264SampleFrames/frame-0151.h264 differ diff --git a/samples/h264SampleFrames/frame-0152.h264 b/samples/h264SampleFrames/frame-0152.h264 index 320e79bbbc..fb117bcdf1 100644 Binary files a/samples/h264SampleFrames/frame-0152.h264 and b/samples/h264SampleFrames/frame-0152.h264 differ diff --git a/samples/h264SampleFrames/frame-0153.h264 b/samples/h264SampleFrames/frame-0153.h264 index b9febe5daf..06e41ba6ae 100644 Binary files a/samples/h264SampleFrames/frame-0153.h264 and b/samples/h264SampleFrames/frame-0153.h264 differ diff --git a/samples/h264SampleFrames/frame-0154.h264 b/samples/h264SampleFrames/frame-0154.h264 index 9298a8c69a..e13114f065 100644 Binary files a/samples/h264SampleFrames/frame-0154.h264 and b/samples/h264SampleFrames/frame-0154.h264 differ diff --git a/samples/h264SampleFrames/frame-0155.h264 b/samples/h264SampleFrames/frame-0155.h264 index 39106d59a5..44d7405b0d 100644 Binary files a/samples/h264SampleFrames/frame-0155.h264 and b/samples/h264SampleFrames/frame-0155.h264 differ diff --git a/samples/h264SampleFrames/frame-0156.h264 b/samples/h264SampleFrames/frame-0156.h264 index 31d693fa6d..7d2bfeb354 100644 Binary files a/samples/h264SampleFrames/frame-0156.h264 and b/samples/h264SampleFrames/frame-0156.h264 differ diff --git a/samples/h264SampleFrames/frame-0157.h264 b/samples/h264SampleFrames/frame-0157.h264 index 8fb1b3d62e..d9cdda43bd 100644 Binary files a/samples/h264SampleFrames/frame-0157.h264 and b/samples/h264SampleFrames/frame-0157.h264 differ diff --git a/samples/h264SampleFrames/frame-0158.h264 b/samples/h264SampleFrames/frame-0158.h264 index 620671743c..b343beb679 100644 Binary files a/samples/h264SampleFrames/frame-0158.h264 and b/samples/h264SampleFrames/frame-0158.h264 differ diff --git a/samples/h264SampleFrames/frame-0159.h264 b/samples/h264SampleFrames/frame-0159.h264 index 5af5da4d88..95bcb49751 100644 Binary files a/samples/h264SampleFrames/frame-0159.h264 and b/samples/h264SampleFrames/frame-0159.h264 differ diff --git a/samples/h264SampleFrames/frame-0160.h264 b/samples/h264SampleFrames/frame-0160.h264 index 2624660376..73cfb8067d 100644 Binary files a/samples/h264SampleFrames/frame-0160.h264 and b/samples/h264SampleFrames/frame-0160.h264 differ diff --git a/samples/h264SampleFrames/frame-0161.h264 b/samples/h264SampleFrames/frame-0161.h264 index 9a7c57d7dd..77ef38cbb2 100644 Binary files a/samples/h264SampleFrames/frame-0161.h264 and b/samples/h264SampleFrames/frame-0161.h264 differ diff --git a/samples/h264SampleFrames/frame-0162.h264 b/samples/h264SampleFrames/frame-0162.h264 index 66b77cc41a..14fe305f2c 100644 Binary files a/samples/h264SampleFrames/frame-0162.h264 and b/samples/h264SampleFrames/frame-0162.h264 differ diff --git a/samples/h264SampleFrames/frame-0163.h264 b/samples/h264SampleFrames/frame-0163.h264 index 0cb2db2bb8..74e3527351 100644 Binary files a/samples/h264SampleFrames/frame-0163.h264 and b/samples/h264SampleFrames/frame-0163.h264 differ diff --git a/samples/h264SampleFrames/frame-0164.h264 b/samples/h264SampleFrames/frame-0164.h264 index d890729a37..9ab4db48ab 100644 Binary files a/samples/h264SampleFrames/frame-0164.h264 and b/samples/h264SampleFrames/frame-0164.h264 differ diff --git a/samples/h264SampleFrames/frame-0165.h264 b/samples/h264SampleFrames/frame-0165.h264 index d22c040062..bf275f731c 100644 Binary files a/samples/h264SampleFrames/frame-0165.h264 and b/samples/h264SampleFrames/frame-0165.h264 differ diff --git a/samples/h264SampleFrames/frame-0166.h264 b/samples/h264SampleFrames/frame-0166.h264 index 56e08743a8..7598ed89b3 100644 Binary files a/samples/h264SampleFrames/frame-0166.h264 and b/samples/h264SampleFrames/frame-0166.h264 differ diff --git a/samples/h264SampleFrames/frame-0167.h264 b/samples/h264SampleFrames/frame-0167.h264 index c71d49d1b1..d179cfd3f1 100644 Binary files a/samples/h264SampleFrames/frame-0167.h264 and b/samples/h264SampleFrames/frame-0167.h264 differ diff --git a/samples/h264SampleFrames/frame-0168.h264 b/samples/h264SampleFrames/frame-0168.h264 index 5479a1e7f6..8f9fd03b1a 100644 Binary files a/samples/h264SampleFrames/frame-0168.h264 and b/samples/h264SampleFrames/frame-0168.h264 differ diff --git a/samples/h264SampleFrames/frame-0169.h264 b/samples/h264SampleFrames/frame-0169.h264 index 93d025d54a..2b032ec62c 100644 Binary files a/samples/h264SampleFrames/frame-0169.h264 and b/samples/h264SampleFrames/frame-0169.h264 differ diff --git a/samples/h264SampleFrames/frame-0170.h264 b/samples/h264SampleFrames/frame-0170.h264 index 7703c692ef..22ac3691a0 100644 Binary files a/samples/h264SampleFrames/frame-0170.h264 and b/samples/h264SampleFrames/frame-0170.h264 differ diff --git a/samples/h264SampleFrames/frame-0171.h264 b/samples/h264SampleFrames/frame-0171.h264 index 02d14986e3..6d053f095b 100644 Binary files a/samples/h264SampleFrames/frame-0171.h264 and b/samples/h264SampleFrames/frame-0171.h264 differ diff --git a/samples/h264SampleFrames/frame-0172.h264 b/samples/h264SampleFrames/frame-0172.h264 index 6025abd403..47a35f9b6a 100644 Binary files a/samples/h264SampleFrames/frame-0172.h264 and b/samples/h264SampleFrames/frame-0172.h264 differ diff --git a/samples/h264SampleFrames/frame-0173.h264 b/samples/h264SampleFrames/frame-0173.h264 index 2af8a2f324..833f01757f 100644 Binary files a/samples/h264SampleFrames/frame-0173.h264 and b/samples/h264SampleFrames/frame-0173.h264 differ diff --git a/samples/h264SampleFrames/frame-0174.h264 b/samples/h264SampleFrames/frame-0174.h264 index 2484017e35..12e4f775e3 100644 Binary files a/samples/h264SampleFrames/frame-0174.h264 and b/samples/h264SampleFrames/frame-0174.h264 differ diff --git a/samples/h264SampleFrames/frame-0175.h264 b/samples/h264SampleFrames/frame-0175.h264 index b18e5ed86c..5ba32d1b93 100644 Binary files a/samples/h264SampleFrames/frame-0175.h264 and b/samples/h264SampleFrames/frame-0175.h264 differ diff --git a/samples/h264SampleFrames/frame-0176.h264 b/samples/h264SampleFrames/frame-0176.h264 index 3fa294c774..0e7d8b831e 100644 Binary files a/samples/h264SampleFrames/frame-0176.h264 and b/samples/h264SampleFrames/frame-0176.h264 differ diff --git a/samples/h264SampleFrames/frame-0177.h264 b/samples/h264SampleFrames/frame-0177.h264 index 44c2095609..edb72b58e1 100644 Binary files a/samples/h264SampleFrames/frame-0177.h264 and b/samples/h264SampleFrames/frame-0177.h264 differ diff --git a/samples/h264SampleFrames/frame-0178.h264 b/samples/h264SampleFrames/frame-0178.h264 index 10dcccb0f8..f82fb6e6ce 100644 Binary files a/samples/h264SampleFrames/frame-0178.h264 and b/samples/h264SampleFrames/frame-0178.h264 differ diff --git a/samples/h264SampleFrames/frame-0179.h264 b/samples/h264SampleFrames/frame-0179.h264 index c80ea33409..25d46df0ef 100644 Binary files a/samples/h264SampleFrames/frame-0179.h264 and b/samples/h264SampleFrames/frame-0179.h264 differ diff --git a/samples/h264SampleFrames/frame-0180.h264 b/samples/h264SampleFrames/frame-0180.h264 index 226a52ee14..c72b142b6d 100644 Binary files a/samples/h264SampleFrames/frame-0180.h264 and b/samples/h264SampleFrames/frame-0180.h264 differ diff --git a/samples/h264SampleFrames/frame-0181.h264 b/samples/h264SampleFrames/frame-0181.h264 index d4ae273e0d..6b84643987 100644 Binary files a/samples/h264SampleFrames/frame-0181.h264 and b/samples/h264SampleFrames/frame-0181.h264 differ diff --git a/samples/h264SampleFrames/frame-0182.h264 b/samples/h264SampleFrames/frame-0182.h264 index b8c463b157..9164b0b3d5 100644 Binary files a/samples/h264SampleFrames/frame-0182.h264 and b/samples/h264SampleFrames/frame-0182.h264 differ diff --git a/samples/h264SampleFrames/frame-0183.h264 b/samples/h264SampleFrames/frame-0183.h264 index 5adc338a0a..37b024c3e6 100644 Binary files a/samples/h264SampleFrames/frame-0183.h264 and b/samples/h264SampleFrames/frame-0183.h264 differ diff --git a/samples/h264SampleFrames/frame-0184.h264 b/samples/h264SampleFrames/frame-0184.h264 index 18e7618ed6..aeec222381 100644 Binary files a/samples/h264SampleFrames/frame-0184.h264 and b/samples/h264SampleFrames/frame-0184.h264 differ diff --git a/samples/h264SampleFrames/frame-0185.h264 b/samples/h264SampleFrames/frame-0185.h264 index edf07319d3..46d26967c3 100644 Binary files a/samples/h264SampleFrames/frame-0185.h264 and b/samples/h264SampleFrames/frame-0185.h264 differ diff --git a/samples/h264SampleFrames/frame-0186.h264 b/samples/h264SampleFrames/frame-0186.h264 index e4f175de61..35a4a6030a 100644 Binary files a/samples/h264SampleFrames/frame-0186.h264 and b/samples/h264SampleFrames/frame-0186.h264 differ diff --git a/samples/h264SampleFrames/frame-0187.h264 b/samples/h264SampleFrames/frame-0187.h264 index 7e43ab16f9..986ffe123b 100644 Binary files a/samples/h264SampleFrames/frame-0187.h264 and b/samples/h264SampleFrames/frame-0187.h264 differ diff --git a/samples/h264SampleFrames/frame-0188.h264 b/samples/h264SampleFrames/frame-0188.h264 index 023d2b3116..3a9e999b3e 100644 Binary files a/samples/h264SampleFrames/frame-0188.h264 and b/samples/h264SampleFrames/frame-0188.h264 differ diff --git a/samples/h264SampleFrames/frame-0189.h264 b/samples/h264SampleFrames/frame-0189.h264 index e00595d937..b7b695f268 100644 Binary files a/samples/h264SampleFrames/frame-0189.h264 and b/samples/h264SampleFrames/frame-0189.h264 differ diff --git a/samples/h264SampleFrames/frame-0190.h264 b/samples/h264SampleFrames/frame-0190.h264 index 66e5f46002..b7ed87d920 100644 Binary files a/samples/h264SampleFrames/frame-0190.h264 and b/samples/h264SampleFrames/frame-0190.h264 differ diff --git a/samples/h264SampleFrames/frame-0191.h264 b/samples/h264SampleFrames/frame-0191.h264 index 09ebf039ca..ca876ab6da 100644 Binary files a/samples/h264SampleFrames/frame-0191.h264 and b/samples/h264SampleFrames/frame-0191.h264 differ diff --git a/samples/h264SampleFrames/frame-0192.h264 b/samples/h264SampleFrames/frame-0192.h264 index ab1ac41f3a..e3c512125d 100644 Binary files a/samples/h264SampleFrames/frame-0192.h264 and b/samples/h264SampleFrames/frame-0192.h264 differ diff --git a/samples/h264SampleFrames/frame-0193.h264 b/samples/h264SampleFrames/frame-0193.h264 index f4b2918c56..4d7d548e9f 100644 Binary files a/samples/h264SampleFrames/frame-0193.h264 and b/samples/h264SampleFrames/frame-0193.h264 differ diff --git a/samples/h264SampleFrames/frame-0194.h264 b/samples/h264SampleFrames/frame-0194.h264 index 802a12efe5..fc485c33b1 100644 Binary files a/samples/h264SampleFrames/frame-0194.h264 and b/samples/h264SampleFrames/frame-0194.h264 differ diff --git a/samples/h264SampleFrames/frame-0195.h264 b/samples/h264SampleFrames/frame-0195.h264 index 7ca5b5a776..49f0a509cd 100644 Binary files a/samples/h264SampleFrames/frame-0195.h264 and b/samples/h264SampleFrames/frame-0195.h264 differ diff --git a/samples/h264SampleFrames/frame-0196.h264 b/samples/h264SampleFrames/frame-0196.h264 index 77c81fcdee..c25f2bec68 100644 Binary files a/samples/h264SampleFrames/frame-0196.h264 and b/samples/h264SampleFrames/frame-0196.h264 differ diff --git a/samples/h264SampleFrames/frame-0197.h264 b/samples/h264SampleFrames/frame-0197.h264 index eeed87ed1d..1a865fa9db 100644 Binary files a/samples/h264SampleFrames/frame-0197.h264 and b/samples/h264SampleFrames/frame-0197.h264 differ diff --git a/samples/h264SampleFrames/frame-0198.h264 b/samples/h264SampleFrames/frame-0198.h264 index f1aae0335c..b2aaf9115d 100644 Binary files a/samples/h264SampleFrames/frame-0198.h264 and b/samples/h264SampleFrames/frame-0198.h264 differ diff --git a/samples/h264SampleFrames/frame-0199.h264 b/samples/h264SampleFrames/frame-0199.h264 index 2d3bb1b797..8337fb1feb 100644 Binary files a/samples/h264SampleFrames/frame-0199.h264 and b/samples/h264SampleFrames/frame-0199.h264 differ diff --git a/samples/h264SampleFrames/frame-0200.h264 b/samples/h264SampleFrames/frame-0200.h264 index c4f1898641..d257ad9aea 100644 Binary files a/samples/h264SampleFrames/frame-0200.h264 and b/samples/h264SampleFrames/frame-0200.h264 differ diff --git a/samples/h264SampleFrames/frame-0201.h264 b/samples/h264SampleFrames/frame-0201.h264 index f3c1462459..a3b523d1f7 100644 Binary files a/samples/h264SampleFrames/frame-0201.h264 and b/samples/h264SampleFrames/frame-0201.h264 differ diff --git a/samples/h264SampleFrames/frame-0202.h264 b/samples/h264SampleFrames/frame-0202.h264 index b78bbb256e..3c78e34e40 100644 Binary files a/samples/h264SampleFrames/frame-0202.h264 and b/samples/h264SampleFrames/frame-0202.h264 differ diff --git a/samples/h264SampleFrames/frame-0203.h264 b/samples/h264SampleFrames/frame-0203.h264 index 3a1239c297..85b495b5e7 100644 Binary files a/samples/h264SampleFrames/frame-0203.h264 and b/samples/h264SampleFrames/frame-0203.h264 differ diff --git a/samples/h264SampleFrames/frame-0204.h264 b/samples/h264SampleFrames/frame-0204.h264 index ea62cdf28c..fb810f86bf 100644 Binary files a/samples/h264SampleFrames/frame-0204.h264 and b/samples/h264SampleFrames/frame-0204.h264 differ diff --git a/samples/h264SampleFrames/frame-0205.h264 b/samples/h264SampleFrames/frame-0205.h264 index 71ef6ed0dc..e42f807bf3 100644 Binary files a/samples/h264SampleFrames/frame-0205.h264 and b/samples/h264SampleFrames/frame-0205.h264 differ diff --git a/samples/h264SampleFrames/frame-0206.h264 b/samples/h264SampleFrames/frame-0206.h264 index 417c680b17..7ab7847dbd 100644 Binary files a/samples/h264SampleFrames/frame-0206.h264 and b/samples/h264SampleFrames/frame-0206.h264 differ diff --git a/samples/h264SampleFrames/frame-0207.h264 b/samples/h264SampleFrames/frame-0207.h264 index 9e815eb2ed..97e718b652 100644 Binary files a/samples/h264SampleFrames/frame-0207.h264 and b/samples/h264SampleFrames/frame-0207.h264 differ diff --git a/samples/h264SampleFrames/frame-0208.h264 b/samples/h264SampleFrames/frame-0208.h264 index a3aaa6e123..377f2d2900 100644 Binary files a/samples/h264SampleFrames/frame-0208.h264 and b/samples/h264SampleFrames/frame-0208.h264 differ diff --git a/samples/h264SampleFrames/frame-0209.h264 b/samples/h264SampleFrames/frame-0209.h264 index e10f3e1094..f7a35c21d6 100644 Binary files a/samples/h264SampleFrames/frame-0209.h264 and b/samples/h264SampleFrames/frame-0209.h264 differ diff --git a/samples/h264SampleFrames/frame-0210.h264 b/samples/h264SampleFrames/frame-0210.h264 index 20504740ec..651a8e629c 100644 Binary files a/samples/h264SampleFrames/frame-0210.h264 and b/samples/h264SampleFrames/frame-0210.h264 differ diff --git a/samples/h264SampleFrames/frame-0211.h264 b/samples/h264SampleFrames/frame-0211.h264 index accf4302bb..c61bbeccb5 100644 Binary files a/samples/h264SampleFrames/frame-0211.h264 and b/samples/h264SampleFrames/frame-0211.h264 differ diff --git a/samples/h264SampleFrames/frame-0212.h264 b/samples/h264SampleFrames/frame-0212.h264 index cf93bd95fe..a94164a688 100644 Binary files a/samples/h264SampleFrames/frame-0212.h264 and b/samples/h264SampleFrames/frame-0212.h264 differ diff --git a/samples/h264SampleFrames/frame-0213.h264 b/samples/h264SampleFrames/frame-0213.h264 index 9fb5086cdd..06dd6607bd 100644 Binary files a/samples/h264SampleFrames/frame-0213.h264 and b/samples/h264SampleFrames/frame-0213.h264 differ diff --git a/samples/h264SampleFrames/frame-0214.h264 b/samples/h264SampleFrames/frame-0214.h264 index 0f50938f1b..bb9ed80ab5 100644 Binary files a/samples/h264SampleFrames/frame-0214.h264 and b/samples/h264SampleFrames/frame-0214.h264 differ diff --git a/samples/h264SampleFrames/frame-0215.h264 b/samples/h264SampleFrames/frame-0215.h264 index 65e11d9cf2..12d51957e1 100644 Binary files a/samples/h264SampleFrames/frame-0215.h264 and b/samples/h264SampleFrames/frame-0215.h264 differ diff --git a/samples/h264SampleFrames/frame-0216.h264 b/samples/h264SampleFrames/frame-0216.h264 index 9fcb26451f..36d0428f74 100644 Binary files a/samples/h264SampleFrames/frame-0216.h264 and b/samples/h264SampleFrames/frame-0216.h264 differ diff --git a/samples/h264SampleFrames/frame-0217.h264 b/samples/h264SampleFrames/frame-0217.h264 index 71a4735b2a..4be96f7c98 100644 Binary files a/samples/h264SampleFrames/frame-0217.h264 and b/samples/h264SampleFrames/frame-0217.h264 differ diff --git a/samples/h264SampleFrames/frame-0218.h264 b/samples/h264SampleFrames/frame-0218.h264 index 0074c90431..84e1459dcc 100644 Binary files a/samples/h264SampleFrames/frame-0218.h264 and b/samples/h264SampleFrames/frame-0218.h264 differ diff --git a/samples/h264SampleFrames/frame-0219.h264 b/samples/h264SampleFrames/frame-0219.h264 index 5422ff1a4a..351cfd794f 100644 Binary files a/samples/h264SampleFrames/frame-0219.h264 and b/samples/h264SampleFrames/frame-0219.h264 differ diff --git a/samples/h264SampleFrames/frame-0220.h264 b/samples/h264SampleFrames/frame-0220.h264 index 4107345dad..97f683ce51 100644 Binary files a/samples/h264SampleFrames/frame-0220.h264 and b/samples/h264SampleFrames/frame-0220.h264 differ diff --git a/samples/h264SampleFrames/frame-0221.h264 b/samples/h264SampleFrames/frame-0221.h264 index b46a74c711..547396d496 100644 Binary files a/samples/h264SampleFrames/frame-0221.h264 and b/samples/h264SampleFrames/frame-0221.h264 differ diff --git a/samples/h264SampleFrames/frame-0222.h264 b/samples/h264SampleFrames/frame-0222.h264 index dac870a613..ddfc49be72 100644 Binary files a/samples/h264SampleFrames/frame-0222.h264 and b/samples/h264SampleFrames/frame-0222.h264 differ diff --git a/samples/h264SampleFrames/frame-0223.h264 b/samples/h264SampleFrames/frame-0223.h264 index 985b4cd96e..caa68b125d 100644 Binary files a/samples/h264SampleFrames/frame-0223.h264 and b/samples/h264SampleFrames/frame-0223.h264 differ diff --git a/samples/h264SampleFrames/frame-0224.h264 b/samples/h264SampleFrames/frame-0224.h264 index bb0a987e9e..80c069235b 100644 Binary files a/samples/h264SampleFrames/frame-0224.h264 and b/samples/h264SampleFrames/frame-0224.h264 differ diff --git a/samples/h264SampleFrames/frame-0225.h264 b/samples/h264SampleFrames/frame-0225.h264 index cef3a1e521..adfbb62d53 100644 Binary files a/samples/h264SampleFrames/frame-0225.h264 and b/samples/h264SampleFrames/frame-0225.h264 differ diff --git a/samples/h264SampleFrames/frame-0226.h264 b/samples/h264SampleFrames/frame-0226.h264 index ebdc81ab21..95c371ab5f 100644 Binary files a/samples/h264SampleFrames/frame-0226.h264 and b/samples/h264SampleFrames/frame-0226.h264 differ diff --git a/samples/h264SampleFrames/frame-0227.h264 b/samples/h264SampleFrames/frame-0227.h264 index 641966d003..b6e02846e8 100644 Binary files a/samples/h264SampleFrames/frame-0227.h264 and b/samples/h264SampleFrames/frame-0227.h264 differ diff --git a/samples/h264SampleFrames/frame-0228.h264 b/samples/h264SampleFrames/frame-0228.h264 index 7ad901c69b..71b9ceeadc 100644 Binary files a/samples/h264SampleFrames/frame-0228.h264 and b/samples/h264SampleFrames/frame-0228.h264 differ diff --git a/samples/h264SampleFrames/frame-0229.h264 b/samples/h264SampleFrames/frame-0229.h264 index 29c89c8ee2..cbb406dcb9 100644 Binary files a/samples/h264SampleFrames/frame-0229.h264 and b/samples/h264SampleFrames/frame-0229.h264 differ diff --git a/samples/h264SampleFrames/frame-0230.h264 b/samples/h264SampleFrames/frame-0230.h264 index c9d4163966..01ef825f34 100644 Binary files a/samples/h264SampleFrames/frame-0230.h264 and b/samples/h264SampleFrames/frame-0230.h264 differ diff --git a/samples/h264SampleFrames/frame-0231.h264 b/samples/h264SampleFrames/frame-0231.h264 index 7bdc3dff1e..5e241cb48a 100644 Binary files a/samples/h264SampleFrames/frame-0231.h264 and b/samples/h264SampleFrames/frame-0231.h264 differ diff --git a/samples/h264SampleFrames/frame-0232.h264 b/samples/h264SampleFrames/frame-0232.h264 index 15a78300f9..24b272ca84 100644 Binary files a/samples/h264SampleFrames/frame-0232.h264 and b/samples/h264SampleFrames/frame-0232.h264 differ diff --git a/samples/h264SampleFrames/frame-0233.h264 b/samples/h264SampleFrames/frame-0233.h264 index eaecd51fd5..ea6f4b21f1 100644 Binary files a/samples/h264SampleFrames/frame-0233.h264 and b/samples/h264SampleFrames/frame-0233.h264 differ diff --git a/samples/h264SampleFrames/frame-0234.h264 b/samples/h264SampleFrames/frame-0234.h264 index 4ad1d8a8c1..915354a091 100644 Binary files a/samples/h264SampleFrames/frame-0234.h264 and b/samples/h264SampleFrames/frame-0234.h264 differ diff --git a/samples/h264SampleFrames/frame-0235.h264 b/samples/h264SampleFrames/frame-0235.h264 index d2d3f38ca0..45872e2b9d 100644 Binary files a/samples/h264SampleFrames/frame-0235.h264 and b/samples/h264SampleFrames/frame-0235.h264 differ diff --git a/samples/h264SampleFrames/frame-0236.h264 b/samples/h264SampleFrames/frame-0236.h264 index adfc0698db..89a97f5da0 100644 Binary files a/samples/h264SampleFrames/frame-0236.h264 and b/samples/h264SampleFrames/frame-0236.h264 differ diff --git a/samples/h264SampleFrames/frame-0237.h264 b/samples/h264SampleFrames/frame-0237.h264 index 6a6700f654..6225aa9f49 100644 Binary files a/samples/h264SampleFrames/frame-0237.h264 and b/samples/h264SampleFrames/frame-0237.h264 differ diff --git a/samples/h264SampleFrames/frame-0238.h264 b/samples/h264SampleFrames/frame-0238.h264 index 5234bd9174..dd6f49a0d0 100644 Binary files a/samples/h264SampleFrames/frame-0238.h264 and b/samples/h264SampleFrames/frame-0238.h264 differ diff --git a/samples/h264SampleFrames/frame-0239.h264 b/samples/h264SampleFrames/frame-0239.h264 index e7c1f7ce60..34f08aa3fe 100644 Binary files a/samples/h264SampleFrames/frame-0239.h264 and b/samples/h264SampleFrames/frame-0239.h264 differ diff --git a/samples/h264SampleFrames/frame-0240.h264 b/samples/h264SampleFrames/frame-0240.h264 index a7743a8e90..b10aba88c6 100644 Binary files a/samples/h264SampleFrames/frame-0240.h264 and b/samples/h264SampleFrames/frame-0240.h264 differ diff --git a/samples/h264SampleFrames/frame-0241.h264 b/samples/h264SampleFrames/frame-0241.h264 index 20221a23d9..f046d58e21 100644 Binary files a/samples/h264SampleFrames/frame-0241.h264 and b/samples/h264SampleFrames/frame-0241.h264 differ diff --git a/samples/h264SampleFrames/frame-0242.h264 b/samples/h264SampleFrames/frame-0242.h264 index 2d991a2e71..5f276768c4 100644 Binary files a/samples/h264SampleFrames/frame-0242.h264 and b/samples/h264SampleFrames/frame-0242.h264 differ diff --git a/samples/h264SampleFrames/frame-0243.h264 b/samples/h264SampleFrames/frame-0243.h264 index 258d30e09b..144ac0a225 100644 Binary files a/samples/h264SampleFrames/frame-0243.h264 and b/samples/h264SampleFrames/frame-0243.h264 differ diff --git a/samples/h264SampleFrames/frame-0244.h264 b/samples/h264SampleFrames/frame-0244.h264 index 1668201ddd..46ccc59947 100644 Binary files a/samples/h264SampleFrames/frame-0244.h264 and b/samples/h264SampleFrames/frame-0244.h264 differ diff --git a/samples/h264SampleFrames/frame-0245.h264 b/samples/h264SampleFrames/frame-0245.h264 index d3acb9368d..e608799d75 100644 Binary files a/samples/h264SampleFrames/frame-0245.h264 and b/samples/h264SampleFrames/frame-0245.h264 differ diff --git a/samples/h264SampleFrames/frame-0246.h264 b/samples/h264SampleFrames/frame-0246.h264 index 926b1b5a6b..977c3cf7f8 100644 Binary files a/samples/h264SampleFrames/frame-0246.h264 and b/samples/h264SampleFrames/frame-0246.h264 differ diff --git a/samples/h264SampleFrames/frame-0247.h264 b/samples/h264SampleFrames/frame-0247.h264 index d194b8ca1b..9c050d7f31 100644 Binary files a/samples/h264SampleFrames/frame-0247.h264 and b/samples/h264SampleFrames/frame-0247.h264 differ diff --git a/samples/h264SampleFrames/frame-0248.h264 b/samples/h264SampleFrames/frame-0248.h264 index 854a461da2..f89cd11217 100644 Binary files a/samples/h264SampleFrames/frame-0248.h264 and b/samples/h264SampleFrames/frame-0248.h264 differ diff --git a/samples/h264SampleFrames/frame-0249.h264 b/samples/h264SampleFrames/frame-0249.h264 index a65a5baa1c..8ad66ce943 100644 Binary files a/samples/h264SampleFrames/frame-0249.h264 and b/samples/h264SampleFrames/frame-0249.h264 differ diff --git a/samples/h264SampleFrames/frame-0250.h264 b/samples/h264SampleFrames/frame-0250.h264 index d8de3eca83..af4bf4a063 100644 Binary files a/samples/h264SampleFrames/frame-0250.h264 and b/samples/h264SampleFrames/frame-0250.h264 differ diff --git a/samples/h264SampleFrames/frame-0251.h264 b/samples/h264SampleFrames/frame-0251.h264 index abe8da3003..a4a6f8a009 100644 Binary files a/samples/h264SampleFrames/frame-0251.h264 and b/samples/h264SampleFrames/frame-0251.h264 differ diff --git a/samples/h264SampleFrames/frame-0252.h264 b/samples/h264SampleFrames/frame-0252.h264 index e4c2a03e09..6073832621 100644 Binary files a/samples/h264SampleFrames/frame-0252.h264 and b/samples/h264SampleFrames/frame-0252.h264 differ diff --git a/samples/h264SampleFrames/frame-0253.h264 b/samples/h264SampleFrames/frame-0253.h264 index c07de9e392..ca8532ed39 100644 Binary files a/samples/h264SampleFrames/frame-0253.h264 and b/samples/h264SampleFrames/frame-0253.h264 differ diff --git a/samples/h264SampleFrames/frame-0254.h264 b/samples/h264SampleFrames/frame-0254.h264 index e462ab253d..1e5242e707 100644 Binary files a/samples/h264SampleFrames/frame-0254.h264 and b/samples/h264SampleFrames/frame-0254.h264 differ diff --git a/samples/h264SampleFrames/frame-0255.h264 b/samples/h264SampleFrames/frame-0255.h264 index d70e3635a8..12c5c347e0 100644 Binary files a/samples/h264SampleFrames/frame-0255.h264 and b/samples/h264SampleFrames/frame-0255.h264 differ diff --git a/samples/h264SampleFrames/frame-0256.h264 b/samples/h264SampleFrames/frame-0256.h264 index d439e863b5..9472778a7b 100644 Binary files a/samples/h264SampleFrames/frame-0256.h264 and b/samples/h264SampleFrames/frame-0256.h264 differ diff --git a/samples/h264SampleFrames/frame-0257.h264 b/samples/h264SampleFrames/frame-0257.h264 index 51cfa8468e..3ef77af7f1 100644 Binary files a/samples/h264SampleFrames/frame-0257.h264 and b/samples/h264SampleFrames/frame-0257.h264 differ diff --git a/samples/h264SampleFrames/frame-0258.h264 b/samples/h264SampleFrames/frame-0258.h264 index 233cb6d5ae..9fbc3c2026 100644 Binary files a/samples/h264SampleFrames/frame-0258.h264 and b/samples/h264SampleFrames/frame-0258.h264 differ diff --git a/samples/h264SampleFrames/frame-0259.h264 b/samples/h264SampleFrames/frame-0259.h264 index c2ad241a45..e33915e3b2 100644 Binary files a/samples/h264SampleFrames/frame-0259.h264 and b/samples/h264SampleFrames/frame-0259.h264 differ diff --git a/samples/h264SampleFrames/frame-0260.h264 b/samples/h264SampleFrames/frame-0260.h264 index 58b6916eac..f731eff002 100644 Binary files a/samples/h264SampleFrames/frame-0260.h264 and b/samples/h264SampleFrames/frame-0260.h264 differ diff --git a/samples/h264SampleFrames/frame-0261.h264 b/samples/h264SampleFrames/frame-0261.h264 index 29d6028b88..110ad6891c 100644 Binary files a/samples/h264SampleFrames/frame-0261.h264 and b/samples/h264SampleFrames/frame-0261.h264 differ diff --git a/samples/h264SampleFrames/frame-0262.h264 b/samples/h264SampleFrames/frame-0262.h264 index 4c5a8b2f68..ce2bda04b3 100644 Binary files a/samples/h264SampleFrames/frame-0262.h264 and b/samples/h264SampleFrames/frame-0262.h264 differ diff --git a/samples/h264SampleFrames/frame-0263.h264 b/samples/h264SampleFrames/frame-0263.h264 index f27e9ae0fd..061b833387 100644 Binary files a/samples/h264SampleFrames/frame-0263.h264 and b/samples/h264SampleFrames/frame-0263.h264 differ diff --git a/samples/h264SampleFrames/frame-0264.h264 b/samples/h264SampleFrames/frame-0264.h264 index da424847ba..0c0de2f4bf 100644 Binary files a/samples/h264SampleFrames/frame-0264.h264 and b/samples/h264SampleFrames/frame-0264.h264 differ diff --git a/samples/h264SampleFrames/frame-0265.h264 b/samples/h264SampleFrames/frame-0265.h264 index 6dca7e4ef0..7276a6ceb0 100644 Binary files a/samples/h264SampleFrames/frame-0265.h264 and b/samples/h264SampleFrames/frame-0265.h264 differ diff --git a/samples/h264SampleFrames/frame-0266.h264 b/samples/h264SampleFrames/frame-0266.h264 index 235958767a..256a7c9aed 100644 Binary files a/samples/h264SampleFrames/frame-0266.h264 and b/samples/h264SampleFrames/frame-0266.h264 differ diff --git a/samples/h264SampleFrames/frame-0267.h264 b/samples/h264SampleFrames/frame-0267.h264 index d19e2c1c50..296d3fa91d 100644 Binary files a/samples/h264SampleFrames/frame-0267.h264 and b/samples/h264SampleFrames/frame-0267.h264 differ diff --git a/samples/h264SampleFrames/frame-0268.h264 b/samples/h264SampleFrames/frame-0268.h264 index 3a6fa3beca..aaedccb77a 100644 Binary files a/samples/h264SampleFrames/frame-0268.h264 and b/samples/h264SampleFrames/frame-0268.h264 differ diff --git a/samples/h264SampleFrames/frame-0269.h264 b/samples/h264SampleFrames/frame-0269.h264 index 91dec3eba8..1002d2cc80 100644 Binary files a/samples/h264SampleFrames/frame-0269.h264 and b/samples/h264SampleFrames/frame-0269.h264 differ diff --git a/samples/h264SampleFrames/frame-0270.h264 b/samples/h264SampleFrames/frame-0270.h264 index 5d034caed1..98b6fd5e6c 100644 Binary files a/samples/h264SampleFrames/frame-0270.h264 and b/samples/h264SampleFrames/frame-0270.h264 differ diff --git a/samples/h264SampleFrames/frame-0271.h264 b/samples/h264SampleFrames/frame-0271.h264 index 4616da32f8..51884e7729 100644 Binary files a/samples/h264SampleFrames/frame-0271.h264 and b/samples/h264SampleFrames/frame-0271.h264 differ diff --git a/samples/h264SampleFrames/frame-0272.h264 b/samples/h264SampleFrames/frame-0272.h264 index e03c9cc852..b5077f5694 100644 Binary files a/samples/h264SampleFrames/frame-0272.h264 and b/samples/h264SampleFrames/frame-0272.h264 differ diff --git a/samples/h264SampleFrames/frame-0273.h264 b/samples/h264SampleFrames/frame-0273.h264 index 0ca86ada4d..2e35244eac 100644 Binary files a/samples/h264SampleFrames/frame-0273.h264 and b/samples/h264SampleFrames/frame-0273.h264 differ diff --git a/samples/h264SampleFrames/frame-0274.h264 b/samples/h264SampleFrames/frame-0274.h264 index 2249c243a4..186cdec27b 100644 Binary files a/samples/h264SampleFrames/frame-0274.h264 and b/samples/h264SampleFrames/frame-0274.h264 differ diff --git a/samples/h264SampleFrames/frame-0275.h264 b/samples/h264SampleFrames/frame-0275.h264 index 70ef788da3..bfc340c6c5 100644 Binary files a/samples/h264SampleFrames/frame-0275.h264 and b/samples/h264SampleFrames/frame-0275.h264 differ diff --git a/samples/h264SampleFrames/frame-0276.h264 b/samples/h264SampleFrames/frame-0276.h264 index ae5455d8a5..48a0e04304 100644 Binary files a/samples/h264SampleFrames/frame-0276.h264 and b/samples/h264SampleFrames/frame-0276.h264 differ diff --git a/samples/h264SampleFrames/frame-0277.h264 b/samples/h264SampleFrames/frame-0277.h264 index e0dfab41a8..aa402ee5d2 100644 Binary files a/samples/h264SampleFrames/frame-0277.h264 and b/samples/h264SampleFrames/frame-0277.h264 differ diff --git a/samples/h264SampleFrames/frame-0278.h264 b/samples/h264SampleFrames/frame-0278.h264 index 072756261e..f2cf1ec7d2 100644 Binary files a/samples/h264SampleFrames/frame-0278.h264 and b/samples/h264SampleFrames/frame-0278.h264 differ diff --git a/samples/h264SampleFrames/frame-0279.h264 b/samples/h264SampleFrames/frame-0279.h264 index 361c0171e1..8b667ffe82 100644 Binary files a/samples/h264SampleFrames/frame-0279.h264 and b/samples/h264SampleFrames/frame-0279.h264 differ diff --git a/samples/h264SampleFrames/frame-0280.h264 b/samples/h264SampleFrames/frame-0280.h264 index 3636ccd9b3..619e1b2595 100644 Binary files a/samples/h264SampleFrames/frame-0280.h264 and b/samples/h264SampleFrames/frame-0280.h264 differ diff --git a/samples/h264SampleFrames/frame-0281.h264 b/samples/h264SampleFrames/frame-0281.h264 index be2086cec7..7503f59761 100644 Binary files a/samples/h264SampleFrames/frame-0281.h264 and b/samples/h264SampleFrames/frame-0281.h264 differ diff --git a/samples/h264SampleFrames/frame-0282.h264 b/samples/h264SampleFrames/frame-0282.h264 index ff3bf7ff10..9c725478b0 100644 Binary files a/samples/h264SampleFrames/frame-0282.h264 and b/samples/h264SampleFrames/frame-0282.h264 differ diff --git a/samples/h264SampleFrames/frame-0283.h264 b/samples/h264SampleFrames/frame-0283.h264 index ff79784a94..c60adf3343 100644 Binary files a/samples/h264SampleFrames/frame-0283.h264 and b/samples/h264SampleFrames/frame-0283.h264 differ diff --git a/samples/h264SampleFrames/frame-0284.h264 b/samples/h264SampleFrames/frame-0284.h264 index 2d049bb7f5..8383547b6d 100644 Binary files a/samples/h264SampleFrames/frame-0284.h264 and b/samples/h264SampleFrames/frame-0284.h264 differ diff --git a/samples/h264SampleFrames/frame-0285.h264 b/samples/h264SampleFrames/frame-0285.h264 index 5a2b3e081d..e4b2637cb7 100644 Binary files a/samples/h264SampleFrames/frame-0285.h264 and b/samples/h264SampleFrames/frame-0285.h264 differ diff --git a/samples/h264SampleFrames/frame-0286.h264 b/samples/h264SampleFrames/frame-0286.h264 index a354825cb6..2cf54a90ab 100644 Binary files a/samples/h264SampleFrames/frame-0286.h264 and b/samples/h264SampleFrames/frame-0286.h264 differ diff --git a/samples/h264SampleFrames/frame-0287.h264 b/samples/h264SampleFrames/frame-0287.h264 index 68ce2c4d46..0aca2ef79f 100644 Binary files a/samples/h264SampleFrames/frame-0287.h264 and b/samples/h264SampleFrames/frame-0287.h264 differ diff --git a/samples/h264SampleFrames/frame-0288.h264 b/samples/h264SampleFrames/frame-0288.h264 index 84f393d8fd..920a9074e2 100644 Binary files a/samples/h264SampleFrames/frame-0288.h264 and b/samples/h264SampleFrames/frame-0288.h264 differ diff --git a/samples/h264SampleFrames/frame-0289.h264 b/samples/h264SampleFrames/frame-0289.h264 index 4421cbd545..6681e5e7d5 100644 Binary files a/samples/h264SampleFrames/frame-0289.h264 and b/samples/h264SampleFrames/frame-0289.h264 differ diff --git a/samples/h264SampleFrames/frame-0290.h264 b/samples/h264SampleFrames/frame-0290.h264 index f4a6fce924..cdaf5f35f4 100644 Binary files a/samples/h264SampleFrames/frame-0290.h264 and b/samples/h264SampleFrames/frame-0290.h264 differ diff --git a/samples/h264SampleFrames/frame-0291.h264 b/samples/h264SampleFrames/frame-0291.h264 index c1b5df4ff3..1f11ca0e71 100644 Binary files a/samples/h264SampleFrames/frame-0291.h264 and b/samples/h264SampleFrames/frame-0291.h264 differ diff --git a/samples/h264SampleFrames/frame-0292.h264 b/samples/h264SampleFrames/frame-0292.h264 index 5f47998fb7..3a63a8dc8e 100644 Binary files a/samples/h264SampleFrames/frame-0292.h264 and b/samples/h264SampleFrames/frame-0292.h264 differ diff --git a/samples/h264SampleFrames/frame-0293.h264 b/samples/h264SampleFrames/frame-0293.h264 index d066054774..4914d1e2a6 100644 Binary files a/samples/h264SampleFrames/frame-0293.h264 and b/samples/h264SampleFrames/frame-0293.h264 differ diff --git a/samples/h264SampleFrames/frame-0294.h264 b/samples/h264SampleFrames/frame-0294.h264 index 561a5b2865..dc5b622f83 100644 Binary files a/samples/h264SampleFrames/frame-0294.h264 and b/samples/h264SampleFrames/frame-0294.h264 differ diff --git a/samples/h264SampleFrames/frame-0295.h264 b/samples/h264SampleFrames/frame-0295.h264 index f4d6c7e6ce..9841b7a8ba 100644 Binary files a/samples/h264SampleFrames/frame-0295.h264 and b/samples/h264SampleFrames/frame-0295.h264 differ diff --git a/samples/h264SampleFrames/frame-0296.h264 b/samples/h264SampleFrames/frame-0296.h264 index 0e9dff0105..ae15fb0f12 100644 Binary files a/samples/h264SampleFrames/frame-0296.h264 and b/samples/h264SampleFrames/frame-0296.h264 differ diff --git a/samples/h264SampleFrames/frame-0297.h264 b/samples/h264SampleFrames/frame-0297.h264 index fd53bae75f..5ce426150b 100644 Binary files a/samples/h264SampleFrames/frame-0297.h264 and b/samples/h264SampleFrames/frame-0297.h264 differ diff --git a/samples/h264SampleFrames/frame-0298.h264 b/samples/h264SampleFrames/frame-0298.h264 index a4ea8157f7..1cbd864e42 100644 Binary files a/samples/h264SampleFrames/frame-0298.h264 and b/samples/h264SampleFrames/frame-0298.h264 differ diff --git a/samples/h264SampleFrames/frame-0299.h264 b/samples/h264SampleFrames/frame-0299.h264 index de4d84dd24..96e09b07c6 100644 Binary files a/samples/h264SampleFrames/frame-0299.h264 and b/samples/h264SampleFrames/frame-0299.h264 differ diff --git a/samples/h264SampleFrames/frame-0300.h264 b/samples/h264SampleFrames/frame-0300.h264 index 8d99e01909..8e43292fcc 100644 Binary files a/samples/h264SampleFrames/frame-0300.h264 and b/samples/h264SampleFrames/frame-0300.h264 differ diff --git a/samples/h264SampleFrames/frame-0301.h264 b/samples/h264SampleFrames/frame-0301.h264 index bb680df7a7..81ce154ccc 100644 Binary files a/samples/h264SampleFrames/frame-0301.h264 and b/samples/h264SampleFrames/frame-0301.h264 differ diff --git a/samples/h264SampleFrames/frame-0302.h264 b/samples/h264SampleFrames/frame-0302.h264 index a3d2c29422..fe8c747ca0 100644 Binary files a/samples/h264SampleFrames/frame-0302.h264 and b/samples/h264SampleFrames/frame-0302.h264 differ diff --git a/samples/h264SampleFrames/frame-0303.h264 b/samples/h264SampleFrames/frame-0303.h264 index f22fac9b8e..191d3846e8 100644 Binary files a/samples/h264SampleFrames/frame-0303.h264 and b/samples/h264SampleFrames/frame-0303.h264 differ diff --git a/samples/h264SampleFrames/frame-0304.h264 b/samples/h264SampleFrames/frame-0304.h264 index f93bdeea2d..8d17589e07 100644 Binary files a/samples/h264SampleFrames/frame-0304.h264 and b/samples/h264SampleFrames/frame-0304.h264 differ diff --git a/samples/h264SampleFrames/frame-0305.h264 b/samples/h264SampleFrames/frame-0305.h264 index d8be6dee58..3f6bff72fb 100644 Binary files a/samples/h264SampleFrames/frame-0305.h264 and b/samples/h264SampleFrames/frame-0305.h264 differ diff --git a/samples/h264SampleFrames/frame-0306.h264 b/samples/h264SampleFrames/frame-0306.h264 index 8fbe320e9f..dd3ffabff5 100644 Binary files a/samples/h264SampleFrames/frame-0306.h264 and b/samples/h264SampleFrames/frame-0306.h264 differ diff --git a/samples/h264SampleFrames/frame-0307.h264 b/samples/h264SampleFrames/frame-0307.h264 index 6bbf43c96f..ae07fef4cd 100644 Binary files a/samples/h264SampleFrames/frame-0307.h264 and b/samples/h264SampleFrames/frame-0307.h264 differ diff --git a/samples/h264SampleFrames/frame-0308.h264 b/samples/h264SampleFrames/frame-0308.h264 index 2350ac6248..a132dcad00 100644 Binary files a/samples/h264SampleFrames/frame-0308.h264 and b/samples/h264SampleFrames/frame-0308.h264 differ diff --git a/samples/h264SampleFrames/frame-0309.h264 b/samples/h264SampleFrames/frame-0309.h264 index f3b8a7c812..129883ab3b 100644 Binary files a/samples/h264SampleFrames/frame-0309.h264 and b/samples/h264SampleFrames/frame-0309.h264 differ diff --git a/samples/h264SampleFrames/frame-0310.h264 b/samples/h264SampleFrames/frame-0310.h264 index 9b52230880..a9c4b96a57 100644 Binary files a/samples/h264SampleFrames/frame-0310.h264 and b/samples/h264SampleFrames/frame-0310.h264 differ diff --git a/samples/h264SampleFrames/frame-0311.h264 b/samples/h264SampleFrames/frame-0311.h264 index a5a1ba8211..2c918fcdf6 100644 Binary files a/samples/h264SampleFrames/frame-0311.h264 and b/samples/h264SampleFrames/frame-0311.h264 differ diff --git a/samples/h264SampleFrames/frame-0312.h264 b/samples/h264SampleFrames/frame-0312.h264 index bb050c7a27..8b5ae9948e 100644 Binary files a/samples/h264SampleFrames/frame-0312.h264 and b/samples/h264SampleFrames/frame-0312.h264 differ diff --git a/samples/h264SampleFrames/frame-0313.h264 b/samples/h264SampleFrames/frame-0313.h264 index fd77bc50e6..4da702c9e9 100644 Binary files a/samples/h264SampleFrames/frame-0313.h264 and b/samples/h264SampleFrames/frame-0313.h264 differ diff --git a/samples/h264SampleFrames/frame-0314.h264 b/samples/h264SampleFrames/frame-0314.h264 index 07972f3c92..b8290d4d57 100644 Binary files a/samples/h264SampleFrames/frame-0314.h264 and b/samples/h264SampleFrames/frame-0314.h264 differ diff --git a/samples/h264SampleFrames/frame-0315.h264 b/samples/h264SampleFrames/frame-0315.h264 index a36bf2ac87..8838e59ad1 100644 Binary files a/samples/h264SampleFrames/frame-0315.h264 and b/samples/h264SampleFrames/frame-0315.h264 differ diff --git a/samples/h264SampleFrames/frame-0316.h264 b/samples/h264SampleFrames/frame-0316.h264 index 6f61d0d3e3..86945967dc 100644 Binary files a/samples/h264SampleFrames/frame-0316.h264 and b/samples/h264SampleFrames/frame-0316.h264 differ diff --git a/samples/h264SampleFrames/frame-0317.h264 b/samples/h264SampleFrames/frame-0317.h264 index 34b61a563a..b814ab6213 100644 Binary files a/samples/h264SampleFrames/frame-0317.h264 and b/samples/h264SampleFrames/frame-0317.h264 differ diff --git a/samples/h264SampleFrames/frame-0318.h264 b/samples/h264SampleFrames/frame-0318.h264 index d9632a8b95..df9a54adae 100644 Binary files a/samples/h264SampleFrames/frame-0318.h264 and b/samples/h264SampleFrames/frame-0318.h264 differ diff --git a/samples/h264SampleFrames/frame-0319.h264 b/samples/h264SampleFrames/frame-0319.h264 index 5208db3577..a35884ccee 100644 Binary files a/samples/h264SampleFrames/frame-0319.h264 and b/samples/h264SampleFrames/frame-0319.h264 differ diff --git a/samples/h264SampleFrames/frame-0320.h264 b/samples/h264SampleFrames/frame-0320.h264 index a403ee5cbd..2e4e859d34 100644 Binary files a/samples/h264SampleFrames/frame-0320.h264 and b/samples/h264SampleFrames/frame-0320.h264 differ diff --git a/samples/h264SampleFrames/frame-0321.h264 b/samples/h264SampleFrames/frame-0321.h264 index ce5b1a3aac..e0a57fbc94 100644 Binary files a/samples/h264SampleFrames/frame-0321.h264 and b/samples/h264SampleFrames/frame-0321.h264 differ diff --git a/samples/h264SampleFrames/frame-0322.h264 b/samples/h264SampleFrames/frame-0322.h264 index aa6acea962..61b5188469 100644 Binary files a/samples/h264SampleFrames/frame-0322.h264 and b/samples/h264SampleFrames/frame-0322.h264 differ diff --git a/samples/h264SampleFrames/frame-0323.h264 b/samples/h264SampleFrames/frame-0323.h264 index 4d580507f4..9ed00e519a 100644 Binary files a/samples/h264SampleFrames/frame-0323.h264 and b/samples/h264SampleFrames/frame-0323.h264 differ diff --git a/samples/h264SampleFrames/frame-0324.h264 b/samples/h264SampleFrames/frame-0324.h264 index eca38aba98..292c2d6505 100644 Binary files a/samples/h264SampleFrames/frame-0324.h264 and b/samples/h264SampleFrames/frame-0324.h264 differ diff --git a/samples/h264SampleFrames/frame-0325.h264 b/samples/h264SampleFrames/frame-0325.h264 index f565ddcc17..4a1c67d6e7 100644 Binary files a/samples/h264SampleFrames/frame-0325.h264 and b/samples/h264SampleFrames/frame-0325.h264 differ diff --git a/samples/h264SampleFrames/frame-0326.h264 b/samples/h264SampleFrames/frame-0326.h264 index a0bcfa4b1e..6bf83d689a 100644 Binary files a/samples/h264SampleFrames/frame-0326.h264 and b/samples/h264SampleFrames/frame-0326.h264 differ diff --git a/samples/h264SampleFrames/frame-0327.h264 b/samples/h264SampleFrames/frame-0327.h264 index c392e17b77..647fa4356c 100644 Binary files a/samples/h264SampleFrames/frame-0327.h264 and b/samples/h264SampleFrames/frame-0327.h264 differ diff --git a/samples/h264SampleFrames/frame-0328.h264 b/samples/h264SampleFrames/frame-0328.h264 index 49fb569173..f4cceeb180 100644 Binary files a/samples/h264SampleFrames/frame-0328.h264 and b/samples/h264SampleFrames/frame-0328.h264 differ diff --git a/samples/h264SampleFrames/frame-0329.h264 b/samples/h264SampleFrames/frame-0329.h264 index aaa8c5e843..87e131ebb1 100644 Binary files a/samples/h264SampleFrames/frame-0329.h264 and b/samples/h264SampleFrames/frame-0329.h264 differ diff --git a/samples/h264SampleFrames/frame-0330.h264 b/samples/h264SampleFrames/frame-0330.h264 index af1fce08f3..2db6604f19 100644 Binary files a/samples/h264SampleFrames/frame-0330.h264 and b/samples/h264SampleFrames/frame-0330.h264 differ diff --git a/samples/h264SampleFrames/frame-0331.h264 b/samples/h264SampleFrames/frame-0331.h264 index 05e3711b81..707e2a1ff5 100644 Binary files a/samples/h264SampleFrames/frame-0331.h264 and b/samples/h264SampleFrames/frame-0331.h264 differ diff --git a/samples/h264SampleFrames/frame-0332.h264 b/samples/h264SampleFrames/frame-0332.h264 index eb4611cd6f..ec66ae4e5e 100644 Binary files a/samples/h264SampleFrames/frame-0332.h264 and b/samples/h264SampleFrames/frame-0332.h264 differ diff --git a/samples/h264SampleFrames/frame-0333.h264 b/samples/h264SampleFrames/frame-0333.h264 index 46673f7594..cd10483504 100644 Binary files a/samples/h264SampleFrames/frame-0333.h264 and b/samples/h264SampleFrames/frame-0333.h264 differ diff --git a/samples/h264SampleFrames/frame-0334.h264 b/samples/h264SampleFrames/frame-0334.h264 index 1c0a29c810..ff44a87a9e 100644 Binary files a/samples/h264SampleFrames/frame-0334.h264 and b/samples/h264SampleFrames/frame-0334.h264 differ diff --git a/samples/h264SampleFrames/frame-0335.h264 b/samples/h264SampleFrames/frame-0335.h264 index bd56ad4322..fdc1750089 100644 Binary files a/samples/h264SampleFrames/frame-0335.h264 and b/samples/h264SampleFrames/frame-0335.h264 differ diff --git a/samples/h264SampleFrames/frame-0336.h264 b/samples/h264SampleFrames/frame-0336.h264 index 3c8692e8d6..24fd9f98e9 100644 Binary files a/samples/h264SampleFrames/frame-0336.h264 and b/samples/h264SampleFrames/frame-0336.h264 differ diff --git a/samples/h264SampleFrames/frame-0337.h264 b/samples/h264SampleFrames/frame-0337.h264 index 388f3ee2d1..c10512b9d8 100644 Binary files a/samples/h264SampleFrames/frame-0337.h264 and b/samples/h264SampleFrames/frame-0337.h264 differ diff --git a/samples/h264SampleFrames/frame-0338.h264 b/samples/h264SampleFrames/frame-0338.h264 index b6a1685f93..c35ff54d77 100644 Binary files a/samples/h264SampleFrames/frame-0338.h264 and b/samples/h264SampleFrames/frame-0338.h264 differ diff --git a/samples/h264SampleFrames/frame-0339.h264 b/samples/h264SampleFrames/frame-0339.h264 index 1e7d4e8890..8d98b35ef1 100644 Binary files a/samples/h264SampleFrames/frame-0339.h264 and b/samples/h264SampleFrames/frame-0339.h264 differ diff --git a/samples/h264SampleFrames/frame-0340.h264 b/samples/h264SampleFrames/frame-0340.h264 index 06d00201c3..1cdb5aa57f 100644 Binary files a/samples/h264SampleFrames/frame-0340.h264 and b/samples/h264SampleFrames/frame-0340.h264 differ diff --git a/samples/h264SampleFrames/frame-0341.h264 b/samples/h264SampleFrames/frame-0341.h264 index 96dc7a69cf..18a4bc418a 100644 Binary files a/samples/h264SampleFrames/frame-0341.h264 and b/samples/h264SampleFrames/frame-0341.h264 differ diff --git a/samples/h264SampleFrames/frame-0342.h264 b/samples/h264SampleFrames/frame-0342.h264 index c78d7984e7..732b68d3ef 100644 Binary files a/samples/h264SampleFrames/frame-0342.h264 and b/samples/h264SampleFrames/frame-0342.h264 differ diff --git a/samples/h264SampleFrames/frame-0343.h264 b/samples/h264SampleFrames/frame-0343.h264 index 4bb9b3ff69..e849d722d6 100644 Binary files a/samples/h264SampleFrames/frame-0343.h264 and b/samples/h264SampleFrames/frame-0343.h264 differ diff --git a/samples/h264SampleFrames/frame-0344.h264 b/samples/h264SampleFrames/frame-0344.h264 index 6e08139245..b77b30cb24 100644 Binary files a/samples/h264SampleFrames/frame-0344.h264 and b/samples/h264SampleFrames/frame-0344.h264 differ diff --git a/samples/h264SampleFrames/frame-0345.h264 b/samples/h264SampleFrames/frame-0345.h264 index 9b3300c27e..1826683e07 100644 Binary files a/samples/h264SampleFrames/frame-0345.h264 and b/samples/h264SampleFrames/frame-0345.h264 differ diff --git a/samples/h264SampleFrames/frame-0346.h264 b/samples/h264SampleFrames/frame-0346.h264 index de9ab4035b..db1d0bf28b 100644 Binary files a/samples/h264SampleFrames/frame-0346.h264 and b/samples/h264SampleFrames/frame-0346.h264 differ diff --git a/samples/h264SampleFrames/frame-0347.h264 b/samples/h264SampleFrames/frame-0347.h264 index de0d032f3e..eeaa042b6f 100644 Binary files a/samples/h264SampleFrames/frame-0347.h264 and b/samples/h264SampleFrames/frame-0347.h264 differ diff --git a/samples/h264SampleFrames/frame-0348.h264 b/samples/h264SampleFrames/frame-0348.h264 index 8a0d72d64d..521b8a576c 100644 Binary files a/samples/h264SampleFrames/frame-0348.h264 and b/samples/h264SampleFrames/frame-0348.h264 differ diff --git a/samples/h264SampleFrames/frame-0349.h264 b/samples/h264SampleFrames/frame-0349.h264 index 9787f6e11d..c5ed4951fa 100644 Binary files a/samples/h264SampleFrames/frame-0349.h264 and b/samples/h264SampleFrames/frame-0349.h264 differ diff --git a/samples/h264SampleFrames/frame-0350.h264 b/samples/h264SampleFrames/frame-0350.h264 index 1c565d0681..12aaefc2b9 100644 Binary files a/samples/h264SampleFrames/frame-0350.h264 and b/samples/h264SampleFrames/frame-0350.h264 differ diff --git a/samples/h264SampleFrames/frame-0351.h264 b/samples/h264SampleFrames/frame-0351.h264 index 64c60eda73..5ae20889ca 100644 Binary files a/samples/h264SampleFrames/frame-0351.h264 and b/samples/h264SampleFrames/frame-0351.h264 differ diff --git a/samples/h264SampleFrames/frame-0352.h264 b/samples/h264SampleFrames/frame-0352.h264 index 40b46f6a49..9e866b4d9c 100644 Binary files a/samples/h264SampleFrames/frame-0352.h264 and b/samples/h264SampleFrames/frame-0352.h264 differ diff --git a/samples/h264SampleFrames/frame-0353.h264 b/samples/h264SampleFrames/frame-0353.h264 index 88b9239316..6d4ef761b9 100644 Binary files a/samples/h264SampleFrames/frame-0353.h264 and b/samples/h264SampleFrames/frame-0353.h264 differ diff --git a/samples/h264SampleFrames/frame-0354.h264 b/samples/h264SampleFrames/frame-0354.h264 index 95fdc677df..73d10461fe 100644 Binary files a/samples/h264SampleFrames/frame-0354.h264 and b/samples/h264SampleFrames/frame-0354.h264 differ diff --git a/samples/h264SampleFrames/frame-0355.h264 b/samples/h264SampleFrames/frame-0355.h264 index 77b03b7180..270750b403 100644 Binary files a/samples/h264SampleFrames/frame-0355.h264 and b/samples/h264SampleFrames/frame-0355.h264 differ diff --git a/samples/h264SampleFrames/frame-0356.h264 b/samples/h264SampleFrames/frame-0356.h264 index 7f058ea8fa..ea4880a3aa 100644 Binary files a/samples/h264SampleFrames/frame-0356.h264 and b/samples/h264SampleFrames/frame-0356.h264 differ diff --git a/samples/h264SampleFrames/frame-0357.h264 b/samples/h264SampleFrames/frame-0357.h264 index f219677a1e..e1ac82f2ad 100644 Binary files a/samples/h264SampleFrames/frame-0357.h264 and b/samples/h264SampleFrames/frame-0357.h264 differ diff --git a/samples/h264SampleFrames/frame-0358.h264 b/samples/h264SampleFrames/frame-0358.h264 index 3af6eb8273..fbc9def08c 100644 Binary files a/samples/h264SampleFrames/frame-0358.h264 and b/samples/h264SampleFrames/frame-0358.h264 differ diff --git a/samples/h264SampleFrames/frame-0359.h264 b/samples/h264SampleFrames/frame-0359.h264 index 4a13b31a2c..04d7d323dc 100644 Binary files a/samples/h264SampleFrames/frame-0359.h264 and b/samples/h264SampleFrames/frame-0359.h264 differ diff --git a/samples/h264SampleFrames/frame-0360.h264 b/samples/h264SampleFrames/frame-0360.h264 index 96b2ca4c2a..d5e86d2b19 100644 Binary files a/samples/h264SampleFrames/frame-0360.h264 and b/samples/h264SampleFrames/frame-0360.h264 differ diff --git a/samples/h264SampleFrames/frame-0361.h264 b/samples/h264SampleFrames/frame-0361.h264 index b73b7fd3c6..8a6a6da26a 100644 Binary files a/samples/h264SampleFrames/frame-0361.h264 and b/samples/h264SampleFrames/frame-0361.h264 differ diff --git a/samples/h264SampleFrames/frame-0362.h264 b/samples/h264SampleFrames/frame-0362.h264 index 455e15a0c8..7092ac6945 100644 Binary files a/samples/h264SampleFrames/frame-0362.h264 and b/samples/h264SampleFrames/frame-0362.h264 differ diff --git a/samples/h264SampleFrames/frame-0363.h264 b/samples/h264SampleFrames/frame-0363.h264 index f999f0f5c1..bad5281538 100644 Binary files a/samples/h264SampleFrames/frame-0363.h264 and b/samples/h264SampleFrames/frame-0363.h264 differ diff --git a/samples/h264SampleFrames/frame-0364.h264 b/samples/h264SampleFrames/frame-0364.h264 index 95d05521b9..07cdd524b3 100644 Binary files a/samples/h264SampleFrames/frame-0364.h264 and b/samples/h264SampleFrames/frame-0364.h264 differ diff --git a/samples/h264SampleFrames/frame-0365.h264 b/samples/h264SampleFrames/frame-0365.h264 index d88e23ae30..7d979906e0 100644 Binary files a/samples/h264SampleFrames/frame-0365.h264 and b/samples/h264SampleFrames/frame-0365.h264 differ diff --git a/samples/h264SampleFrames/frame-0366.h264 b/samples/h264SampleFrames/frame-0366.h264 index a72201f28c..1472459f0c 100644 Binary files a/samples/h264SampleFrames/frame-0366.h264 and b/samples/h264SampleFrames/frame-0366.h264 differ diff --git a/samples/h264SampleFrames/frame-0367.h264 b/samples/h264SampleFrames/frame-0367.h264 index 0e5bedb914..5f6c38c42d 100644 Binary files a/samples/h264SampleFrames/frame-0367.h264 and b/samples/h264SampleFrames/frame-0367.h264 differ diff --git a/samples/h264SampleFrames/frame-0368.h264 b/samples/h264SampleFrames/frame-0368.h264 index e3bce77fa3..d1aef023d8 100644 Binary files a/samples/h264SampleFrames/frame-0368.h264 and b/samples/h264SampleFrames/frame-0368.h264 differ diff --git a/samples/h264SampleFrames/frame-0369.h264 b/samples/h264SampleFrames/frame-0369.h264 index bb8642186f..c4df01272e 100644 Binary files a/samples/h264SampleFrames/frame-0369.h264 and b/samples/h264SampleFrames/frame-0369.h264 differ diff --git a/samples/h264SampleFrames/frame-0370.h264 b/samples/h264SampleFrames/frame-0370.h264 index 6910b892af..84e018f98a 100644 Binary files a/samples/h264SampleFrames/frame-0370.h264 and b/samples/h264SampleFrames/frame-0370.h264 differ diff --git a/samples/h264SampleFrames/frame-0371.h264 b/samples/h264SampleFrames/frame-0371.h264 index b93d9ac371..573150e5b4 100644 Binary files a/samples/h264SampleFrames/frame-0371.h264 and b/samples/h264SampleFrames/frame-0371.h264 differ diff --git a/samples/h264SampleFrames/frame-0372.h264 b/samples/h264SampleFrames/frame-0372.h264 index 0f76431fca..ccf85948ac 100644 Binary files a/samples/h264SampleFrames/frame-0372.h264 and b/samples/h264SampleFrames/frame-0372.h264 differ diff --git a/samples/h264SampleFrames/frame-0373.h264 b/samples/h264SampleFrames/frame-0373.h264 index f3b14538eb..e43bce0b79 100644 Binary files a/samples/h264SampleFrames/frame-0373.h264 and b/samples/h264SampleFrames/frame-0373.h264 differ diff --git a/samples/h264SampleFrames/frame-0374.h264 b/samples/h264SampleFrames/frame-0374.h264 index a28e0ac2f4..9d3485dc4d 100644 Binary files a/samples/h264SampleFrames/frame-0374.h264 and b/samples/h264SampleFrames/frame-0374.h264 differ diff --git a/samples/h264SampleFrames/frame-0375.h264 b/samples/h264SampleFrames/frame-0375.h264 index 1ae6c23dd1..0cbb289616 100644 Binary files a/samples/h264SampleFrames/frame-0375.h264 and b/samples/h264SampleFrames/frame-0375.h264 differ diff --git a/samples/h264SampleFrames/frame-0376.h264 b/samples/h264SampleFrames/frame-0376.h264 index 01b8119bac..82a3c19071 100644 Binary files a/samples/h264SampleFrames/frame-0376.h264 and b/samples/h264SampleFrames/frame-0376.h264 differ diff --git a/samples/h264SampleFrames/frame-0377.h264 b/samples/h264SampleFrames/frame-0377.h264 index 4e270b8072..9f90e37a17 100644 Binary files a/samples/h264SampleFrames/frame-0377.h264 and b/samples/h264SampleFrames/frame-0377.h264 differ diff --git a/samples/h264SampleFrames/frame-0378.h264 b/samples/h264SampleFrames/frame-0378.h264 index 470d06568b..928644eabd 100644 Binary files a/samples/h264SampleFrames/frame-0378.h264 and b/samples/h264SampleFrames/frame-0378.h264 differ diff --git a/samples/h264SampleFrames/frame-0379.h264 b/samples/h264SampleFrames/frame-0379.h264 index 463bf427f7..d1aeab3966 100644 Binary files a/samples/h264SampleFrames/frame-0379.h264 and b/samples/h264SampleFrames/frame-0379.h264 differ diff --git a/samples/h264SampleFrames/frame-0380.h264 b/samples/h264SampleFrames/frame-0380.h264 index 2d3e45477f..630f2a7548 100644 Binary files a/samples/h264SampleFrames/frame-0380.h264 and b/samples/h264SampleFrames/frame-0380.h264 differ diff --git a/samples/h264SampleFrames/frame-0381.h264 b/samples/h264SampleFrames/frame-0381.h264 index 3c5e7bf3d6..d53013bded 100644 Binary files a/samples/h264SampleFrames/frame-0381.h264 and b/samples/h264SampleFrames/frame-0381.h264 differ diff --git a/samples/h264SampleFrames/frame-0382.h264 b/samples/h264SampleFrames/frame-0382.h264 index 6872f4a8d2..d031091d74 100644 Binary files a/samples/h264SampleFrames/frame-0382.h264 and b/samples/h264SampleFrames/frame-0382.h264 differ diff --git a/samples/h264SampleFrames/frame-0383.h264 b/samples/h264SampleFrames/frame-0383.h264 index a5260d163a..dbbfb88762 100644 Binary files a/samples/h264SampleFrames/frame-0383.h264 and b/samples/h264SampleFrames/frame-0383.h264 differ diff --git a/samples/h264SampleFrames/frame-0384.h264 b/samples/h264SampleFrames/frame-0384.h264 index a93802439c..f3005e4364 100644 Binary files a/samples/h264SampleFrames/frame-0384.h264 and b/samples/h264SampleFrames/frame-0384.h264 differ diff --git a/samples/h264SampleFrames/frame-0385.h264 b/samples/h264SampleFrames/frame-0385.h264 index 5a92e85be0..7ce20ec813 100644 Binary files a/samples/h264SampleFrames/frame-0385.h264 and b/samples/h264SampleFrames/frame-0385.h264 differ diff --git a/samples/h264SampleFrames/frame-0386.h264 b/samples/h264SampleFrames/frame-0386.h264 index ca30fc9f40..3972a28664 100644 Binary files a/samples/h264SampleFrames/frame-0386.h264 and b/samples/h264SampleFrames/frame-0386.h264 differ diff --git a/samples/h264SampleFrames/frame-0387.h264 b/samples/h264SampleFrames/frame-0387.h264 index 01a07754ce..cafbef40fd 100644 Binary files a/samples/h264SampleFrames/frame-0387.h264 and b/samples/h264SampleFrames/frame-0387.h264 differ diff --git a/samples/h264SampleFrames/frame-0388.h264 b/samples/h264SampleFrames/frame-0388.h264 index 43d70aa33c..cece144649 100644 Binary files a/samples/h264SampleFrames/frame-0388.h264 and b/samples/h264SampleFrames/frame-0388.h264 differ diff --git a/samples/h264SampleFrames/frame-0389.h264 b/samples/h264SampleFrames/frame-0389.h264 index 819cba78ed..e1f112be42 100644 Binary files a/samples/h264SampleFrames/frame-0389.h264 and b/samples/h264SampleFrames/frame-0389.h264 differ diff --git a/samples/h264SampleFrames/frame-0390.h264 b/samples/h264SampleFrames/frame-0390.h264 index 4fd4f5944f..86167eee54 100644 Binary files a/samples/h264SampleFrames/frame-0390.h264 and b/samples/h264SampleFrames/frame-0390.h264 differ diff --git a/samples/h264SampleFrames/frame-0391.h264 b/samples/h264SampleFrames/frame-0391.h264 index d652646be4..db1ebffc26 100644 Binary files a/samples/h264SampleFrames/frame-0391.h264 and b/samples/h264SampleFrames/frame-0391.h264 differ diff --git a/samples/h264SampleFrames/frame-0392.h264 b/samples/h264SampleFrames/frame-0392.h264 index 81b1f945cd..3366079910 100644 Binary files a/samples/h264SampleFrames/frame-0392.h264 and b/samples/h264SampleFrames/frame-0392.h264 differ diff --git a/samples/h264SampleFrames/frame-0393.h264 b/samples/h264SampleFrames/frame-0393.h264 index 6e2289e13d..07a8c5e2ba 100644 Binary files a/samples/h264SampleFrames/frame-0393.h264 and b/samples/h264SampleFrames/frame-0393.h264 differ diff --git a/samples/h264SampleFrames/frame-0394.h264 b/samples/h264SampleFrames/frame-0394.h264 index 726451319e..cf9e729f0e 100644 Binary files a/samples/h264SampleFrames/frame-0394.h264 and b/samples/h264SampleFrames/frame-0394.h264 differ diff --git a/samples/h264SampleFrames/frame-0395.h264 b/samples/h264SampleFrames/frame-0395.h264 index 1e112916a4..8365e241f5 100644 Binary files a/samples/h264SampleFrames/frame-0395.h264 and b/samples/h264SampleFrames/frame-0395.h264 differ diff --git a/samples/h264SampleFrames/frame-0396.h264 b/samples/h264SampleFrames/frame-0396.h264 index 2010e4c968..18d814ccd0 100644 Binary files a/samples/h264SampleFrames/frame-0396.h264 and b/samples/h264SampleFrames/frame-0396.h264 differ diff --git a/samples/h264SampleFrames/frame-0397.h264 b/samples/h264SampleFrames/frame-0397.h264 index 6609160f5b..5eadc5b0be 100644 Binary files a/samples/h264SampleFrames/frame-0397.h264 and b/samples/h264SampleFrames/frame-0397.h264 differ diff --git a/samples/h264SampleFrames/frame-0398.h264 b/samples/h264SampleFrames/frame-0398.h264 index e40477f8a2..add62faaab 100644 Binary files a/samples/h264SampleFrames/frame-0398.h264 and b/samples/h264SampleFrames/frame-0398.h264 differ diff --git a/samples/h264SampleFrames/frame-0399.h264 b/samples/h264SampleFrames/frame-0399.h264 index ad47eea4c7..4fef10faaf 100644 Binary files a/samples/h264SampleFrames/frame-0399.h264 and b/samples/h264SampleFrames/frame-0399.h264 differ diff --git a/samples/h264SampleFrames/frame-0400.h264 b/samples/h264SampleFrames/frame-0400.h264 index 9300a383f5..4eccc8adc2 100644 Binary files a/samples/h264SampleFrames/frame-0400.h264 and b/samples/h264SampleFrames/frame-0400.h264 differ diff --git a/samples/h264SampleFrames/frame-0401.h264 b/samples/h264SampleFrames/frame-0401.h264 index ea708941da..b5d1705922 100644 Binary files a/samples/h264SampleFrames/frame-0401.h264 and b/samples/h264SampleFrames/frame-0401.h264 differ diff --git a/samples/h264SampleFrames/frame-0402.h264 b/samples/h264SampleFrames/frame-0402.h264 index db370a67b9..6c275a46c0 100644 Binary files a/samples/h264SampleFrames/frame-0402.h264 and b/samples/h264SampleFrames/frame-0402.h264 differ diff --git a/samples/h264SampleFrames/frame-0403.h264 b/samples/h264SampleFrames/frame-0403.h264 index 4cd054c0f3..ed45f9666f 100644 Binary files a/samples/h264SampleFrames/frame-0403.h264 and b/samples/h264SampleFrames/frame-0403.h264 differ diff --git a/samples/h264SampleFrames/frame-0404.h264 b/samples/h264SampleFrames/frame-0404.h264 index 6d0036dbe5..716f147f1c 100644 Binary files a/samples/h264SampleFrames/frame-0404.h264 and b/samples/h264SampleFrames/frame-0404.h264 differ diff --git a/samples/h264SampleFrames/frame-0405.h264 b/samples/h264SampleFrames/frame-0405.h264 index cc3bf5a089..3fd9f494ff 100644 Binary files a/samples/h264SampleFrames/frame-0405.h264 and b/samples/h264SampleFrames/frame-0405.h264 differ diff --git a/samples/h264SampleFrames/frame-0406.h264 b/samples/h264SampleFrames/frame-0406.h264 index 4b1931ebb4..d9138a538e 100644 Binary files a/samples/h264SampleFrames/frame-0406.h264 and b/samples/h264SampleFrames/frame-0406.h264 differ diff --git a/samples/h264SampleFrames/frame-0407.h264 b/samples/h264SampleFrames/frame-0407.h264 index a66399c89e..36e3dd7a3b 100644 Binary files a/samples/h264SampleFrames/frame-0407.h264 and b/samples/h264SampleFrames/frame-0407.h264 differ diff --git a/samples/h264SampleFrames/frame-0408.h264 b/samples/h264SampleFrames/frame-0408.h264 index 9580bafa48..7b83a5b277 100644 Binary files a/samples/h264SampleFrames/frame-0408.h264 and b/samples/h264SampleFrames/frame-0408.h264 differ diff --git a/samples/h264SampleFrames/frame-0409.h264 b/samples/h264SampleFrames/frame-0409.h264 index 1e7f8fb98a..c473a7236d 100644 Binary files a/samples/h264SampleFrames/frame-0409.h264 and b/samples/h264SampleFrames/frame-0409.h264 differ diff --git a/samples/h264SampleFrames/frame-0410.h264 b/samples/h264SampleFrames/frame-0410.h264 index f24bfb0378..50d3890cd4 100644 Binary files a/samples/h264SampleFrames/frame-0410.h264 and b/samples/h264SampleFrames/frame-0410.h264 differ diff --git a/samples/h264SampleFrames/frame-0411.h264 b/samples/h264SampleFrames/frame-0411.h264 index 5affdb92d5..6040f68dcf 100644 Binary files a/samples/h264SampleFrames/frame-0411.h264 and b/samples/h264SampleFrames/frame-0411.h264 differ diff --git a/samples/h264SampleFrames/frame-0412.h264 b/samples/h264SampleFrames/frame-0412.h264 index a2c5c009fc..6c20608a8d 100644 Binary files a/samples/h264SampleFrames/frame-0412.h264 and b/samples/h264SampleFrames/frame-0412.h264 differ diff --git a/samples/h264SampleFrames/frame-0413.h264 b/samples/h264SampleFrames/frame-0413.h264 index de107b084d..1c5d863dd4 100644 Binary files a/samples/h264SampleFrames/frame-0413.h264 and b/samples/h264SampleFrames/frame-0413.h264 differ diff --git a/samples/h264SampleFrames/frame-0414.h264 b/samples/h264SampleFrames/frame-0414.h264 index 677d307aef..a6d1647b35 100644 Binary files a/samples/h264SampleFrames/frame-0414.h264 and b/samples/h264SampleFrames/frame-0414.h264 differ diff --git a/samples/h264SampleFrames/frame-0415.h264 b/samples/h264SampleFrames/frame-0415.h264 index 621e730cb5..8c1e99fdb4 100644 Binary files a/samples/h264SampleFrames/frame-0415.h264 and b/samples/h264SampleFrames/frame-0415.h264 differ diff --git a/samples/h264SampleFrames/frame-0416.h264 b/samples/h264SampleFrames/frame-0416.h264 index b85d62bba2..eea3480ec3 100644 Binary files a/samples/h264SampleFrames/frame-0416.h264 and b/samples/h264SampleFrames/frame-0416.h264 differ diff --git a/samples/h264SampleFrames/frame-0417.h264 b/samples/h264SampleFrames/frame-0417.h264 index 407c7b2637..646725fb73 100644 Binary files a/samples/h264SampleFrames/frame-0417.h264 and b/samples/h264SampleFrames/frame-0417.h264 differ diff --git a/samples/h264SampleFrames/frame-0418.h264 b/samples/h264SampleFrames/frame-0418.h264 index 8da22de638..65d35e6bb0 100644 Binary files a/samples/h264SampleFrames/frame-0418.h264 and b/samples/h264SampleFrames/frame-0418.h264 differ diff --git a/samples/h264SampleFrames/frame-0419.h264 b/samples/h264SampleFrames/frame-0419.h264 index 724da00b33..d470279bb6 100644 Binary files a/samples/h264SampleFrames/frame-0419.h264 and b/samples/h264SampleFrames/frame-0419.h264 differ diff --git a/samples/h264SampleFrames/frame-0420.h264 b/samples/h264SampleFrames/frame-0420.h264 index e7719791a8..12ef78cdff 100644 Binary files a/samples/h264SampleFrames/frame-0420.h264 and b/samples/h264SampleFrames/frame-0420.h264 differ diff --git a/samples/h264SampleFrames/frame-0421.h264 b/samples/h264SampleFrames/frame-0421.h264 index 4f60c9aa84..d21ef65e07 100644 Binary files a/samples/h264SampleFrames/frame-0421.h264 and b/samples/h264SampleFrames/frame-0421.h264 differ diff --git a/samples/h264SampleFrames/frame-0422.h264 b/samples/h264SampleFrames/frame-0422.h264 index 011449ce6a..87178e762a 100644 Binary files a/samples/h264SampleFrames/frame-0422.h264 and b/samples/h264SampleFrames/frame-0422.h264 differ diff --git a/samples/h264SampleFrames/frame-0423.h264 b/samples/h264SampleFrames/frame-0423.h264 index 156fafc0f0..06f0d3ba7b 100644 Binary files a/samples/h264SampleFrames/frame-0423.h264 and b/samples/h264SampleFrames/frame-0423.h264 differ diff --git a/samples/h264SampleFrames/frame-0424.h264 b/samples/h264SampleFrames/frame-0424.h264 index 6f5bbae383..72e5f0bcc8 100644 Binary files a/samples/h264SampleFrames/frame-0424.h264 and b/samples/h264SampleFrames/frame-0424.h264 differ diff --git a/samples/h264SampleFrames/frame-0425.h264 b/samples/h264SampleFrames/frame-0425.h264 index 3a3cdc9e66..b7e257870b 100644 Binary files a/samples/h264SampleFrames/frame-0425.h264 and b/samples/h264SampleFrames/frame-0425.h264 differ diff --git a/samples/h264SampleFrames/frame-0426.h264 b/samples/h264SampleFrames/frame-0426.h264 index b6a0caaf33..b834ff315f 100644 Binary files a/samples/h264SampleFrames/frame-0426.h264 and b/samples/h264SampleFrames/frame-0426.h264 differ diff --git a/samples/h264SampleFrames/frame-0427.h264 b/samples/h264SampleFrames/frame-0427.h264 index 0f72c21342..b539bf48b6 100644 Binary files a/samples/h264SampleFrames/frame-0427.h264 and b/samples/h264SampleFrames/frame-0427.h264 differ diff --git a/samples/h264SampleFrames/frame-0428.h264 b/samples/h264SampleFrames/frame-0428.h264 index 709851ec25..c62e3e658e 100644 Binary files a/samples/h264SampleFrames/frame-0428.h264 and b/samples/h264SampleFrames/frame-0428.h264 differ diff --git a/samples/h264SampleFrames/frame-0429.h264 b/samples/h264SampleFrames/frame-0429.h264 index 79865c5082..ea02df24de 100644 Binary files a/samples/h264SampleFrames/frame-0429.h264 and b/samples/h264SampleFrames/frame-0429.h264 differ diff --git a/samples/h264SampleFrames/frame-0430.h264 b/samples/h264SampleFrames/frame-0430.h264 index c78437c68b..556274878a 100644 Binary files a/samples/h264SampleFrames/frame-0430.h264 and b/samples/h264SampleFrames/frame-0430.h264 differ diff --git a/samples/h264SampleFrames/frame-0431.h264 b/samples/h264SampleFrames/frame-0431.h264 index ce1d1a3e12..62ae7a989f 100644 Binary files a/samples/h264SampleFrames/frame-0431.h264 and b/samples/h264SampleFrames/frame-0431.h264 differ diff --git a/samples/h264SampleFrames/frame-0432.h264 b/samples/h264SampleFrames/frame-0432.h264 index d5542600b2..546dff0eae 100644 Binary files a/samples/h264SampleFrames/frame-0432.h264 and b/samples/h264SampleFrames/frame-0432.h264 differ diff --git a/samples/h264SampleFrames/frame-0433.h264 b/samples/h264SampleFrames/frame-0433.h264 index 3ebb4a7f87..ac440139c1 100644 Binary files a/samples/h264SampleFrames/frame-0433.h264 and b/samples/h264SampleFrames/frame-0433.h264 differ diff --git a/samples/h264SampleFrames/frame-0434.h264 b/samples/h264SampleFrames/frame-0434.h264 index 83853bfa35..c523cf6339 100644 Binary files a/samples/h264SampleFrames/frame-0434.h264 and b/samples/h264SampleFrames/frame-0434.h264 differ diff --git a/samples/h264SampleFrames/frame-0435.h264 b/samples/h264SampleFrames/frame-0435.h264 index a10c050a8c..6196ee16f0 100644 Binary files a/samples/h264SampleFrames/frame-0435.h264 and b/samples/h264SampleFrames/frame-0435.h264 differ diff --git a/samples/h264SampleFrames/frame-0436.h264 b/samples/h264SampleFrames/frame-0436.h264 index 0d9c8726fd..c20da69046 100644 Binary files a/samples/h264SampleFrames/frame-0436.h264 and b/samples/h264SampleFrames/frame-0436.h264 differ diff --git a/samples/h264SampleFrames/frame-0437.h264 b/samples/h264SampleFrames/frame-0437.h264 index 778d4baacd..179704ca4b 100644 Binary files a/samples/h264SampleFrames/frame-0437.h264 and b/samples/h264SampleFrames/frame-0437.h264 differ diff --git a/samples/h264SampleFrames/frame-0438.h264 b/samples/h264SampleFrames/frame-0438.h264 index 65f22de928..239052ddd0 100644 Binary files a/samples/h264SampleFrames/frame-0438.h264 and b/samples/h264SampleFrames/frame-0438.h264 differ diff --git a/samples/h264SampleFrames/frame-0439.h264 b/samples/h264SampleFrames/frame-0439.h264 index 288f24952a..1abe445499 100644 Binary files a/samples/h264SampleFrames/frame-0439.h264 and b/samples/h264SampleFrames/frame-0439.h264 differ diff --git a/samples/h264SampleFrames/frame-0440.h264 b/samples/h264SampleFrames/frame-0440.h264 index 06ea83514b..21b56f9e7d 100644 Binary files a/samples/h264SampleFrames/frame-0440.h264 and b/samples/h264SampleFrames/frame-0440.h264 differ diff --git a/samples/h264SampleFrames/frame-0441.h264 b/samples/h264SampleFrames/frame-0441.h264 index 0b7579b57b..df99df3902 100644 Binary files a/samples/h264SampleFrames/frame-0441.h264 and b/samples/h264SampleFrames/frame-0441.h264 differ diff --git a/samples/h264SampleFrames/frame-0442.h264 b/samples/h264SampleFrames/frame-0442.h264 index 780f9bb0d2..e9178e2865 100644 Binary files a/samples/h264SampleFrames/frame-0442.h264 and b/samples/h264SampleFrames/frame-0442.h264 differ diff --git a/samples/h264SampleFrames/frame-0443.h264 b/samples/h264SampleFrames/frame-0443.h264 index 9a89da7c07..d6183d5256 100644 Binary files a/samples/h264SampleFrames/frame-0443.h264 and b/samples/h264SampleFrames/frame-0443.h264 differ diff --git a/samples/h264SampleFrames/frame-0444.h264 b/samples/h264SampleFrames/frame-0444.h264 index 9a8a046abc..43cac8da60 100644 Binary files a/samples/h264SampleFrames/frame-0444.h264 and b/samples/h264SampleFrames/frame-0444.h264 differ diff --git a/samples/h264SampleFrames/frame-0445.h264 b/samples/h264SampleFrames/frame-0445.h264 index 7d77b110e7..1d9825c918 100644 Binary files a/samples/h264SampleFrames/frame-0445.h264 and b/samples/h264SampleFrames/frame-0445.h264 differ diff --git a/samples/h264SampleFrames/frame-0446.h264 b/samples/h264SampleFrames/frame-0446.h264 index cc0143072b..426451dcbf 100644 Binary files a/samples/h264SampleFrames/frame-0446.h264 and b/samples/h264SampleFrames/frame-0446.h264 differ diff --git a/samples/h264SampleFrames/frame-0447.h264 b/samples/h264SampleFrames/frame-0447.h264 index dc18f9e3a7..f1c05986b5 100644 Binary files a/samples/h264SampleFrames/frame-0447.h264 and b/samples/h264SampleFrames/frame-0447.h264 differ diff --git a/samples/h264SampleFrames/frame-0448.h264 b/samples/h264SampleFrames/frame-0448.h264 index fbfd8c3b02..b8b3015efe 100644 Binary files a/samples/h264SampleFrames/frame-0448.h264 and b/samples/h264SampleFrames/frame-0448.h264 differ diff --git a/samples/h264SampleFrames/frame-0449.h264 b/samples/h264SampleFrames/frame-0449.h264 index 9ecab2076e..1a43e3ffe4 100644 Binary files a/samples/h264SampleFrames/frame-0449.h264 and b/samples/h264SampleFrames/frame-0449.h264 differ diff --git a/samples/h264SampleFrames/frame-0450.h264 b/samples/h264SampleFrames/frame-0450.h264 index 554d5b32a1..0f83e54605 100644 Binary files a/samples/h264SampleFrames/frame-0450.h264 and b/samples/h264SampleFrames/frame-0450.h264 differ diff --git a/samples/h264SampleFrames/frame-0451.h264 b/samples/h264SampleFrames/frame-0451.h264 index 03db2b74a9..16fa0b9d80 100644 Binary files a/samples/h264SampleFrames/frame-0451.h264 and b/samples/h264SampleFrames/frame-0451.h264 differ diff --git a/samples/h264SampleFrames/frame-0452.h264 b/samples/h264SampleFrames/frame-0452.h264 index 974b4634f8..2835b5ce1c 100644 Binary files a/samples/h264SampleFrames/frame-0452.h264 and b/samples/h264SampleFrames/frame-0452.h264 differ diff --git a/samples/h264SampleFrames/frame-0453.h264 b/samples/h264SampleFrames/frame-0453.h264 index a0684869a9..42419ec4fc 100644 Binary files a/samples/h264SampleFrames/frame-0453.h264 and b/samples/h264SampleFrames/frame-0453.h264 differ diff --git a/samples/h264SampleFrames/frame-0454.h264 b/samples/h264SampleFrames/frame-0454.h264 index 335b6b3035..faa9986117 100644 Binary files a/samples/h264SampleFrames/frame-0454.h264 and b/samples/h264SampleFrames/frame-0454.h264 differ diff --git a/samples/h264SampleFrames/frame-0455.h264 b/samples/h264SampleFrames/frame-0455.h264 index da4175aff8..6d572836ac 100644 Binary files a/samples/h264SampleFrames/frame-0455.h264 and b/samples/h264SampleFrames/frame-0455.h264 differ diff --git a/samples/h264SampleFrames/frame-0456.h264 b/samples/h264SampleFrames/frame-0456.h264 index 4fc0f660d2..d564031f73 100644 Binary files a/samples/h264SampleFrames/frame-0456.h264 and b/samples/h264SampleFrames/frame-0456.h264 differ diff --git a/samples/h264SampleFrames/frame-0457.h264 b/samples/h264SampleFrames/frame-0457.h264 index f28c8d53b9..ea8f731c33 100644 Binary files a/samples/h264SampleFrames/frame-0457.h264 and b/samples/h264SampleFrames/frame-0457.h264 differ diff --git a/samples/h264SampleFrames/frame-0458.h264 b/samples/h264SampleFrames/frame-0458.h264 index 4903e69bba..0cbdd5fa4a 100644 Binary files a/samples/h264SampleFrames/frame-0458.h264 and b/samples/h264SampleFrames/frame-0458.h264 differ diff --git a/samples/h264SampleFrames/frame-0459.h264 b/samples/h264SampleFrames/frame-0459.h264 index 7b192d9540..e93807c6b5 100644 Binary files a/samples/h264SampleFrames/frame-0459.h264 and b/samples/h264SampleFrames/frame-0459.h264 differ diff --git a/samples/h264SampleFrames/frame-0460.h264 b/samples/h264SampleFrames/frame-0460.h264 index ae52b59832..f54e1fdd2d 100644 Binary files a/samples/h264SampleFrames/frame-0460.h264 and b/samples/h264SampleFrames/frame-0460.h264 differ diff --git a/samples/h264SampleFrames/frame-0461.h264 b/samples/h264SampleFrames/frame-0461.h264 index 8062c68f15..100e6df50d 100644 Binary files a/samples/h264SampleFrames/frame-0461.h264 and b/samples/h264SampleFrames/frame-0461.h264 differ diff --git a/samples/h264SampleFrames/frame-0462.h264 b/samples/h264SampleFrames/frame-0462.h264 index 98f3dbf200..ad1ece85fe 100644 Binary files a/samples/h264SampleFrames/frame-0462.h264 and b/samples/h264SampleFrames/frame-0462.h264 differ diff --git a/samples/h264SampleFrames/frame-0463.h264 b/samples/h264SampleFrames/frame-0463.h264 index 979076f4d8..f219b3d4fb 100644 Binary files a/samples/h264SampleFrames/frame-0463.h264 and b/samples/h264SampleFrames/frame-0463.h264 differ diff --git a/samples/h264SampleFrames/frame-0464.h264 b/samples/h264SampleFrames/frame-0464.h264 index c9d2e17c69..dcaf121086 100644 Binary files a/samples/h264SampleFrames/frame-0464.h264 and b/samples/h264SampleFrames/frame-0464.h264 differ diff --git a/samples/h264SampleFrames/frame-0465.h264 b/samples/h264SampleFrames/frame-0465.h264 index 4331d9a3ef..8d1a18cc01 100644 Binary files a/samples/h264SampleFrames/frame-0465.h264 and b/samples/h264SampleFrames/frame-0465.h264 differ diff --git a/samples/h264SampleFrames/frame-0466.h264 b/samples/h264SampleFrames/frame-0466.h264 index 905962a1ca..e344957ff4 100644 Binary files a/samples/h264SampleFrames/frame-0466.h264 and b/samples/h264SampleFrames/frame-0466.h264 differ diff --git a/samples/h264SampleFrames/frame-0467.h264 b/samples/h264SampleFrames/frame-0467.h264 index 26f0068941..f74787681e 100644 Binary files a/samples/h264SampleFrames/frame-0467.h264 and b/samples/h264SampleFrames/frame-0467.h264 differ diff --git a/samples/h264SampleFrames/frame-0468.h264 b/samples/h264SampleFrames/frame-0468.h264 index 2d4ec0052e..485df3d673 100644 Binary files a/samples/h264SampleFrames/frame-0468.h264 and b/samples/h264SampleFrames/frame-0468.h264 differ diff --git a/samples/h264SampleFrames/frame-0469.h264 b/samples/h264SampleFrames/frame-0469.h264 index ce51a34d03..6c0833ffcc 100644 Binary files a/samples/h264SampleFrames/frame-0469.h264 and b/samples/h264SampleFrames/frame-0469.h264 differ diff --git a/samples/h264SampleFrames/frame-0470.h264 b/samples/h264SampleFrames/frame-0470.h264 index f41a55fbff..56df0b7b1f 100644 Binary files a/samples/h264SampleFrames/frame-0470.h264 and b/samples/h264SampleFrames/frame-0470.h264 differ diff --git a/samples/h264SampleFrames/frame-0471.h264 b/samples/h264SampleFrames/frame-0471.h264 index ae5b1e54d9..4801cc1bd7 100644 Binary files a/samples/h264SampleFrames/frame-0471.h264 and b/samples/h264SampleFrames/frame-0471.h264 differ diff --git a/samples/h264SampleFrames/frame-0472.h264 b/samples/h264SampleFrames/frame-0472.h264 index eb4b91c8f7..1b52e3bf79 100644 Binary files a/samples/h264SampleFrames/frame-0472.h264 and b/samples/h264SampleFrames/frame-0472.h264 differ diff --git a/samples/h264SampleFrames/frame-0473.h264 b/samples/h264SampleFrames/frame-0473.h264 index 9b243c0c9d..c16e5f111b 100644 Binary files a/samples/h264SampleFrames/frame-0473.h264 and b/samples/h264SampleFrames/frame-0473.h264 differ diff --git a/samples/h264SampleFrames/frame-0474.h264 b/samples/h264SampleFrames/frame-0474.h264 index 3ef39ab3d9..af4d7ed532 100644 Binary files a/samples/h264SampleFrames/frame-0474.h264 and b/samples/h264SampleFrames/frame-0474.h264 differ diff --git a/samples/h264SampleFrames/frame-0475.h264 b/samples/h264SampleFrames/frame-0475.h264 index 4c3beada2f..bfb1421789 100644 Binary files a/samples/h264SampleFrames/frame-0475.h264 and b/samples/h264SampleFrames/frame-0475.h264 differ diff --git a/samples/h264SampleFrames/frame-0476.h264 b/samples/h264SampleFrames/frame-0476.h264 index 8d2820812b..fee651fb57 100644 Binary files a/samples/h264SampleFrames/frame-0476.h264 and b/samples/h264SampleFrames/frame-0476.h264 differ diff --git a/samples/h264SampleFrames/frame-0477.h264 b/samples/h264SampleFrames/frame-0477.h264 index adb0fc9d71..87886db435 100644 Binary files a/samples/h264SampleFrames/frame-0477.h264 and b/samples/h264SampleFrames/frame-0477.h264 differ diff --git a/samples/h264SampleFrames/frame-0478.h264 b/samples/h264SampleFrames/frame-0478.h264 index 40c5990e3f..0625b50303 100644 Binary files a/samples/h264SampleFrames/frame-0478.h264 and b/samples/h264SampleFrames/frame-0478.h264 differ diff --git a/samples/h264SampleFrames/frame-0479.h264 b/samples/h264SampleFrames/frame-0479.h264 index 89fad9e75c..bb9590bd4a 100644 Binary files a/samples/h264SampleFrames/frame-0479.h264 and b/samples/h264SampleFrames/frame-0479.h264 differ diff --git a/samples/h264SampleFrames/frame-0480.h264 b/samples/h264SampleFrames/frame-0480.h264 index 7b4e149c7d..cd589fbccf 100644 Binary files a/samples/h264SampleFrames/frame-0480.h264 and b/samples/h264SampleFrames/frame-0480.h264 differ diff --git a/samples/h264SampleFrames/frame-0481.h264 b/samples/h264SampleFrames/frame-0481.h264 index a29703a3bb..de14b972ec 100644 Binary files a/samples/h264SampleFrames/frame-0481.h264 and b/samples/h264SampleFrames/frame-0481.h264 differ diff --git a/samples/h264SampleFrames/frame-0482.h264 b/samples/h264SampleFrames/frame-0482.h264 index ba9c454c8c..a3f9073cd4 100644 Binary files a/samples/h264SampleFrames/frame-0482.h264 and b/samples/h264SampleFrames/frame-0482.h264 differ diff --git a/samples/h264SampleFrames/frame-0483.h264 b/samples/h264SampleFrames/frame-0483.h264 index ba2a4c7190..ff2a1f11dd 100644 Binary files a/samples/h264SampleFrames/frame-0483.h264 and b/samples/h264SampleFrames/frame-0483.h264 differ diff --git a/samples/h264SampleFrames/frame-0484.h264 b/samples/h264SampleFrames/frame-0484.h264 index 715b6a4aa7..44907ddc07 100644 Binary files a/samples/h264SampleFrames/frame-0484.h264 and b/samples/h264SampleFrames/frame-0484.h264 differ diff --git a/samples/h264SampleFrames/frame-0485.h264 b/samples/h264SampleFrames/frame-0485.h264 index ee0e452068..49f2502a02 100644 Binary files a/samples/h264SampleFrames/frame-0485.h264 and b/samples/h264SampleFrames/frame-0485.h264 differ diff --git a/samples/h264SampleFrames/frame-0486.h264 b/samples/h264SampleFrames/frame-0486.h264 index c392335bc7..e77bc89d89 100644 Binary files a/samples/h264SampleFrames/frame-0486.h264 and b/samples/h264SampleFrames/frame-0486.h264 differ diff --git a/samples/h264SampleFrames/frame-0487.h264 b/samples/h264SampleFrames/frame-0487.h264 index e69e7f03fc..9a989c17fb 100644 Binary files a/samples/h264SampleFrames/frame-0487.h264 and b/samples/h264SampleFrames/frame-0487.h264 differ diff --git a/samples/h264SampleFrames/frame-0488.h264 b/samples/h264SampleFrames/frame-0488.h264 index 39079cee6c..5e7fc5f16f 100644 Binary files a/samples/h264SampleFrames/frame-0488.h264 and b/samples/h264SampleFrames/frame-0488.h264 differ diff --git a/samples/h264SampleFrames/frame-0489.h264 b/samples/h264SampleFrames/frame-0489.h264 index 6e33341c43..cebd4671c5 100644 Binary files a/samples/h264SampleFrames/frame-0489.h264 and b/samples/h264SampleFrames/frame-0489.h264 differ diff --git a/samples/h264SampleFrames/frame-0490.h264 b/samples/h264SampleFrames/frame-0490.h264 index 7219cf4e8c..de3de5cd60 100644 Binary files a/samples/h264SampleFrames/frame-0490.h264 and b/samples/h264SampleFrames/frame-0490.h264 differ diff --git a/samples/h264SampleFrames/frame-0491.h264 b/samples/h264SampleFrames/frame-0491.h264 index 68e261d661..e5acb257bd 100644 Binary files a/samples/h264SampleFrames/frame-0491.h264 and b/samples/h264SampleFrames/frame-0491.h264 differ diff --git a/samples/h264SampleFrames/frame-0492.h264 b/samples/h264SampleFrames/frame-0492.h264 index 08aa97eb6f..8fb81e7f8e 100644 Binary files a/samples/h264SampleFrames/frame-0492.h264 and b/samples/h264SampleFrames/frame-0492.h264 differ diff --git a/samples/h264SampleFrames/frame-0493.h264 b/samples/h264SampleFrames/frame-0493.h264 index dad8cb8bd5..b7be772d9a 100644 Binary files a/samples/h264SampleFrames/frame-0493.h264 and b/samples/h264SampleFrames/frame-0493.h264 differ diff --git a/samples/h264SampleFrames/frame-0494.h264 b/samples/h264SampleFrames/frame-0494.h264 index d2b5ec4a30..cf70d22d5b 100644 Binary files a/samples/h264SampleFrames/frame-0494.h264 and b/samples/h264SampleFrames/frame-0494.h264 differ diff --git a/samples/h264SampleFrames/frame-0495.h264 b/samples/h264SampleFrames/frame-0495.h264 index bf9419243b..090ab49423 100644 Binary files a/samples/h264SampleFrames/frame-0495.h264 and b/samples/h264SampleFrames/frame-0495.h264 differ diff --git a/samples/h264SampleFrames/frame-0496.h264 b/samples/h264SampleFrames/frame-0496.h264 index 7a770b3dfb..ee90d9a660 100644 Binary files a/samples/h264SampleFrames/frame-0496.h264 and b/samples/h264SampleFrames/frame-0496.h264 differ diff --git a/samples/h264SampleFrames/frame-0497.h264 b/samples/h264SampleFrames/frame-0497.h264 index 6ef602924c..a14f2310b8 100644 Binary files a/samples/h264SampleFrames/frame-0497.h264 and b/samples/h264SampleFrames/frame-0497.h264 differ diff --git a/samples/h264SampleFrames/frame-0498.h264 b/samples/h264SampleFrames/frame-0498.h264 index 104e942760..91d014daa0 100644 Binary files a/samples/h264SampleFrames/frame-0498.h264 and b/samples/h264SampleFrames/frame-0498.h264 differ diff --git a/samples/h264SampleFrames/frame-0499.h264 b/samples/h264SampleFrames/frame-0499.h264 index 15e1c1b0b2..2e2849a699 100644 Binary files a/samples/h264SampleFrames/frame-0499.h264 and b/samples/h264SampleFrames/frame-0499.h264 differ diff --git a/samples/h264SampleFrames/frame-0500.h264 b/samples/h264SampleFrames/frame-0500.h264 index 9c2c0b99e0..732f88b334 100644 Binary files a/samples/h264SampleFrames/frame-0500.h264 and b/samples/h264SampleFrames/frame-0500.h264 differ diff --git a/samples/h264SampleFrames/frame-0501.h264 b/samples/h264SampleFrames/frame-0501.h264 index 07c0678635..ca927b3fec 100644 Binary files a/samples/h264SampleFrames/frame-0501.h264 and b/samples/h264SampleFrames/frame-0501.h264 differ diff --git a/samples/h264SampleFrames/frame-0502.h264 b/samples/h264SampleFrames/frame-0502.h264 index 79722187be..f8b1672dc0 100644 Binary files a/samples/h264SampleFrames/frame-0502.h264 and b/samples/h264SampleFrames/frame-0502.h264 differ diff --git a/samples/h264SampleFrames/frame-0503.h264 b/samples/h264SampleFrames/frame-0503.h264 index 251e714c5c..518ff6fb3c 100644 Binary files a/samples/h264SampleFrames/frame-0503.h264 and b/samples/h264SampleFrames/frame-0503.h264 differ diff --git a/samples/h264SampleFrames/frame-0504.h264 b/samples/h264SampleFrames/frame-0504.h264 index 3a9f25b6be..b7be592d69 100644 Binary files a/samples/h264SampleFrames/frame-0504.h264 and b/samples/h264SampleFrames/frame-0504.h264 differ diff --git a/samples/h264SampleFrames/frame-0505.h264 b/samples/h264SampleFrames/frame-0505.h264 index fbec0d45a0..089eda10cc 100644 Binary files a/samples/h264SampleFrames/frame-0505.h264 and b/samples/h264SampleFrames/frame-0505.h264 differ diff --git a/samples/h264SampleFrames/frame-0506.h264 b/samples/h264SampleFrames/frame-0506.h264 index 453b302819..9d99793035 100644 Binary files a/samples/h264SampleFrames/frame-0506.h264 and b/samples/h264SampleFrames/frame-0506.h264 differ diff --git a/samples/h264SampleFrames/frame-0507.h264 b/samples/h264SampleFrames/frame-0507.h264 index 4b6ef05fc9..120f9788f1 100644 Binary files a/samples/h264SampleFrames/frame-0507.h264 and b/samples/h264SampleFrames/frame-0507.h264 differ diff --git a/samples/h264SampleFrames/frame-0508.h264 b/samples/h264SampleFrames/frame-0508.h264 index a5ebf256ad..462f93509f 100644 Binary files a/samples/h264SampleFrames/frame-0508.h264 and b/samples/h264SampleFrames/frame-0508.h264 differ diff --git a/samples/h264SampleFrames/frame-0509.h264 b/samples/h264SampleFrames/frame-0509.h264 index fadab80b23..a663d7df85 100644 Binary files a/samples/h264SampleFrames/frame-0509.h264 and b/samples/h264SampleFrames/frame-0509.h264 differ diff --git a/samples/h264SampleFrames/frame-0510.h264 b/samples/h264SampleFrames/frame-0510.h264 index 93d049408c..4c49157638 100644 Binary files a/samples/h264SampleFrames/frame-0510.h264 and b/samples/h264SampleFrames/frame-0510.h264 differ diff --git a/samples/h264SampleFrames/frame-0511.h264 b/samples/h264SampleFrames/frame-0511.h264 index 2080eb691b..86281c1978 100644 Binary files a/samples/h264SampleFrames/frame-0511.h264 and b/samples/h264SampleFrames/frame-0511.h264 differ diff --git a/samples/h264SampleFrames/frame-0512.h264 b/samples/h264SampleFrames/frame-0512.h264 index b1c97c9d8d..96c527a88c 100644 Binary files a/samples/h264SampleFrames/frame-0512.h264 and b/samples/h264SampleFrames/frame-0512.h264 differ diff --git a/samples/h264SampleFrames/frame-0513.h264 b/samples/h264SampleFrames/frame-0513.h264 index 27ecaa64b5..ddb47915ef 100644 Binary files a/samples/h264SampleFrames/frame-0513.h264 and b/samples/h264SampleFrames/frame-0513.h264 differ diff --git a/samples/h264SampleFrames/frame-0514.h264 b/samples/h264SampleFrames/frame-0514.h264 index 8bff59253b..320d9dd030 100644 Binary files a/samples/h264SampleFrames/frame-0514.h264 and b/samples/h264SampleFrames/frame-0514.h264 differ diff --git a/samples/h264SampleFrames/frame-0515.h264 b/samples/h264SampleFrames/frame-0515.h264 index 9237ddd776..fb50272808 100644 Binary files a/samples/h264SampleFrames/frame-0515.h264 and b/samples/h264SampleFrames/frame-0515.h264 differ diff --git a/samples/h264SampleFrames/frame-0516.h264 b/samples/h264SampleFrames/frame-0516.h264 index eb945c5714..98b355861d 100644 Binary files a/samples/h264SampleFrames/frame-0516.h264 and b/samples/h264SampleFrames/frame-0516.h264 differ diff --git a/samples/h264SampleFrames/frame-0517.h264 b/samples/h264SampleFrames/frame-0517.h264 index e4cb8050c8..9c14f1e47c 100644 Binary files a/samples/h264SampleFrames/frame-0517.h264 and b/samples/h264SampleFrames/frame-0517.h264 differ diff --git a/samples/h264SampleFrames/frame-0518.h264 b/samples/h264SampleFrames/frame-0518.h264 index 0005c28fed..e0de897a22 100644 Binary files a/samples/h264SampleFrames/frame-0518.h264 and b/samples/h264SampleFrames/frame-0518.h264 differ diff --git a/samples/h264SampleFrames/frame-0519.h264 b/samples/h264SampleFrames/frame-0519.h264 index 58b7ae3f47..47a9d1d4ba 100644 Binary files a/samples/h264SampleFrames/frame-0519.h264 and b/samples/h264SampleFrames/frame-0519.h264 differ diff --git a/samples/h264SampleFrames/frame-0520.h264 b/samples/h264SampleFrames/frame-0520.h264 index 63bccead3a..4988e669bb 100644 Binary files a/samples/h264SampleFrames/frame-0520.h264 and b/samples/h264SampleFrames/frame-0520.h264 differ diff --git a/samples/h264SampleFrames/frame-0521.h264 b/samples/h264SampleFrames/frame-0521.h264 index e502088f9f..466835728d 100644 Binary files a/samples/h264SampleFrames/frame-0521.h264 and b/samples/h264SampleFrames/frame-0521.h264 differ diff --git a/samples/h264SampleFrames/frame-0522.h264 b/samples/h264SampleFrames/frame-0522.h264 index 038fde18c1..9fc83c9c0c 100644 Binary files a/samples/h264SampleFrames/frame-0522.h264 and b/samples/h264SampleFrames/frame-0522.h264 differ diff --git a/samples/h264SampleFrames/frame-0523.h264 b/samples/h264SampleFrames/frame-0523.h264 index 48630b4dda..61ac4ad6ef 100644 Binary files a/samples/h264SampleFrames/frame-0523.h264 and b/samples/h264SampleFrames/frame-0523.h264 differ diff --git a/samples/h264SampleFrames/frame-0524.h264 b/samples/h264SampleFrames/frame-0524.h264 index 75df0bf9b1..2bf930f290 100644 Binary files a/samples/h264SampleFrames/frame-0524.h264 and b/samples/h264SampleFrames/frame-0524.h264 differ diff --git a/samples/h264SampleFrames/frame-0525.h264 b/samples/h264SampleFrames/frame-0525.h264 index 413cee4a68..91b5357bed 100644 Binary files a/samples/h264SampleFrames/frame-0525.h264 and b/samples/h264SampleFrames/frame-0525.h264 differ diff --git a/samples/h264SampleFrames/frame-0526.h264 b/samples/h264SampleFrames/frame-0526.h264 index f9e243c0a8..c3e0e9aa40 100644 Binary files a/samples/h264SampleFrames/frame-0526.h264 and b/samples/h264SampleFrames/frame-0526.h264 differ diff --git a/samples/h264SampleFrames/frame-0527.h264 b/samples/h264SampleFrames/frame-0527.h264 index d0017cbc80..6e6e38807a 100644 Binary files a/samples/h264SampleFrames/frame-0527.h264 and b/samples/h264SampleFrames/frame-0527.h264 differ diff --git a/samples/h264SampleFrames/frame-0528.h264 b/samples/h264SampleFrames/frame-0528.h264 index d6aa60313f..5be9285ed6 100644 Binary files a/samples/h264SampleFrames/frame-0528.h264 and b/samples/h264SampleFrames/frame-0528.h264 differ diff --git a/samples/h264SampleFrames/frame-0529.h264 b/samples/h264SampleFrames/frame-0529.h264 index 1774c8ad31..cd538d9ada 100644 Binary files a/samples/h264SampleFrames/frame-0529.h264 and b/samples/h264SampleFrames/frame-0529.h264 differ diff --git a/samples/h264SampleFrames/frame-0530.h264 b/samples/h264SampleFrames/frame-0530.h264 index 441d0aac06..290f396ea3 100644 Binary files a/samples/h264SampleFrames/frame-0530.h264 and b/samples/h264SampleFrames/frame-0530.h264 differ diff --git a/samples/h264SampleFrames/frame-0531.h264 b/samples/h264SampleFrames/frame-0531.h264 index e7100429c6..1806267bcf 100644 Binary files a/samples/h264SampleFrames/frame-0531.h264 and b/samples/h264SampleFrames/frame-0531.h264 differ diff --git a/samples/h264SampleFrames/frame-0532.h264 b/samples/h264SampleFrames/frame-0532.h264 index ceed2ed107..1556194a05 100644 Binary files a/samples/h264SampleFrames/frame-0532.h264 and b/samples/h264SampleFrames/frame-0532.h264 differ diff --git a/samples/h264SampleFrames/frame-0533.h264 b/samples/h264SampleFrames/frame-0533.h264 index ec80474507..51b8157b98 100644 Binary files a/samples/h264SampleFrames/frame-0533.h264 and b/samples/h264SampleFrames/frame-0533.h264 differ diff --git a/samples/h264SampleFrames/frame-0534.h264 b/samples/h264SampleFrames/frame-0534.h264 index 7571edeff1..08b65ad580 100644 Binary files a/samples/h264SampleFrames/frame-0534.h264 and b/samples/h264SampleFrames/frame-0534.h264 differ diff --git a/samples/h264SampleFrames/frame-0535.h264 b/samples/h264SampleFrames/frame-0535.h264 index 0593f18afb..3afa29cdb0 100644 Binary files a/samples/h264SampleFrames/frame-0535.h264 and b/samples/h264SampleFrames/frame-0535.h264 differ diff --git a/samples/h264SampleFrames/frame-0536.h264 b/samples/h264SampleFrames/frame-0536.h264 index baf725eba5..93a71134f6 100644 Binary files a/samples/h264SampleFrames/frame-0536.h264 and b/samples/h264SampleFrames/frame-0536.h264 differ diff --git a/samples/h264SampleFrames/frame-0537.h264 b/samples/h264SampleFrames/frame-0537.h264 index 9f7c37e6aa..c89c1fdbb0 100644 Binary files a/samples/h264SampleFrames/frame-0537.h264 and b/samples/h264SampleFrames/frame-0537.h264 differ diff --git a/samples/h264SampleFrames/frame-0538.h264 b/samples/h264SampleFrames/frame-0538.h264 index fa5d43f86e..23da8e9605 100644 Binary files a/samples/h264SampleFrames/frame-0538.h264 and b/samples/h264SampleFrames/frame-0538.h264 differ diff --git a/samples/h264SampleFrames/frame-0539.h264 b/samples/h264SampleFrames/frame-0539.h264 index 4b5fff2db9..bd28f1c15e 100644 Binary files a/samples/h264SampleFrames/frame-0539.h264 and b/samples/h264SampleFrames/frame-0539.h264 differ diff --git a/samples/h264SampleFrames/frame-0540.h264 b/samples/h264SampleFrames/frame-0540.h264 index 9175878f3c..3fb83fda55 100644 Binary files a/samples/h264SampleFrames/frame-0540.h264 and b/samples/h264SampleFrames/frame-0540.h264 differ diff --git a/samples/h264SampleFrames/frame-0541.h264 b/samples/h264SampleFrames/frame-0541.h264 index fa856dc559..eebb6d2e82 100644 Binary files a/samples/h264SampleFrames/frame-0541.h264 and b/samples/h264SampleFrames/frame-0541.h264 differ diff --git a/samples/h264SampleFrames/frame-0542.h264 b/samples/h264SampleFrames/frame-0542.h264 index ae5bab4589..8eab1c4ae8 100644 Binary files a/samples/h264SampleFrames/frame-0542.h264 and b/samples/h264SampleFrames/frame-0542.h264 differ diff --git a/samples/h264SampleFrames/frame-0543.h264 b/samples/h264SampleFrames/frame-0543.h264 index 53d472f4e7..43366a9cf9 100644 Binary files a/samples/h264SampleFrames/frame-0543.h264 and b/samples/h264SampleFrames/frame-0543.h264 differ diff --git a/samples/h264SampleFrames/frame-0544.h264 b/samples/h264SampleFrames/frame-0544.h264 index 058a42692a..c8ad96b675 100644 Binary files a/samples/h264SampleFrames/frame-0544.h264 and b/samples/h264SampleFrames/frame-0544.h264 differ diff --git a/samples/h264SampleFrames/frame-0545.h264 b/samples/h264SampleFrames/frame-0545.h264 index 24014a20c5..4f6a2e1775 100644 Binary files a/samples/h264SampleFrames/frame-0545.h264 and b/samples/h264SampleFrames/frame-0545.h264 differ diff --git a/samples/h264SampleFrames/frame-0546.h264 b/samples/h264SampleFrames/frame-0546.h264 index b42701a824..1953580315 100644 Binary files a/samples/h264SampleFrames/frame-0546.h264 and b/samples/h264SampleFrames/frame-0546.h264 differ diff --git a/samples/h264SampleFrames/frame-0547.h264 b/samples/h264SampleFrames/frame-0547.h264 index 422a5bd2cd..1f889422ed 100644 Binary files a/samples/h264SampleFrames/frame-0547.h264 and b/samples/h264SampleFrames/frame-0547.h264 differ diff --git a/samples/h264SampleFrames/frame-0548.h264 b/samples/h264SampleFrames/frame-0548.h264 index e92d62fd56..09e3d808d5 100644 Binary files a/samples/h264SampleFrames/frame-0548.h264 and b/samples/h264SampleFrames/frame-0548.h264 differ diff --git a/samples/h264SampleFrames/frame-0549.h264 b/samples/h264SampleFrames/frame-0549.h264 index f9ef1bd3f8..66d6b3645f 100644 Binary files a/samples/h264SampleFrames/frame-0549.h264 and b/samples/h264SampleFrames/frame-0549.h264 differ diff --git a/samples/h264SampleFrames/frame-0550.h264 b/samples/h264SampleFrames/frame-0550.h264 index 51fc0ef09d..79c5b38c24 100644 Binary files a/samples/h264SampleFrames/frame-0550.h264 and b/samples/h264SampleFrames/frame-0550.h264 differ diff --git a/samples/h264SampleFrames/frame-0551.h264 b/samples/h264SampleFrames/frame-0551.h264 index 2c1aef6571..3bdc5df8aa 100644 Binary files a/samples/h264SampleFrames/frame-0551.h264 and b/samples/h264SampleFrames/frame-0551.h264 differ diff --git a/samples/h264SampleFrames/frame-0552.h264 b/samples/h264SampleFrames/frame-0552.h264 index 6ff78540f0..60d375f63e 100644 Binary files a/samples/h264SampleFrames/frame-0552.h264 and b/samples/h264SampleFrames/frame-0552.h264 differ diff --git a/samples/h264SampleFrames/frame-0553.h264 b/samples/h264SampleFrames/frame-0553.h264 index a81ba82870..aef778e9ea 100644 Binary files a/samples/h264SampleFrames/frame-0553.h264 and b/samples/h264SampleFrames/frame-0553.h264 differ diff --git a/samples/h264SampleFrames/frame-0554.h264 b/samples/h264SampleFrames/frame-0554.h264 index 6252a899c3..b29ea2697b 100644 Binary files a/samples/h264SampleFrames/frame-0554.h264 and b/samples/h264SampleFrames/frame-0554.h264 differ diff --git a/samples/h264SampleFrames/frame-0555.h264 b/samples/h264SampleFrames/frame-0555.h264 index d5eec2f854..a3c7457547 100644 Binary files a/samples/h264SampleFrames/frame-0555.h264 and b/samples/h264SampleFrames/frame-0555.h264 differ diff --git a/samples/h264SampleFrames/frame-0556.h264 b/samples/h264SampleFrames/frame-0556.h264 index b4a63b65f8..25799e8da7 100644 Binary files a/samples/h264SampleFrames/frame-0556.h264 and b/samples/h264SampleFrames/frame-0556.h264 differ diff --git a/samples/h264SampleFrames/frame-0557.h264 b/samples/h264SampleFrames/frame-0557.h264 index d0d368c82d..f99e7a9106 100644 Binary files a/samples/h264SampleFrames/frame-0557.h264 and b/samples/h264SampleFrames/frame-0557.h264 differ diff --git a/samples/h264SampleFrames/frame-0558.h264 b/samples/h264SampleFrames/frame-0558.h264 index d263b74f19..722b51f8a9 100644 Binary files a/samples/h264SampleFrames/frame-0558.h264 and b/samples/h264SampleFrames/frame-0558.h264 differ diff --git a/samples/h264SampleFrames/frame-0559.h264 b/samples/h264SampleFrames/frame-0559.h264 index 20a12f52a1..a134a02353 100644 Binary files a/samples/h264SampleFrames/frame-0559.h264 and b/samples/h264SampleFrames/frame-0559.h264 differ diff --git a/samples/h264SampleFrames/frame-0560.h264 b/samples/h264SampleFrames/frame-0560.h264 index 55134fdec7..cda400a61b 100644 Binary files a/samples/h264SampleFrames/frame-0560.h264 and b/samples/h264SampleFrames/frame-0560.h264 differ diff --git a/samples/h264SampleFrames/frame-0561.h264 b/samples/h264SampleFrames/frame-0561.h264 index a76bc7ed2f..267ca74446 100644 Binary files a/samples/h264SampleFrames/frame-0561.h264 and b/samples/h264SampleFrames/frame-0561.h264 differ diff --git a/samples/h264SampleFrames/frame-0562.h264 b/samples/h264SampleFrames/frame-0562.h264 index 7fe7cc1831..6e3a54d9b3 100644 Binary files a/samples/h264SampleFrames/frame-0562.h264 and b/samples/h264SampleFrames/frame-0562.h264 differ diff --git a/samples/h264SampleFrames/frame-0563.h264 b/samples/h264SampleFrames/frame-0563.h264 index 9c0bc21bc5..c584bcb3c9 100644 Binary files a/samples/h264SampleFrames/frame-0563.h264 and b/samples/h264SampleFrames/frame-0563.h264 differ diff --git a/samples/h264SampleFrames/frame-0564.h264 b/samples/h264SampleFrames/frame-0564.h264 index b1553456ed..329dcb0fd9 100644 Binary files a/samples/h264SampleFrames/frame-0564.h264 and b/samples/h264SampleFrames/frame-0564.h264 differ diff --git a/samples/h264SampleFrames/frame-0565.h264 b/samples/h264SampleFrames/frame-0565.h264 index 3c0bfa20b3..ca67f9aef3 100644 Binary files a/samples/h264SampleFrames/frame-0565.h264 and b/samples/h264SampleFrames/frame-0565.h264 differ diff --git a/samples/h264SampleFrames/frame-0566.h264 b/samples/h264SampleFrames/frame-0566.h264 index 8084c72bbb..4d6b733cf9 100644 Binary files a/samples/h264SampleFrames/frame-0566.h264 and b/samples/h264SampleFrames/frame-0566.h264 differ diff --git a/samples/h264SampleFrames/frame-0567.h264 b/samples/h264SampleFrames/frame-0567.h264 index bd4fce6481..33b0116aa7 100644 Binary files a/samples/h264SampleFrames/frame-0567.h264 and b/samples/h264SampleFrames/frame-0567.h264 differ diff --git a/samples/h264SampleFrames/frame-0568.h264 b/samples/h264SampleFrames/frame-0568.h264 index dbd0eaf68f..502804981c 100644 Binary files a/samples/h264SampleFrames/frame-0568.h264 and b/samples/h264SampleFrames/frame-0568.h264 differ diff --git a/samples/h264SampleFrames/frame-0569.h264 b/samples/h264SampleFrames/frame-0569.h264 index 5d631d0af3..c9b541235a 100644 Binary files a/samples/h264SampleFrames/frame-0569.h264 and b/samples/h264SampleFrames/frame-0569.h264 differ diff --git a/samples/h264SampleFrames/frame-0570.h264 b/samples/h264SampleFrames/frame-0570.h264 index 634ffda5ca..96e814c4d7 100644 Binary files a/samples/h264SampleFrames/frame-0570.h264 and b/samples/h264SampleFrames/frame-0570.h264 differ diff --git a/samples/h264SampleFrames/frame-0571.h264 b/samples/h264SampleFrames/frame-0571.h264 index 3991a8bff6..ea52588f58 100644 Binary files a/samples/h264SampleFrames/frame-0571.h264 and b/samples/h264SampleFrames/frame-0571.h264 differ diff --git a/samples/h264SampleFrames/frame-0572.h264 b/samples/h264SampleFrames/frame-0572.h264 index 835280977d..089938f5a1 100644 Binary files a/samples/h264SampleFrames/frame-0572.h264 and b/samples/h264SampleFrames/frame-0572.h264 differ diff --git a/samples/h264SampleFrames/frame-0573.h264 b/samples/h264SampleFrames/frame-0573.h264 index b35fbce30c..42ff8d08ac 100644 Binary files a/samples/h264SampleFrames/frame-0573.h264 and b/samples/h264SampleFrames/frame-0573.h264 differ diff --git a/samples/h264SampleFrames/frame-0574.h264 b/samples/h264SampleFrames/frame-0574.h264 index 51e7a2a4b1..271ea7d01f 100644 Binary files a/samples/h264SampleFrames/frame-0574.h264 and b/samples/h264SampleFrames/frame-0574.h264 differ diff --git a/samples/h264SampleFrames/frame-0575.h264 b/samples/h264SampleFrames/frame-0575.h264 index 46b10178bc..4a9dca5095 100644 Binary files a/samples/h264SampleFrames/frame-0575.h264 and b/samples/h264SampleFrames/frame-0575.h264 differ diff --git a/samples/h264SampleFrames/frame-0576.h264 b/samples/h264SampleFrames/frame-0576.h264 index a07e444f80..5be0771fb8 100644 Binary files a/samples/h264SampleFrames/frame-0576.h264 and b/samples/h264SampleFrames/frame-0576.h264 differ diff --git a/samples/h264SampleFrames/frame-0577.h264 b/samples/h264SampleFrames/frame-0577.h264 index 68f8864845..7d1ba2470d 100644 Binary files a/samples/h264SampleFrames/frame-0577.h264 and b/samples/h264SampleFrames/frame-0577.h264 differ diff --git a/samples/h264SampleFrames/frame-0578.h264 b/samples/h264SampleFrames/frame-0578.h264 index 1b1ad89109..c15ee6b67b 100644 Binary files a/samples/h264SampleFrames/frame-0578.h264 and b/samples/h264SampleFrames/frame-0578.h264 differ diff --git a/samples/h264SampleFrames/frame-0579.h264 b/samples/h264SampleFrames/frame-0579.h264 index 0d9926173d..71248f514b 100644 Binary files a/samples/h264SampleFrames/frame-0579.h264 and b/samples/h264SampleFrames/frame-0579.h264 differ diff --git a/samples/h264SampleFrames/frame-0580.h264 b/samples/h264SampleFrames/frame-0580.h264 index 818fccc762..9fa5d77f50 100644 Binary files a/samples/h264SampleFrames/frame-0580.h264 and b/samples/h264SampleFrames/frame-0580.h264 differ diff --git a/samples/h264SampleFrames/frame-0581.h264 b/samples/h264SampleFrames/frame-0581.h264 index c49f44f04a..966545c573 100644 Binary files a/samples/h264SampleFrames/frame-0581.h264 and b/samples/h264SampleFrames/frame-0581.h264 differ diff --git a/samples/h264SampleFrames/frame-0582.h264 b/samples/h264SampleFrames/frame-0582.h264 index f52335142e..76e74f395d 100644 Binary files a/samples/h264SampleFrames/frame-0582.h264 and b/samples/h264SampleFrames/frame-0582.h264 differ diff --git a/samples/h264SampleFrames/frame-0583.h264 b/samples/h264SampleFrames/frame-0583.h264 index 9aca6f4455..ab743fae74 100644 Binary files a/samples/h264SampleFrames/frame-0583.h264 and b/samples/h264SampleFrames/frame-0583.h264 differ diff --git a/samples/h264SampleFrames/frame-0584.h264 b/samples/h264SampleFrames/frame-0584.h264 index fe95098f57..d2d11df768 100644 Binary files a/samples/h264SampleFrames/frame-0584.h264 and b/samples/h264SampleFrames/frame-0584.h264 differ diff --git a/samples/h264SampleFrames/frame-0585.h264 b/samples/h264SampleFrames/frame-0585.h264 index 51fcae3da5..709155acae 100644 Binary files a/samples/h264SampleFrames/frame-0585.h264 and b/samples/h264SampleFrames/frame-0585.h264 differ diff --git a/samples/h264SampleFrames/frame-0586.h264 b/samples/h264SampleFrames/frame-0586.h264 index 7611d6b0c1..23a7e2c4c7 100644 Binary files a/samples/h264SampleFrames/frame-0586.h264 and b/samples/h264SampleFrames/frame-0586.h264 differ diff --git a/samples/h264SampleFrames/frame-0587.h264 b/samples/h264SampleFrames/frame-0587.h264 index da2e8a6249..23e4ba0a4a 100644 Binary files a/samples/h264SampleFrames/frame-0587.h264 and b/samples/h264SampleFrames/frame-0587.h264 differ diff --git a/samples/h264SampleFrames/frame-0588.h264 b/samples/h264SampleFrames/frame-0588.h264 index 5688478ed4..ebd1ebe888 100644 Binary files a/samples/h264SampleFrames/frame-0588.h264 and b/samples/h264SampleFrames/frame-0588.h264 differ diff --git a/samples/h264SampleFrames/frame-0589.h264 b/samples/h264SampleFrames/frame-0589.h264 index 0e90b3af37..af27de400d 100644 Binary files a/samples/h264SampleFrames/frame-0589.h264 and b/samples/h264SampleFrames/frame-0589.h264 differ diff --git a/samples/h264SampleFrames/frame-0590.h264 b/samples/h264SampleFrames/frame-0590.h264 index b04578daab..e54d5b37ea 100644 Binary files a/samples/h264SampleFrames/frame-0590.h264 and b/samples/h264SampleFrames/frame-0590.h264 differ diff --git a/samples/h264SampleFrames/frame-0591.h264 b/samples/h264SampleFrames/frame-0591.h264 index 77f48b74a0..17cceff248 100644 Binary files a/samples/h264SampleFrames/frame-0591.h264 and b/samples/h264SampleFrames/frame-0591.h264 differ diff --git a/samples/h264SampleFrames/frame-0592.h264 b/samples/h264SampleFrames/frame-0592.h264 index 4eb06a3c90..21b32b9122 100644 Binary files a/samples/h264SampleFrames/frame-0592.h264 and b/samples/h264SampleFrames/frame-0592.h264 differ diff --git a/samples/h264SampleFrames/frame-0593.h264 b/samples/h264SampleFrames/frame-0593.h264 index adfeb60e66..ba9f70ed83 100644 Binary files a/samples/h264SampleFrames/frame-0593.h264 and b/samples/h264SampleFrames/frame-0593.h264 differ diff --git a/samples/h264SampleFrames/frame-0594.h264 b/samples/h264SampleFrames/frame-0594.h264 index 153cf9c384..91108010c7 100644 Binary files a/samples/h264SampleFrames/frame-0594.h264 and b/samples/h264SampleFrames/frame-0594.h264 differ diff --git a/samples/h264SampleFrames/frame-0595.h264 b/samples/h264SampleFrames/frame-0595.h264 index da7a7b2805..e6045a46aa 100644 Binary files a/samples/h264SampleFrames/frame-0595.h264 and b/samples/h264SampleFrames/frame-0595.h264 differ diff --git a/samples/h264SampleFrames/frame-0596.h264 b/samples/h264SampleFrames/frame-0596.h264 index d9a3f90dbd..bebb87b2e0 100644 Binary files a/samples/h264SampleFrames/frame-0596.h264 and b/samples/h264SampleFrames/frame-0596.h264 differ diff --git a/samples/h264SampleFrames/frame-0597.h264 b/samples/h264SampleFrames/frame-0597.h264 index f53797ce35..785e0c436d 100644 Binary files a/samples/h264SampleFrames/frame-0597.h264 and b/samples/h264SampleFrames/frame-0597.h264 differ diff --git a/samples/h264SampleFrames/frame-0598.h264 b/samples/h264SampleFrames/frame-0598.h264 index 25da6a02c3..6a97db108a 100644 Binary files a/samples/h264SampleFrames/frame-0598.h264 and b/samples/h264SampleFrames/frame-0598.h264 differ diff --git a/samples/h264SampleFrames/frame-0599.h264 b/samples/h264SampleFrames/frame-0599.h264 index 8d31d6e1d9..45254b5dae 100644 Binary files a/samples/h264SampleFrames/frame-0599.h264 and b/samples/h264SampleFrames/frame-0599.h264 differ diff --git a/samples/h264SampleFrames/frame-0600.h264 b/samples/h264SampleFrames/frame-0600.h264 index ae16227a82..0d906aa6f3 100644 Binary files a/samples/h264SampleFrames/frame-0600.h264 and b/samples/h264SampleFrames/frame-0600.h264 differ diff --git a/samples/h264SampleFrames/frame-0601.h264 b/samples/h264SampleFrames/frame-0601.h264 index d4d3c63eb1..82bb82e635 100644 Binary files a/samples/h264SampleFrames/frame-0601.h264 and b/samples/h264SampleFrames/frame-0601.h264 differ diff --git a/samples/h264SampleFrames/frame-0602.h264 b/samples/h264SampleFrames/frame-0602.h264 index 639781d10d..9c8d50fa01 100644 Binary files a/samples/h264SampleFrames/frame-0602.h264 and b/samples/h264SampleFrames/frame-0602.h264 differ diff --git a/samples/h264SampleFrames/frame-0603.h264 b/samples/h264SampleFrames/frame-0603.h264 index 189db7b8f5..e2bb7a2e7d 100644 Binary files a/samples/h264SampleFrames/frame-0603.h264 and b/samples/h264SampleFrames/frame-0603.h264 differ diff --git a/samples/h264SampleFrames/frame-0604.h264 b/samples/h264SampleFrames/frame-0604.h264 index 3ebee5743c..a983f32a2f 100644 Binary files a/samples/h264SampleFrames/frame-0604.h264 and b/samples/h264SampleFrames/frame-0604.h264 differ diff --git a/samples/h264SampleFrames/frame-0605.h264 b/samples/h264SampleFrames/frame-0605.h264 index f11235d84e..7df7264811 100644 Binary files a/samples/h264SampleFrames/frame-0605.h264 and b/samples/h264SampleFrames/frame-0605.h264 differ diff --git a/samples/h264SampleFrames/frame-0606.h264 b/samples/h264SampleFrames/frame-0606.h264 index 80fb258130..58f6a74683 100644 Binary files a/samples/h264SampleFrames/frame-0606.h264 and b/samples/h264SampleFrames/frame-0606.h264 differ diff --git a/samples/h264SampleFrames/frame-0607.h264 b/samples/h264SampleFrames/frame-0607.h264 index c6eb428c9a..e5b0eb9d2f 100644 Binary files a/samples/h264SampleFrames/frame-0607.h264 and b/samples/h264SampleFrames/frame-0607.h264 differ diff --git a/samples/h264SampleFrames/frame-0608.h264 b/samples/h264SampleFrames/frame-0608.h264 index f4b3af215b..9ff0cb2e69 100644 Binary files a/samples/h264SampleFrames/frame-0608.h264 and b/samples/h264SampleFrames/frame-0608.h264 differ diff --git a/samples/h264SampleFrames/frame-0609.h264 b/samples/h264SampleFrames/frame-0609.h264 index ce4fbf909b..7ceb83c1c6 100644 Binary files a/samples/h264SampleFrames/frame-0609.h264 and b/samples/h264SampleFrames/frame-0609.h264 differ diff --git a/samples/h264SampleFrames/frame-0610.h264 b/samples/h264SampleFrames/frame-0610.h264 index c6c4fa3eda..fe65d9bc48 100644 Binary files a/samples/h264SampleFrames/frame-0610.h264 and b/samples/h264SampleFrames/frame-0610.h264 differ diff --git a/samples/h264SampleFrames/frame-0611.h264 b/samples/h264SampleFrames/frame-0611.h264 index 9c25babeed..cdec7ece35 100644 Binary files a/samples/h264SampleFrames/frame-0611.h264 and b/samples/h264SampleFrames/frame-0611.h264 differ diff --git a/samples/h264SampleFrames/frame-0612.h264 b/samples/h264SampleFrames/frame-0612.h264 index 486b0bda89..d63972f63b 100644 Binary files a/samples/h264SampleFrames/frame-0612.h264 and b/samples/h264SampleFrames/frame-0612.h264 differ diff --git a/samples/h264SampleFrames/frame-0613.h264 b/samples/h264SampleFrames/frame-0613.h264 index a7b046cd1c..aea52786e4 100644 Binary files a/samples/h264SampleFrames/frame-0613.h264 and b/samples/h264SampleFrames/frame-0613.h264 differ diff --git a/samples/h264SampleFrames/frame-0614.h264 b/samples/h264SampleFrames/frame-0614.h264 index dde4257c65..d3aa642e19 100644 Binary files a/samples/h264SampleFrames/frame-0614.h264 and b/samples/h264SampleFrames/frame-0614.h264 differ diff --git a/samples/h264SampleFrames/frame-0615.h264 b/samples/h264SampleFrames/frame-0615.h264 index 3acd2c7689..d51e06505d 100644 Binary files a/samples/h264SampleFrames/frame-0615.h264 and b/samples/h264SampleFrames/frame-0615.h264 differ diff --git a/samples/h264SampleFrames/frame-0616.h264 b/samples/h264SampleFrames/frame-0616.h264 index a0c770b3b3..9bb963716b 100644 Binary files a/samples/h264SampleFrames/frame-0616.h264 and b/samples/h264SampleFrames/frame-0616.h264 differ diff --git a/samples/h264SampleFrames/frame-0617.h264 b/samples/h264SampleFrames/frame-0617.h264 index 99be1c1764..2f30bb9b41 100644 Binary files a/samples/h264SampleFrames/frame-0617.h264 and b/samples/h264SampleFrames/frame-0617.h264 differ diff --git a/samples/h264SampleFrames/frame-0618.h264 b/samples/h264SampleFrames/frame-0618.h264 index 5487f68f73..6204af8983 100644 Binary files a/samples/h264SampleFrames/frame-0618.h264 and b/samples/h264SampleFrames/frame-0618.h264 differ diff --git a/samples/h264SampleFrames/frame-0619.h264 b/samples/h264SampleFrames/frame-0619.h264 index 9f359bffc2..e280b31a11 100644 Binary files a/samples/h264SampleFrames/frame-0619.h264 and b/samples/h264SampleFrames/frame-0619.h264 differ diff --git a/samples/h264SampleFrames/frame-0620.h264 b/samples/h264SampleFrames/frame-0620.h264 index b5f14fcafe..9d5f2fc054 100644 Binary files a/samples/h264SampleFrames/frame-0620.h264 and b/samples/h264SampleFrames/frame-0620.h264 differ diff --git a/samples/h264SampleFrames/frame-0621.h264 b/samples/h264SampleFrames/frame-0621.h264 index b8a0d7b30d..330abed054 100644 Binary files a/samples/h264SampleFrames/frame-0621.h264 and b/samples/h264SampleFrames/frame-0621.h264 differ diff --git a/samples/h264SampleFrames/frame-0622.h264 b/samples/h264SampleFrames/frame-0622.h264 index 107ffc3fd9..dea62c092d 100644 Binary files a/samples/h264SampleFrames/frame-0622.h264 and b/samples/h264SampleFrames/frame-0622.h264 differ diff --git a/samples/h264SampleFrames/frame-0623.h264 b/samples/h264SampleFrames/frame-0623.h264 index 6e9c74ba36..3f643dd5ab 100644 Binary files a/samples/h264SampleFrames/frame-0623.h264 and b/samples/h264SampleFrames/frame-0623.h264 differ diff --git a/samples/h264SampleFrames/frame-0624.h264 b/samples/h264SampleFrames/frame-0624.h264 index 4abd5b4aa9..a7328ee06f 100644 Binary files a/samples/h264SampleFrames/frame-0624.h264 and b/samples/h264SampleFrames/frame-0624.h264 differ diff --git a/samples/h264SampleFrames/frame-0625.h264 b/samples/h264SampleFrames/frame-0625.h264 index 2969d8735d..a963f4011a 100644 Binary files a/samples/h264SampleFrames/frame-0625.h264 and b/samples/h264SampleFrames/frame-0625.h264 differ diff --git a/samples/h264SampleFrames/frame-0626.h264 b/samples/h264SampleFrames/frame-0626.h264 index aa86a477ef..c67634334c 100644 Binary files a/samples/h264SampleFrames/frame-0626.h264 and b/samples/h264SampleFrames/frame-0626.h264 differ diff --git a/samples/h264SampleFrames/frame-0627.h264 b/samples/h264SampleFrames/frame-0627.h264 index 63fa050436..708be64f8c 100644 Binary files a/samples/h264SampleFrames/frame-0627.h264 and b/samples/h264SampleFrames/frame-0627.h264 differ diff --git a/samples/h264SampleFrames/frame-0628.h264 b/samples/h264SampleFrames/frame-0628.h264 index 71f9ca3150..f38082121e 100644 Binary files a/samples/h264SampleFrames/frame-0628.h264 and b/samples/h264SampleFrames/frame-0628.h264 differ diff --git a/samples/h264SampleFrames/frame-0629.h264 b/samples/h264SampleFrames/frame-0629.h264 index ba14996891..2a253becd2 100644 Binary files a/samples/h264SampleFrames/frame-0629.h264 and b/samples/h264SampleFrames/frame-0629.h264 differ diff --git a/samples/h264SampleFrames/frame-0630.h264 b/samples/h264SampleFrames/frame-0630.h264 index 1ac1434ebd..d5ff725dd2 100644 Binary files a/samples/h264SampleFrames/frame-0630.h264 and b/samples/h264SampleFrames/frame-0630.h264 differ diff --git a/samples/h264SampleFrames/frame-0631.h264 b/samples/h264SampleFrames/frame-0631.h264 index 1e0e109a85..005f51b049 100644 Binary files a/samples/h264SampleFrames/frame-0631.h264 and b/samples/h264SampleFrames/frame-0631.h264 differ diff --git a/samples/h264SampleFrames/frame-0632.h264 b/samples/h264SampleFrames/frame-0632.h264 index 38c94ad423..0f8046ffce 100644 Binary files a/samples/h264SampleFrames/frame-0632.h264 and b/samples/h264SampleFrames/frame-0632.h264 differ diff --git a/samples/h264SampleFrames/frame-0633.h264 b/samples/h264SampleFrames/frame-0633.h264 index 08226e6f5b..1e42457b2b 100644 Binary files a/samples/h264SampleFrames/frame-0633.h264 and b/samples/h264SampleFrames/frame-0633.h264 differ diff --git a/samples/h264SampleFrames/frame-0634.h264 b/samples/h264SampleFrames/frame-0634.h264 index 3eff63ac6e..4c9dacddf1 100644 Binary files a/samples/h264SampleFrames/frame-0634.h264 and b/samples/h264SampleFrames/frame-0634.h264 differ diff --git a/samples/h264SampleFrames/frame-0635.h264 b/samples/h264SampleFrames/frame-0635.h264 index 42cdaaa130..87117c4a63 100644 Binary files a/samples/h264SampleFrames/frame-0635.h264 and b/samples/h264SampleFrames/frame-0635.h264 differ diff --git a/samples/h264SampleFrames/frame-0636.h264 b/samples/h264SampleFrames/frame-0636.h264 index 97692871b3..a51276a2c3 100644 Binary files a/samples/h264SampleFrames/frame-0636.h264 and b/samples/h264SampleFrames/frame-0636.h264 differ diff --git a/samples/h264SampleFrames/frame-0637.h264 b/samples/h264SampleFrames/frame-0637.h264 index bac9de8554..11e66057a6 100644 Binary files a/samples/h264SampleFrames/frame-0637.h264 and b/samples/h264SampleFrames/frame-0637.h264 differ diff --git a/samples/h264SampleFrames/frame-0638.h264 b/samples/h264SampleFrames/frame-0638.h264 index 95b7a826c1..4b5153d767 100644 Binary files a/samples/h264SampleFrames/frame-0638.h264 and b/samples/h264SampleFrames/frame-0638.h264 differ diff --git a/samples/h264SampleFrames/frame-0639.h264 b/samples/h264SampleFrames/frame-0639.h264 index 64beff16fa..ebee0eb9fd 100644 Binary files a/samples/h264SampleFrames/frame-0639.h264 and b/samples/h264SampleFrames/frame-0639.h264 differ diff --git a/samples/h264SampleFrames/frame-0640.h264 b/samples/h264SampleFrames/frame-0640.h264 index 5b162562ea..57a6f1e3b5 100644 Binary files a/samples/h264SampleFrames/frame-0640.h264 and b/samples/h264SampleFrames/frame-0640.h264 differ diff --git a/samples/h264SampleFrames/frame-0641.h264 b/samples/h264SampleFrames/frame-0641.h264 index c61ccb72d0..22a0cf1bb1 100644 Binary files a/samples/h264SampleFrames/frame-0641.h264 and b/samples/h264SampleFrames/frame-0641.h264 differ diff --git a/samples/h264SampleFrames/frame-0642.h264 b/samples/h264SampleFrames/frame-0642.h264 index d57a7c20cf..2f87cd2be0 100644 Binary files a/samples/h264SampleFrames/frame-0642.h264 and b/samples/h264SampleFrames/frame-0642.h264 differ diff --git a/samples/h264SampleFrames/frame-0643.h264 b/samples/h264SampleFrames/frame-0643.h264 index 6bfc2428e3..a0a22e3afc 100644 Binary files a/samples/h264SampleFrames/frame-0643.h264 and b/samples/h264SampleFrames/frame-0643.h264 differ diff --git a/samples/h264SampleFrames/frame-0644.h264 b/samples/h264SampleFrames/frame-0644.h264 index d3d0a42c9f..12af8dbf31 100644 Binary files a/samples/h264SampleFrames/frame-0644.h264 and b/samples/h264SampleFrames/frame-0644.h264 differ diff --git a/samples/h264SampleFrames/frame-0645.h264 b/samples/h264SampleFrames/frame-0645.h264 index e926899b56..3d53f5e7e3 100644 Binary files a/samples/h264SampleFrames/frame-0645.h264 and b/samples/h264SampleFrames/frame-0645.h264 differ diff --git a/samples/h264SampleFrames/frame-0646.h264 b/samples/h264SampleFrames/frame-0646.h264 index e6f4494e65..566132e800 100644 Binary files a/samples/h264SampleFrames/frame-0646.h264 and b/samples/h264SampleFrames/frame-0646.h264 differ diff --git a/samples/h264SampleFrames/frame-0647.h264 b/samples/h264SampleFrames/frame-0647.h264 index ab01bfcea0..9f441b13f4 100644 Binary files a/samples/h264SampleFrames/frame-0647.h264 and b/samples/h264SampleFrames/frame-0647.h264 differ diff --git a/samples/h264SampleFrames/frame-0648.h264 b/samples/h264SampleFrames/frame-0648.h264 index a4d26dfe3f..1452961b4b 100644 Binary files a/samples/h264SampleFrames/frame-0648.h264 and b/samples/h264SampleFrames/frame-0648.h264 differ diff --git a/samples/h264SampleFrames/frame-0649.h264 b/samples/h264SampleFrames/frame-0649.h264 index 52851190e8..e7fdba67a7 100644 Binary files a/samples/h264SampleFrames/frame-0649.h264 and b/samples/h264SampleFrames/frame-0649.h264 differ diff --git a/samples/h264SampleFrames/frame-0650.h264 b/samples/h264SampleFrames/frame-0650.h264 index b33cce86a8..aed401452d 100644 Binary files a/samples/h264SampleFrames/frame-0650.h264 and b/samples/h264SampleFrames/frame-0650.h264 differ diff --git a/samples/h264SampleFrames/frame-0651.h264 b/samples/h264SampleFrames/frame-0651.h264 index 861455fb0a..29bf269422 100644 Binary files a/samples/h264SampleFrames/frame-0651.h264 and b/samples/h264SampleFrames/frame-0651.h264 differ diff --git a/samples/h264SampleFrames/frame-0652.h264 b/samples/h264SampleFrames/frame-0652.h264 index 1a6362bad9..d5301b05ec 100644 Binary files a/samples/h264SampleFrames/frame-0652.h264 and b/samples/h264SampleFrames/frame-0652.h264 differ diff --git a/samples/h264SampleFrames/frame-0653.h264 b/samples/h264SampleFrames/frame-0653.h264 index a908afc317..153812fa2b 100644 Binary files a/samples/h264SampleFrames/frame-0653.h264 and b/samples/h264SampleFrames/frame-0653.h264 differ diff --git a/samples/h264SampleFrames/frame-0654.h264 b/samples/h264SampleFrames/frame-0654.h264 index dd56e355ec..ca51c39c2e 100644 Binary files a/samples/h264SampleFrames/frame-0654.h264 and b/samples/h264SampleFrames/frame-0654.h264 differ diff --git a/samples/h264SampleFrames/frame-0655.h264 b/samples/h264SampleFrames/frame-0655.h264 index fc48a50182..79d7bd0f03 100644 Binary files a/samples/h264SampleFrames/frame-0655.h264 and b/samples/h264SampleFrames/frame-0655.h264 differ diff --git a/samples/h264SampleFrames/frame-0656.h264 b/samples/h264SampleFrames/frame-0656.h264 index 4735547140..6139c03b5f 100644 Binary files a/samples/h264SampleFrames/frame-0656.h264 and b/samples/h264SampleFrames/frame-0656.h264 differ diff --git a/samples/h264SampleFrames/frame-0657.h264 b/samples/h264SampleFrames/frame-0657.h264 index 9f75ce4da3..5201c07a53 100644 Binary files a/samples/h264SampleFrames/frame-0657.h264 and b/samples/h264SampleFrames/frame-0657.h264 differ diff --git a/samples/h264SampleFrames/frame-0658.h264 b/samples/h264SampleFrames/frame-0658.h264 index 78dba9b8ed..646cf8cd02 100644 Binary files a/samples/h264SampleFrames/frame-0658.h264 and b/samples/h264SampleFrames/frame-0658.h264 differ diff --git a/samples/h264SampleFrames/frame-0659.h264 b/samples/h264SampleFrames/frame-0659.h264 index e60b851d32..bb7c7d8b83 100644 Binary files a/samples/h264SampleFrames/frame-0659.h264 and b/samples/h264SampleFrames/frame-0659.h264 differ diff --git a/samples/h264SampleFrames/frame-0660.h264 b/samples/h264SampleFrames/frame-0660.h264 index 27f9aca290..daf124f271 100644 Binary files a/samples/h264SampleFrames/frame-0660.h264 and b/samples/h264SampleFrames/frame-0660.h264 differ diff --git a/samples/h264SampleFrames/frame-0661.h264 b/samples/h264SampleFrames/frame-0661.h264 index 9fb356f048..682cd995e9 100644 Binary files a/samples/h264SampleFrames/frame-0661.h264 and b/samples/h264SampleFrames/frame-0661.h264 differ diff --git a/samples/h264SampleFrames/frame-0662.h264 b/samples/h264SampleFrames/frame-0662.h264 index fdf6bdd82f..d8969e0c9c 100644 Binary files a/samples/h264SampleFrames/frame-0662.h264 and b/samples/h264SampleFrames/frame-0662.h264 differ diff --git a/samples/h264SampleFrames/frame-0663.h264 b/samples/h264SampleFrames/frame-0663.h264 index 8855b424a6..33937239ed 100644 Binary files a/samples/h264SampleFrames/frame-0663.h264 and b/samples/h264SampleFrames/frame-0663.h264 differ diff --git a/samples/h264SampleFrames/frame-0664.h264 b/samples/h264SampleFrames/frame-0664.h264 index b269186ca5..eeae715784 100644 Binary files a/samples/h264SampleFrames/frame-0664.h264 and b/samples/h264SampleFrames/frame-0664.h264 differ diff --git a/samples/h264SampleFrames/frame-0665.h264 b/samples/h264SampleFrames/frame-0665.h264 index 826bb35684..e5b4b7371e 100644 Binary files a/samples/h264SampleFrames/frame-0665.h264 and b/samples/h264SampleFrames/frame-0665.h264 differ diff --git a/samples/h264SampleFrames/frame-0666.h264 b/samples/h264SampleFrames/frame-0666.h264 index 0184ad63cc..b7b8374a95 100644 Binary files a/samples/h264SampleFrames/frame-0666.h264 and b/samples/h264SampleFrames/frame-0666.h264 differ diff --git a/samples/h264SampleFrames/frame-0667.h264 b/samples/h264SampleFrames/frame-0667.h264 index 96add177c1..b7ab57ec68 100644 Binary files a/samples/h264SampleFrames/frame-0667.h264 and b/samples/h264SampleFrames/frame-0667.h264 differ diff --git a/samples/h264SampleFrames/frame-0668.h264 b/samples/h264SampleFrames/frame-0668.h264 index 6419068816..cfc26da594 100644 Binary files a/samples/h264SampleFrames/frame-0668.h264 and b/samples/h264SampleFrames/frame-0668.h264 differ diff --git a/samples/h264SampleFrames/frame-0669.h264 b/samples/h264SampleFrames/frame-0669.h264 index 7709563995..884c4bee8a 100644 Binary files a/samples/h264SampleFrames/frame-0669.h264 and b/samples/h264SampleFrames/frame-0669.h264 differ diff --git a/samples/h264SampleFrames/frame-0670.h264 b/samples/h264SampleFrames/frame-0670.h264 index 7c7c847a65..6d04bff2a6 100644 Binary files a/samples/h264SampleFrames/frame-0670.h264 and b/samples/h264SampleFrames/frame-0670.h264 differ diff --git a/samples/h264SampleFrames/frame-0671.h264 b/samples/h264SampleFrames/frame-0671.h264 index 7c0fd4a06e..7e97869d02 100644 Binary files a/samples/h264SampleFrames/frame-0671.h264 and b/samples/h264SampleFrames/frame-0671.h264 differ diff --git a/samples/h264SampleFrames/frame-0672.h264 b/samples/h264SampleFrames/frame-0672.h264 index f6a0ea9057..913a2f9004 100644 Binary files a/samples/h264SampleFrames/frame-0672.h264 and b/samples/h264SampleFrames/frame-0672.h264 differ diff --git a/samples/h264SampleFrames/frame-0673.h264 b/samples/h264SampleFrames/frame-0673.h264 index 1cf5c9ab08..2dcd015f98 100644 Binary files a/samples/h264SampleFrames/frame-0673.h264 and b/samples/h264SampleFrames/frame-0673.h264 differ diff --git a/samples/h264SampleFrames/frame-0674.h264 b/samples/h264SampleFrames/frame-0674.h264 index 58f43041be..9906504e57 100644 Binary files a/samples/h264SampleFrames/frame-0674.h264 and b/samples/h264SampleFrames/frame-0674.h264 differ diff --git a/samples/h264SampleFrames/frame-0675.h264 b/samples/h264SampleFrames/frame-0675.h264 index dc60800d71..40777efb82 100644 Binary files a/samples/h264SampleFrames/frame-0675.h264 and b/samples/h264SampleFrames/frame-0675.h264 differ diff --git a/samples/h264SampleFrames/frame-0676.h264 b/samples/h264SampleFrames/frame-0676.h264 index 2c1f6109f1..fc8039964d 100644 Binary files a/samples/h264SampleFrames/frame-0676.h264 and b/samples/h264SampleFrames/frame-0676.h264 differ diff --git a/samples/h264SampleFrames/frame-0677.h264 b/samples/h264SampleFrames/frame-0677.h264 index b37ceb73bf..fc5d148c90 100644 Binary files a/samples/h264SampleFrames/frame-0677.h264 and b/samples/h264SampleFrames/frame-0677.h264 differ diff --git a/samples/h264SampleFrames/frame-0678.h264 b/samples/h264SampleFrames/frame-0678.h264 index cbaff93f60..5fcb20a4bd 100644 Binary files a/samples/h264SampleFrames/frame-0678.h264 and b/samples/h264SampleFrames/frame-0678.h264 differ diff --git a/samples/h264SampleFrames/frame-0679.h264 b/samples/h264SampleFrames/frame-0679.h264 index 2d2c225f05..e734497833 100644 Binary files a/samples/h264SampleFrames/frame-0679.h264 and b/samples/h264SampleFrames/frame-0679.h264 differ diff --git a/samples/h264SampleFrames/frame-0680.h264 b/samples/h264SampleFrames/frame-0680.h264 index 1898caccbe..23b242a01e 100644 Binary files a/samples/h264SampleFrames/frame-0680.h264 and b/samples/h264SampleFrames/frame-0680.h264 differ diff --git a/samples/h264SampleFrames/frame-0681.h264 b/samples/h264SampleFrames/frame-0681.h264 index 1c8d925844..1df06eb6eb 100644 Binary files a/samples/h264SampleFrames/frame-0681.h264 and b/samples/h264SampleFrames/frame-0681.h264 differ diff --git a/samples/h264SampleFrames/frame-0682.h264 b/samples/h264SampleFrames/frame-0682.h264 index e4cba07975..7163b9148b 100644 Binary files a/samples/h264SampleFrames/frame-0682.h264 and b/samples/h264SampleFrames/frame-0682.h264 differ diff --git a/samples/h264SampleFrames/frame-0683.h264 b/samples/h264SampleFrames/frame-0683.h264 index 5a911572f6..d3fd25c96b 100644 Binary files a/samples/h264SampleFrames/frame-0683.h264 and b/samples/h264SampleFrames/frame-0683.h264 differ diff --git a/samples/h264SampleFrames/frame-0684.h264 b/samples/h264SampleFrames/frame-0684.h264 index d8d24b98bf..c03e177516 100644 Binary files a/samples/h264SampleFrames/frame-0684.h264 and b/samples/h264SampleFrames/frame-0684.h264 differ diff --git a/samples/h264SampleFrames/frame-0685.h264 b/samples/h264SampleFrames/frame-0685.h264 index 7a35ea61dc..7631c9296c 100644 Binary files a/samples/h264SampleFrames/frame-0685.h264 and b/samples/h264SampleFrames/frame-0685.h264 differ diff --git a/samples/h264SampleFrames/frame-0686.h264 b/samples/h264SampleFrames/frame-0686.h264 index 35932fd9c1..462a0c50af 100644 Binary files a/samples/h264SampleFrames/frame-0686.h264 and b/samples/h264SampleFrames/frame-0686.h264 differ diff --git a/samples/h264SampleFrames/frame-0687.h264 b/samples/h264SampleFrames/frame-0687.h264 index 92e04d69e1..dcf8c2f3a3 100644 Binary files a/samples/h264SampleFrames/frame-0687.h264 and b/samples/h264SampleFrames/frame-0687.h264 differ diff --git a/samples/h264SampleFrames/frame-0688.h264 b/samples/h264SampleFrames/frame-0688.h264 index 4ee0cf7987..cd200ae216 100644 Binary files a/samples/h264SampleFrames/frame-0688.h264 and b/samples/h264SampleFrames/frame-0688.h264 differ diff --git a/samples/h264SampleFrames/frame-0689.h264 b/samples/h264SampleFrames/frame-0689.h264 index d28fb9629c..9eb8254a20 100644 Binary files a/samples/h264SampleFrames/frame-0689.h264 and b/samples/h264SampleFrames/frame-0689.h264 differ diff --git a/samples/h264SampleFrames/frame-0690.h264 b/samples/h264SampleFrames/frame-0690.h264 index ce3ecd61d9..2dfaf950d9 100644 Binary files a/samples/h264SampleFrames/frame-0690.h264 and b/samples/h264SampleFrames/frame-0690.h264 differ diff --git a/samples/h264SampleFrames/frame-0691.h264 b/samples/h264SampleFrames/frame-0691.h264 index d278150b6e..a02a261325 100644 Binary files a/samples/h264SampleFrames/frame-0691.h264 and b/samples/h264SampleFrames/frame-0691.h264 differ diff --git a/samples/h264SampleFrames/frame-0692.h264 b/samples/h264SampleFrames/frame-0692.h264 index 2042a267d7..a50267718a 100644 Binary files a/samples/h264SampleFrames/frame-0692.h264 and b/samples/h264SampleFrames/frame-0692.h264 differ diff --git a/samples/h264SampleFrames/frame-0693.h264 b/samples/h264SampleFrames/frame-0693.h264 index ab4a499139..fc9d4557d0 100644 Binary files a/samples/h264SampleFrames/frame-0693.h264 and b/samples/h264SampleFrames/frame-0693.h264 differ diff --git a/samples/h264SampleFrames/frame-0694.h264 b/samples/h264SampleFrames/frame-0694.h264 index bd9c19450a..b7d2d2c14b 100644 Binary files a/samples/h264SampleFrames/frame-0694.h264 and b/samples/h264SampleFrames/frame-0694.h264 differ diff --git a/samples/h264SampleFrames/frame-0695.h264 b/samples/h264SampleFrames/frame-0695.h264 index 22b979ac40..d5d8183aca 100644 Binary files a/samples/h264SampleFrames/frame-0695.h264 and b/samples/h264SampleFrames/frame-0695.h264 differ diff --git a/samples/h264SampleFrames/frame-0696.h264 b/samples/h264SampleFrames/frame-0696.h264 index 9e6071baeb..aa23e5bc3b 100644 Binary files a/samples/h264SampleFrames/frame-0696.h264 and b/samples/h264SampleFrames/frame-0696.h264 differ diff --git a/samples/h264SampleFrames/frame-0697.h264 b/samples/h264SampleFrames/frame-0697.h264 index c68024e916..922b91e2bd 100644 Binary files a/samples/h264SampleFrames/frame-0697.h264 and b/samples/h264SampleFrames/frame-0697.h264 differ diff --git a/samples/h264SampleFrames/frame-0698.h264 b/samples/h264SampleFrames/frame-0698.h264 index 846117cabb..4481a47ac5 100644 Binary files a/samples/h264SampleFrames/frame-0698.h264 and b/samples/h264SampleFrames/frame-0698.h264 differ diff --git a/samples/h264SampleFrames/frame-0699.h264 b/samples/h264SampleFrames/frame-0699.h264 index b76eff7c34..19467b6994 100644 Binary files a/samples/h264SampleFrames/frame-0699.h264 and b/samples/h264SampleFrames/frame-0699.h264 differ diff --git a/samples/h264SampleFrames/frame-0700.h264 b/samples/h264SampleFrames/frame-0700.h264 index 461bd6a137..f056b94d59 100644 Binary files a/samples/h264SampleFrames/frame-0700.h264 and b/samples/h264SampleFrames/frame-0700.h264 differ diff --git a/samples/h264SampleFrames/frame-0701.h264 b/samples/h264SampleFrames/frame-0701.h264 index 504889fff6..85e0127c0c 100644 Binary files a/samples/h264SampleFrames/frame-0701.h264 and b/samples/h264SampleFrames/frame-0701.h264 differ diff --git a/samples/h264SampleFrames/frame-0702.h264 b/samples/h264SampleFrames/frame-0702.h264 index 14608e0895..d25c3724ba 100644 Binary files a/samples/h264SampleFrames/frame-0702.h264 and b/samples/h264SampleFrames/frame-0702.h264 differ diff --git a/samples/h264SampleFrames/frame-0703.h264 b/samples/h264SampleFrames/frame-0703.h264 index bf6175c888..007bc49474 100644 Binary files a/samples/h264SampleFrames/frame-0703.h264 and b/samples/h264SampleFrames/frame-0703.h264 differ diff --git a/samples/h264SampleFrames/frame-0704.h264 b/samples/h264SampleFrames/frame-0704.h264 index a95e32eb3f..1d0255d68e 100644 Binary files a/samples/h264SampleFrames/frame-0704.h264 and b/samples/h264SampleFrames/frame-0704.h264 differ diff --git a/samples/h264SampleFrames/frame-0705.h264 b/samples/h264SampleFrames/frame-0705.h264 index 0d727f6755..f88d7ed431 100644 Binary files a/samples/h264SampleFrames/frame-0705.h264 and b/samples/h264SampleFrames/frame-0705.h264 differ diff --git a/samples/h264SampleFrames/frame-0706.h264 b/samples/h264SampleFrames/frame-0706.h264 index 1f35a66710..e8a27e1e45 100644 Binary files a/samples/h264SampleFrames/frame-0706.h264 and b/samples/h264SampleFrames/frame-0706.h264 differ diff --git a/samples/h264SampleFrames/frame-0707.h264 b/samples/h264SampleFrames/frame-0707.h264 index 179bca4838..569e9d1ac2 100644 Binary files a/samples/h264SampleFrames/frame-0707.h264 and b/samples/h264SampleFrames/frame-0707.h264 differ diff --git a/samples/h264SampleFrames/frame-0708.h264 b/samples/h264SampleFrames/frame-0708.h264 index 8712def4d9..3e2e9952c6 100644 Binary files a/samples/h264SampleFrames/frame-0708.h264 and b/samples/h264SampleFrames/frame-0708.h264 differ diff --git a/samples/h264SampleFrames/frame-0709.h264 b/samples/h264SampleFrames/frame-0709.h264 index 32bd8c80f3..5a0a8815cc 100644 Binary files a/samples/h264SampleFrames/frame-0709.h264 and b/samples/h264SampleFrames/frame-0709.h264 differ diff --git a/samples/h264SampleFrames/frame-0710.h264 b/samples/h264SampleFrames/frame-0710.h264 index 7f0b7d6e3c..1a261ee1e1 100644 Binary files a/samples/h264SampleFrames/frame-0710.h264 and b/samples/h264SampleFrames/frame-0710.h264 differ diff --git a/samples/h264SampleFrames/frame-0711.h264 b/samples/h264SampleFrames/frame-0711.h264 index 9b0f96a91c..5ce6a0d5b3 100644 Binary files a/samples/h264SampleFrames/frame-0711.h264 and b/samples/h264SampleFrames/frame-0711.h264 differ diff --git a/samples/h264SampleFrames/frame-0712.h264 b/samples/h264SampleFrames/frame-0712.h264 index 1e9e399294..ea8885832b 100644 Binary files a/samples/h264SampleFrames/frame-0712.h264 and b/samples/h264SampleFrames/frame-0712.h264 differ diff --git a/samples/h264SampleFrames/frame-0713.h264 b/samples/h264SampleFrames/frame-0713.h264 index 68e439a0a5..79350e60ae 100644 Binary files a/samples/h264SampleFrames/frame-0713.h264 and b/samples/h264SampleFrames/frame-0713.h264 differ diff --git a/samples/h264SampleFrames/frame-0714.h264 b/samples/h264SampleFrames/frame-0714.h264 index 3a8b8b3701..c4fe453903 100644 Binary files a/samples/h264SampleFrames/frame-0714.h264 and b/samples/h264SampleFrames/frame-0714.h264 differ diff --git a/samples/h264SampleFrames/frame-0715.h264 b/samples/h264SampleFrames/frame-0715.h264 index 4062413cb8..318be85fb5 100644 Binary files a/samples/h264SampleFrames/frame-0715.h264 and b/samples/h264SampleFrames/frame-0715.h264 differ diff --git a/samples/h264SampleFrames/frame-0716.h264 b/samples/h264SampleFrames/frame-0716.h264 index 5e90e388a7..1634162e12 100644 Binary files a/samples/h264SampleFrames/frame-0716.h264 and b/samples/h264SampleFrames/frame-0716.h264 differ diff --git a/samples/h264SampleFrames/frame-0717.h264 b/samples/h264SampleFrames/frame-0717.h264 index 8408bef69a..ef4f3d606e 100644 Binary files a/samples/h264SampleFrames/frame-0717.h264 and b/samples/h264SampleFrames/frame-0717.h264 differ diff --git a/samples/h264SampleFrames/frame-0718.h264 b/samples/h264SampleFrames/frame-0718.h264 index 192e1bdb75..bce43d15ba 100644 Binary files a/samples/h264SampleFrames/frame-0718.h264 and b/samples/h264SampleFrames/frame-0718.h264 differ diff --git a/samples/h264SampleFrames/frame-0719.h264 b/samples/h264SampleFrames/frame-0719.h264 index 1274a9b58e..9b813184b3 100644 Binary files a/samples/h264SampleFrames/frame-0719.h264 and b/samples/h264SampleFrames/frame-0719.h264 differ diff --git a/samples/h264SampleFrames/frame-0720.h264 b/samples/h264SampleFrames/frame-0720.h264 index cb6a1962ad..9289e72caf 100644 Binary files a/samples/h264SampleFrames/frame-0720.h264 and b/samples/h264SampleFrames/frame-0720.h264 differ diff --git a/samples/h264SampleFrames/frame-0721.h264 b/samples/h264SampleFrames/frame-0721.h264 index dc55797bcd..d58706175b 100644 Binary files a/samples/h264SampleFrames/frame-0721.h264 and b/samples/h264SampleFrames/frame-0721.h264 differ diff --git a/samples/h264SampleFrames/frame-0722.h264 b/samples/h264SampleFrames/frame-0722.h264 index 404cbb6ba5..f90f581586 100644 Binary files a/samples/h264SampleFrames/frame-0722.h264 and b/samples/h264SampleFrames/frame-0722.h264 differ diff --git a/samples/h264SampleFrames/frame-0723.h264 b/samples/h264SampleFrames/frame-0723.h264 index 4fc1394cac..9d63756dac 100644 Binary files a/samples/h264SampleFrames/frame-0723.h264 and b/samples/h264SampleFrames/frame-0723.h264 differ diff --git a/samples/h264SampleFrames/frame-0724.h264 b/samples/h264SampleFrames/frame-0724.h264 index 4b261af734..0939c674b2 100644 Binary files a/samples/h264SampleFrames/frame-0724.h264 and b/samples/h264SampleFrames/frame-0724.h264 differ diff --git a/samples/h264SampleFrames/frame-0725.h264 b/samples/h264SampleFrames/frame-0725.h264 index 14ac29c115..ad09babb73 100644 Binary files a/samples/h264SampleFrames/frame-0725.h264 and b/samples/h264SampleFrames/frame-0725.h264 differ diff --git a/samples/h264SampleFrames/frame-0726.h264 b/samples/h264SampleFrames/frame-0726.h264 index 8e1ea4d36d..cd9aec4c57 100644 Binary files a/samples/h264SampleFrames/frame-0726.h264 and b/samples/h264SampleFrames/frame-0726.h264 differ diff --git a/samples/h264SampleFrames/frame-0727.h264 b/samples/h264SampleFrames/frame-0727.h264 index 2383b46441..e26f5c8463 100644 Binary files a/samples/h264SampleFrames/frame-0727.h264 and b/samples/h264SampleFrames/frame-0727.h264 differ diff --git a/samples/h264SampleFrames/frame-0728.h264 b/samples/h264SampleFrames/frame-0728.h264 index 8e124e8627..196c21ee27 100644 Binary files a/samples/h264SampleFrames/frame-0728.h264 and b/samples/h264SampleFrames/frame-0728.h264 differ diff --git a/samples/h264SampleFrames/frame-0729.h264 b/samples/h264SampleFrames/frame-0729.h264 index a47d3ed05a..11c1bebd42 100644 Binary files a/samples/h264SampleFrames/frame-0729.h264 and b/samples/h264SampleFrames/frame-0729.h264 differ diff --git a/samples/h264SampleFrames/frame-0730.h264 b/samples/h264SampleFrames/frame-0730.h264 index 4550f3e58b..168a4f12c1 100644 Binary files a/samples/h264SampleFrames/frame-0730.h264 and b/samples/h264SampleFrames/frame-0730.h264 differ diff --git a/samples/h264SampleFrames/frame-0731.h264 b/samples/h264SampleFrames/frame-0731.h264 index bafa50b366..7c147773c8 100644 Binary files a/samples/h264SampleFrames/frame-0731.h264 and b/samples/h264SampleFrames/frame-0731.h264 differ diff --git a/samples/h264SampleFrames/frame-0732.h264 b/samples/h264SampleFrames/frame-0732.h264 index 5327e38df5..e21cf7086a 100644 Binary files a/samples/h264SampleFrames/frame-0732.h264 and b/samples/h264SampleFrames/frame-0732.h264 differ diff --git a/samples/h264SampleFrames/frame-0733.h264 b/samples/h264SampleFrames/frame-0733.h264 index 00ac546312..a792c7ec2d 100644 Binary files a/samples/h264SampleFrames/frame-0733.h264 and b/samples/h264SampleFrames/frame-0733.h264 differ diff --git a/samples/h264SampleFrames/frame-0734.h264 b/samples/h264SampleFrames/frame-0734.h264 index 039d3d9188..a06bab402d 100644 Binary files a/samples/h264SampleFrames/frame-0734.h264 and b/samples/h264SampleFrames/frame-0734.h264 differ diff --git a/samples/h264SampleFrames/frame-0735.h264 b/samples/h264SampleFrames/frame-0735.h264 index 95835c6f59..ff328f0513 100644 Binary files a/samples/h264SampleFrames/frame-0735.h264 and b/samples/h264SampleFrames/frame-0735.h264 differ diff --git a/samples/h264SampleFrames/frame-0736.h264 b/samples/h264SampleFrames/frame-0736.h264 index 0db789fb3c..474c891bc4 100644 Binary files a/samples/h264SampleFrames/frame-0736.h264 and b/samples/h264SampleFrames/frame-0736.h264 differ diff --git a/samples/h264SampleFrames/frame-0737.h264 b/samples/h264SampleFrames/frame-0737.h264 index 14c716cb3d..9462812b2f 100644 Binary files a/samples/h264SampleFrames/frame-0737.h264 and b/samples/h264SampleFrames/frame-0737.h264 differ diff --git a/samples/h264SampleFrames/frame-0738.h264 b/samples/h264SampleFrames/frame-0738.h264 index b8d0b48ae3..9d417ee7a4 100644 Binary files a/samples/h264SampleFrames/frame-0738.h264 and b/samples/h264SampleFrames/frame-0738.h264 differ diff --git a/samples/h264SampleFrames/frame-0739.h264 b/samples/h264SampleFrames/frame-0739.h264 index 7664f44b46..007f277206 100644 Binary files a/samples/h264SampleFrames/frame-0739.h264 and b/samples/h264SampleFrames/frame-0739.h264 differ diff --git a/samples/h264SampleFrames/frame-0740.h264 b/samples/h264SampleFrames/frame-0740.h264 index d99c3c7423..7a8b22af4d 100644 Binary files a/samples/h264SampleFrames/frame-0740.h264 and b/samples/h264SampleFrames/frame-0740.h264 differ diff --git a/samples/h264SampleFrames/frame-0741.h264 b/samples/h264SampleFrames/frame-0741.h264 index c81858fbce..874bafac57 100644 Binary files a/samples/h264SampleFrames/frame-0741.h264 and b/samples/h264SampleFrames/frame-0741.h264 differ diff --git a/samples/h264SampleFrames/frame-0742.h264 b/samples/h264SampleFrames/frame-0742.h264 index 9662826739..b6bcaf5ca7 100644 Binary files a/samples/h264SampleFrames/frame-0742.h264 and b/samples/h264SampleFrames/frame-0742.h264 differ diff --git a/samples/h264SampleFrames/frame-0743.h264 b/samples/h264SampleFrames/frame-0743.h264 index 456b4b5bc2..a2d9b7ef95 100644 Binary files a/samples/h264SampleFrames/frame-0743.h264 and b/samples/h264SampleFrames/frame-0743.h264 differ diff --git a/samples/h264SampleFrames/frame-0744.h264 b/samples/h264SampleFrames/frame-0744.h264 index 473dedf5c7..d1f9dabfb2 100644 Binary files a/samples/h264SampleFrames/frame-0744.h264 and b/samples/h264SampleFrames/frame-0744.h264 differ diff --git a/samples/h264SampleFrames/frame-0745.h264 b/samples/h264SampleFrames/frame-0745.h264 index d4aa4ce218..0f19c6844f 100644 Binary files a/samples/h264SampleFrames/frame-0745.h264 and b/samples/h264SampleFrames/frame-0745.h264 differ diff --git a/samples/h264SampleFrames/frame-0746.h264 b/samples/h264SampleFrames/frame-0746.h264 index 9c5a0b8da5..624aa278a5 100644 Binary files a/samples/h264SampleFrames/frame-0746.h264 and b/samples/h264SampleFrames/frame-0746.h264 differ diff --git a/samples/h264SampleFrames/frame-0747.h264 b/samples/h264SampleFrames/frame-0747.h264 index c1498dd2af..2263ec5249 100644 Binary files a/samples/h264SampleFrames/frame-0747.h264 and b/samples/h264SampleFrames/frame-0747.h264 differ diff --git a/samples/h264SampleFrames/frame-0748.h264 b/samples/h264SampleFrames/frame-0748.h264 index e6cf5b515d..b0b427cfcb 100644 Binary files a/samples/h264SampleFrames/frame-0748.h264 and b/samples/h264SampleFrames/frame-0748.h264 differ diff --git a/samples/h264SampleFrames/frame-0749.h264 b/samples/h264SampleFrames/frame-0749.h264 index 1b736d659a..aa1c39b0c6 100644 Binary files a/samples/h264SampleFrames/frame-0749.h264 and b/samples/h264SampleFrames/frame-0749.h264 differ diff --git a/samples/h264SampleFrames/frame-0750.h264 b/samples/h264SampleFrames/frame-0750.h264 index 5483b51f27..0ba27894ee 100644 Binary files a/samples/h264SampleFrames/frame-0750.h264 and b/samples/h264SampleFrames/frame-0750.h264 differ diff --git a/samples/h264SampleFrames/frame-0751.h264 b/samples/h264SampleFrames/frame-0751.h264 index 9f9327d81a..5f0adeccfa 100644 Binary files a/samples/h264SampleFrames/frame-0751.h264 and b/samples/h264SampleFrames/frame-0751.h264 differ diff --git a/samples/h264SampleFrames/frame-0752.h264 b/samples/h264SampleFrames/frame-0752.h264 index a3e97d4329..ede5f3e7f9 100644 Binary files a/samples/h264SampleFrames/frame-0752.h264 and b/samples/h264SampleFrames/frame-0752.h264 differ diff --git a/samples/h264SampleFrames/frame-0753.h264 b/samples/h264SampleFrames/frame-0753.h264 index c16c4e8dee..617b490927 100644 Binary files a/samples/h264SampleFrames/frame-0753.h264 and b/samples/h264SampleFrames/frame-0753.h264 differ diff --git a/samples/h264SampleFrames/frame-0754.h264 b/samples/h264SampleFrames/frame-0754.h264 index 34bbc312d4..72b3082fd6 100644 Binary files a/samples/h264SampleFrames/frame-0754.h264 and b/samples/h264SampleFrames/frame-0754.h264 differ diff --git a/samples/h264SampleFrames/frame-0755.h264 b/samples/h264SampleFrames/frame-0755.h264 index 0a8cf256e2..50ef21bedb 100644 Binary files a/samples/h264SampleFrames/frame-0755.h264 and b/samples/h264SampleFrames/frame-0755.h264 differ diff --git a/samples/h264SampleFrames/frame-0756.h264 b/samples/h264SampleFrames/frame-0756.h264 index c639ec0380..b2fcbb85b2 100644 Binary files a/samples/h264SampleFrames/frame-0756.h264 and b/samples/h264SampleFrames/frame-0756.h264 differ diff --git a/samples/h264SampleFrames/frame-0757.h264 b/samples/h264SampleFrames/frame-0757.h264 index 4c25f9578b..af60e7a5d0 100644 Binary files a/samples/h264SampleFrames/frame-0757.h264 and b/samples/h264SampleFrames/frame-0757.h264 differ diff --git a/samples/h264SampleFrames/frame-0758.h264 b/samples/h264SampleFrames/frame-0758.h264 index 196aa8dddd..a5b09fc525 100644 Binary files a/samples/h264SampleFrames/frame-0758.h264 and b/samples/h264SampleFrames/frame-0758.h264 differ diff --git a/samples/h264SampleFrames/frame-0759.h264 b/samples/h264SampleFrames/frame-0759.h264 index edbfcec65a..e451553d8a 100644 Binary files a/samples/h264SampleFrames/frame-0759.h264 and b/samples/h264SampleFrames/frame-0759.h264 differ diff --git a/samples/h264SampleFrames/frame-0760.h264 b/samples/h264SampleFrames/frame-0760.h264 index cec308350d..af80f986cd 100644 Binary files a/samples/h264SampleFrames/frame-0760.h264 and b/samples/h264SampleFrames/frame-0760.h264 differ diff --git a/samples/h264SampleFrames/frame-0761.h264 b/samples/h264SampleFrames/frame-0761.h264 index ceb0d9bbeb..6fd4cea944 100644 Binary files a/samples/h264SampleFrames/frame-0761.h264 and b/samples/h264SampleFrames/frame-0761.h264 differ diff --git a/samples/h264SampleFrames/frame-0762.h264 b/samples/h264SampleFrames/frame-0762.h264 index bb97366fee..e4fea1bc2d 100644 Binary files a/samples/h264SampleFrames/frame-0762.h264 and b/samples/h264SampleFrames/frame-0762.h264 differ diff --git a/samples/h264SampleFrames/frame-0763.h264 b/samples/h264SampleFrames/frame-0763.h264 index cb2b8031d0..5bd29d28ea 100644 Binary files a/samples/h264SampleFrames/frame-0763.h264 and b/samples/h264SampleFrames/frame-0763.h264 differ diff --git a/samples/h264SampleFrames/frame-0764.h264 b/samples/h264SampleFrames/frame-0764.h264 index ccca1953f4..a66fd48e8b 100644 Binary files a/samples/h264SampleFrames/frame-0764.h264 and b/samples/h264SampleFrames/frame-0764.h264 differ diff --git a/samples/h264SampleFrames/frame-0765.h264 b/samples/h264SampleFrames/frame-0765.h264 index d9a3994aee..d4a95dd7ba 100644 Binary files a/samples/h264SampleFrames/frame-0765.h264 and b/samples/h264SampleFrames/frame-0765.h264 differ diff --git a/samples/h264SampleFrames/frame-0766.h264 b/samples/h264SampleFrames/frame-0766.h264 index 4d1c9ab9d2..2757eb79c9 100644 Binary files a/samples/h264SampleFrames/frame-0766.h264 and b/samples/h264SampleFrames/frame-0766.h264 differ diff --git a/samples/h264SampleFrames/frame-0767.h264 b/samples/h264SampleFrames/frame-0767.h264 index c8952a585b..76bf1c40ad 100644 Binary files a/samples/h264SampleFrames/frame-0767.h264 and b/samples/h264SampleFrames/frame-0767.h264 differ diff --git a/samples/h264SampleFrames/frame-0768.h264 b/samples/h264SampleFrames/frame-0768.h264 index 475579700e..8bbfbddf66 100644 Binary files a/samples/h264SampleFrames/frame-0768.h264 and b/samples/h264SampleFrames/frame-0768.h264 differ diff --git a/samples/h264SampleFrames/frame-0769.h264 b/samples/h264SampleFrames/frame-0769.h264 index f506e0aa32..27abdd123e 100644 Binary files a/samples/h264SampleFrames/frame-0769.h264 and b/samples/h264SampleFrames/frame-0769.h264 differ diff --git a/samples/h264SampleFrames/frame-0770.h264 b/samples/h264SampleFrames/frame-0770.h264 index c78dc3b6eb..ee3f107a8f 100644 Binary files a/samples/h264SampleFrames/frame-0770.h264 and b/samples/h264SampleFrames/frame-0770.h264 differ diff --git a/samples/h264SampleFrames/frame-0771.h264 b/samples/h264SampleFrames/frame-0771.h264 index 329d83ad7b..d1381281ec 100644 Binary files a/samples/h264SampleFrames/frame-0771.h264 and b/samples/h264SampleFrames/frame-0771.h264 differ diff --git a/samples/h264SampleFrames/frame-0772.h264 b/samples/h264SampleFrames/frame-0772.h264 index b6c0bfaeb9..212e11111a 100644 Binary files a/samples/h264SampleFrames/frame-0772.h264 and b/samples/h264SampleFrames/frame-0772.h264 differ diff --git a/samples/h264SampleFrames/frame-0773.h264 b/samples/h264SampleFrames/frame-0773.h264 index cb6aac2a7b..372c87b6b6 100644 Binary files a/samples/h264SampleFrames/frame-0773.h264 and b/samples/h264SampleFrames/frame-0773.h264 differ diff --git a/samples/h264SampleFrames/frame-0774.h264 b/samples/h264SampleFrames/frame-0774.h264 index cc31898520..371c498185 100644 Binary files a/samples/h264SampleFrames/frame-0774.h264 and b/samples/h264SampleFrames/frame-0774.h264 differ diff --git a/samples/h264SampleFrames/frame-0775.h264 b/samples/h264SampleFrames/frame-0775.h264 index ddf4c00b0c..071d55b0ee 100644 Binary files a/samples/h264SampleFrames/frame-0775.h264 and b/samples/h264SampleFrames/frame-0775.h264 differ diff --git a/samples/h264SampleFrames/frame-0776.h264 b/samples/h264SampleFrames/frame-0776.h264 index ff0b929f76..1989762b3b 100644 Binary files a/samples/h264SampleFrames/frame-0776.h264 and b/samples/h264SampleFrames/frame-0776.h264 differ diff --git a/samples/h264SampleFrames/frame-0777.h264 b/samples/h264SampleFrames/frame-0777.h264 index ec031d833e..15bc25f585 100644 Binary files a/samples/h264SampleFrames/frame-0777.h264 and b/samples/h264SampleFrames/frame-0777.h264 differ diff --git a/samples/h264SampleFrames/frame-0778.h264 b/samples/h264SampleFrames/frame-0778.h264 index 311eecea62..9577e1fc3e 100644 Binary files a/samples/h264SampleFrames/frame-0778.h264 and b/samples/h264SampleFrames/frame-0778.h264 differ diff --git a/samples/h264SampleFrames/frame-0779.h264 b/samples/h264SampleFrames/frame-0779.h264 index 804c3b09d7..484a93e9e8 100644 Binary files a/samples/h264SampleFrames/frame-0779.h264 and b/samples/h264SampleFrames/frame-0779.h264 differ diff --git a/samples/h264SampleFrames/frame-0780.h264 b/samples/h264SampleFrames/frame-0780.h264 index a3ec87f1ca..a4ecc8a90a 100644 Binary files a/samples/h264SampleFrames/frame-0780.h264 and b/samples/h264SampleFrames/frame-0780.h264 differ diff --git a/samples/h264SampleFrames/frame-0781.h264 b/samples/h264SampleFrames/frame-0781.h264 index 3b96f8fde6..64a3b401d0 100644 Binary files a/samples/h264SampleFrames/frame-0781.h264 and b/samples/h264SampleFrames/frame-0781.h264 differ diff --git a/samples/h264SampleFrames/frame-0782.h264 b/samples/h264SampleFrames/frame-0782.h264 index 744b06e33e..6a977d580e 100644 Binary files a/samples/h264SampleFrames/frame-0782.h264 and b/samples/h264SampleFrames/frame-0782.h264 differ diff --git a/samples/h264SampleFrames/frame-0783.h264 b/samples/h264SampleFrames/frame-0783.h264 index 196156c2b8..67d09676f8 100644 Binary files a/samples/h264SampleFrames/frame-0783.h264 and b/samples/h264SampleFrames/frame-0783.h264 differ diff --git a/samples/h264SampleFrames/frame-0784.h264 b/samples/h264SampleFrames/frame-0784.h264 index ea8dcd363c..dcb5b99de9 100644 Binary files a/samples/h264SampleFrames/frame-0784.h264 and b/samples/h264SampleFrames/frame-0784.h264 differ diff --git a/samples/h264SampleFrames/frame-0785.h264 b/samples/h264SampleFrames/frame-0785.h264 index 155a454069..95470730d4 100644 Binary files a/samples/h264SampleFrames/frame-0785.h264 and b/samples/h264SampleFrames/frame-0785.h264 differ diff --git a/samples/h264SampleFrames/frame-0786.h264 b/samples/h264SampleFrames/frame-0786.h264 index 611b4ef1e0..da9a9c2e49 100644 Binary files a/samples/h264SampleFrames/frame-0786.h264 and b/samples/h264SampleFrames/frame-0786.h264 differ diff --git a/samples/h264SampleFrames/frame-0787.h264 b/samples/h264SampleFrames/frame-0787.h264 index bc13a7dae6..8da1f369c4 100644 Binary files a/samples/h264SampleFrames/frame-0787.h264 and b/samples/h264SampleFrames/frame-0787.h264 differ diff --git a/samples/h264SampleFrames/frame-0788.h264 b/samples/h264SampleFrames/frame-0788.h264 index 83194911e8..2df63be57f 100644 Binary files a/samples/h264SampleFrames/frame-0788.h264 and b/samples/h264SampleFrames/frame-0788.h264 differ diff --git a/samples/h264SampleFrames/frame-0789.h264 b/samples/h264SampleFrames/frame-0789.h264 index 970fc09d89..936915b811 100644 Binary files a/samples/h264SampleFrames/frame-0789.h264 and b/samples/h264SampleFrames/frame-0789.h264 differ diff --git a/samples/h264SampleFrames/frame-0790.h264 b/samples/h264SampleFrames/frame-0790.h264 index 63f941a75e..e581251312 100644 Binary files a/samples/h264SampleFrames/frame-0790.h264 and b/samples/h264SampleFrames/frame-0790.h264 differ diff --git a/samples/h264SampleFrames/frame-0791.h264 b/samples/h264SampleFrames/frame-0791.h264 index d1c5b8025f..19aa513b48 100644 Binary files a/samples/h264SampleFrames/frame-0791.h264 and b/samples/h264SampleFrames/frame-0791.h264 differ diff --git a/samples/h264SampleFrames/frame-0792.h264 b/samples/h264SampleFrames/frame-0792.h264 index d592c9ff12..537bf717e0 100644 Binary files a/samples/h264SampleFrames/frame-0792.h264 and b/samples/h264SampleFrames/frame-0792.h264 differ diff --git a/samples/h264SampleFrames/frame-0793.h264 b/samples/h264SampleFrames/frame-0793.h264 index 601bf824e7..dd20cb6c76 100644 Binary files a/samples/h264SampleFrames/frame-0793.h264 and b/samples/h264SampleFrames/frame-0793.h264 differ diff --git a/samples/h264SampleFrames/frame-0794.h264 b/samples/h264SampleFrames/frame-0794.h264 index 57b83edaad..e4c29c1986 100644 Binary files a/samples/h264SampleFrames/frame-0794.h264 and b/samples/h264SampleFrames/frame-0794.h264 differ diff --git a/samples/h264SampleFrames/frame-0795.h264 b/samples/h264SampleFrames/frame-0795.h264 index 1e3ba6ae35..b6c92a1888 100644 Binary files a/samples/h264SampleFrames/frame-0795.h264 and b/samples/h264SampleFrames/frame-0795.h264 differ diff --git a/samples/h264SampleFrames/frame-0796.h264 b/samples/h264SampleFrames/frame-0796.h264 index 50c1af36e4..585f48f9c4 100644 Binary files a/samples/h264SampleFrames/frame-0796.h264 and b/samples/h264SampleFrames/frame-0796.h264 differ diff --git a/samples/h264SampleFrames/frame-0797.h264 b/samples/h264SampleFrames/frame-0797.h264 index 7851c78722..9e6eefaf11 100644 Binary files a/samples/h264SampleFrames/frame-0797.h264 and b/samples/h264SampleFrames/frame-0797.h264 differ diff --git a/samples/h264SampleFrames/frame-0798.h264 b/samples/h264SampleFrames/frame-0798.h264 index 0abaa90dfe..226b2b7987 100644 Binary files a/samples/h264SampleFrames/frame-0798.h264 and b/samples/h264SampleFrames/frame-0798.h264 differ diff --git a/samples/h264SampleFrames/frame-0799.h264 b/samples/h264SampleFrames/frame-0799.h264 index aadc8a5d50..0011538358 100644 Binary files a/samples/h264SampleFrames/frame-0799.h264 and b/samples/h264SampleFrames/frame-0799.h264 differ diff --git a/samples/h264SampleFrames/frame-0800.h264 b/samples/h264SampleFrames/frame-0800.h264 index b1983d7a67..e80f7dee0b 100644 Binary files a/samples/h264SampleFrames/frame-0800.h264 and b/samples/h264SampleFrames/frame-0800.h264 differ diff --git a/samples/h264SampleFrames/frame-0801.h264 b/samples/h264SampleFrames/frame-0801.h264 index b9c4f54a46..3e78b88f35 100644 Binary files a/samples/h264SampleFrames/frame-0801.h264 and b/samples/h264SampleFrames/frame-0801.h264 differ diff --git a/samples/h264SampleFrames/frame-0802.h264 b/samples/h264SampleFrames/frame-0802.h264 index a318bfc8c7..9282b569b3 100644 Binary files a/samples/h264SampleFrames/frame-0802.h264 and b/samples/h264SampleFrames/frame-0802.h264 differ diff --git a/samples/h264SampleFrames/frame-0803.h264 b/samples/h264SampleFrames/frame-0803.h264 index da78713130..19ceb0420a 100644 Binary files a/samples/h264SampleFrames/frame-0803.h264 and b/samples/h264SampleFrames/frame-0803.h264 differ diff --git a/samples/h264SampleFrames/frame-0804.h264 b/samples/h264SampleFrames/frame-0804.h264 index 32ff649b40..1ba15edce2 100644 Binary files a/samples/h264SampleFrames/frame-0804.h264 and b/samples/h264SampleFrames/frame-0804.h264 differ diff --git a/samples/h264SampleFrames/frame-0805.h264 b/samples/h264SampleFrames/frame-0805.h264 index cdbad849b9..4504639394 100644 Binary files a/samples/h264SampleFrames/frame-0805.h264 and b/samples/h264SampleFrames/frame-0805.h264 differ diff --git a/samples/h264SampleFrames/frame-0806.h264 b/samples/h264SampleFrames/frame-0806.h264 index 73b0bd6aef..701fa2b647 100644 Binary files a/samples/h264SampleFrames/frame-0806.h264 and b/samples/h264SampleFrames/frame-0806.h264 differ diff --git a/samples/h264SampleFrames/frame-0807.h264 b/samples/h264SampleFrames/frame-0807.h264 index e2b8dff844..97e001b53d 100644 Binary files a/samples/h264SampleFrames/frame-0807.h264 and b/samples/h264SampleFrames/frame-0807.h264 differ diff --git a/samples/h264SampleFrames/frame-0808.h264 b/samples/h264SampleFrames/frame-0808.h264 index df68e9e142..68b53ddcfc 100644 Binary files a/samples/h264SampleFrames/frame-0808.h264 and b/samples/h264SampleFrames/frame-0808.h264 differ diff --git a/samples/h264SampleFrames/frame-0809.h264 b/samples/h264SampleFrames/frame-0809.h264 index 1b7d484505..7a65e7ce97 100644 Binary files a/samples/h264SampleFrames/frame-0809.h264 and b/samples/h264SampleFrames/frame-0809.h264 differ diff --git a/samples/h264SampleFrames/frame-0810.h264 b/samples/h264SampleFrames/frame-0810.h264 index 5da61de763..9078c84a12 100644 Binary files a/samples/h264SampleFrames/frame-0810.h264 and b/samples/h264SampleFrames/frame-0810.h264 differ diff --git a/samples/h264SampleFrames/frame-0811.h264 b/samples/h264SampleFrames/frame-0811.h264 index 53e3e6cbd5..7d657966dc 100644 Binary files a/samples/h264SampleFrames/frame-0811.h264 and b/samples/h264SampleFrames/frame-0811.h264 differ diff --git a/samples/h264SampleFrames/frame-0812.h264 b/samples/h264SampleFrames/frame-0812.h264 index 9572ace336..73d35ed309 100644 Binary files a/samples/h264SampleFrames/frame-0812.h264 and b/samples/h264SampleFrames/frame-0812.h264 differ diff --git a/samples/h264SampleFrames/frame-0813.h264 b/samples/h264SampleFrames/frame-0813.h264 index 4080c46ae2..0be7b1d92a 100644 Binary files a/samples/h264SampleFrames/frame-0813.h264 and b/samples/h264SampleFrames/frame-0813.h264 differ diff --git a/samples/h264SampleFrames/frame-0814.h264 b/samples/h264SampleFrames/frame-0814.h264 index 3c541a2950..b68640abff 100644 Binary files a/samples/h264SampleFrames/frame-0814.h264 and b/samples/h264SampleFrames/frame-0814.h264 differ diff --git a/samples/h264SampleFrames/frame-0815.h264 b/samples/h264SampleFrames/frame-0815.h264 index 2e0a0bc9ea..cdb8967a13 100644 Binary files a/samples/h264SampleFrames/frame-0815.h264 and b/samples/h264SampleFrames/frame-0815.h264 differ diff --git a/samples/h264SampleFrames/frame-0816.h264 b/samples/h264SampleFrames/frame-0816.h264 index a3aa7a9fd7..53aa0a31b1 100644 Binary files a/samples/h264SampleFrames/frame-0816.h264 and b/samples/h264SampleFrames/frame-0816.h264 differ diff --git a/samples/h264SampleFrames/frame-0817.h264 b/samples/h264SampleFrames/frame-0817.h264 index 9f7fcb6195..d07f30f637 100644 Binary files a/samples/h264SampleFrames/frame-0817.h264 and b/samples/h264SampleFrames/frame-0817.h264 differ diff --git a/samples/h264SampleFrames/frame-0818.h264 b/samples/h264SampleFrames/frame-0818.h264 index 3932c17ecf..69dd9abcd4 100644 Binary files a/samples/h264SampleFrames/frame-0818.h264 and b/samples/h264SampleFrames/frame-0818.h264 differ diff --git a/samples/h264SampleFrames/frame-0819.h264 b/samples/h264SampleFrames/frame-0819.h264 index 1d91adcdda..96f7e8380c 100644 Binary files a/samples/h264SampleFrames/frame-0819.h264 and b/samples/h264SampleFrames/frame-0819.h264 differ diff --git a/samples/h264SampleFrames/frame-0820.h264 b/samples/h264SampleFrames/frame-0820.h264 index c6c184202f..4e784a89da 100644 Binary files a/samples/h264SampleFrames/frame-0820.h264 and b/samples/h264SampleFrames/frame-0820.h264 differ diff --git a/samples/h264SampleFrames/frame-0821.h264 b/samples/h264SampleFrames/frame-0821.h264 index 684e2b4b19..77742fcf0a 100644 Binary files a/samples/h264SampleFrames/frame-0821.h264 and b/samples/h264SampleFrames/frame-0821.h264 differ diff --git a/samples/h264SampleFrames/frame-0822.h264 b/samples/h264SampleFrames/frame-0822.h264 index 7a57222603..6b411e09c3 100644 Binary files a/samples/h264SampleFrames/frame-0822.h264 and b/samples/h264SampleFrames/frame-0822.h264 differ diff --git a/samples/h264SampleFrames/frame-0823.h264 b/samples/h264SampleFrames/frame-0823.h264 index 4e7fd1b13d..f68d38978c 100644 Binary files a/samples/h264SampleFrames/frame-0823.h264 and b/samples/h264SampleFrames/frame-0823.h264 differ diff --git a/samples/h264SampleFrames/frame-0824.h264 b/samples/h264SampleFrames/frame-0824.h264 index 3f54af24c1..7af75af457 100644 Binary files a/samples/h264SampleFrames/frame-0824.h264 and b/samples/h264SampleFrames/frame-0824.h264 differ diff --git a/samples/h264SampleFrames/frame-0825.h264 b/samples/h264SampleFrames/frame-0825.h264 index 6d5bf2bc24..38eb60fc61 100644 Binary files a/samples/h264SampleFrames/frame-0825.h264 and b/samples/h264SampleFrames/frame-0825.h264 differ diff --git a/samples/h264SampleFrames/frame-0826.h264 b/samples/h264SampleFrames/frame-0826.h264 index 9ddd9dbab2..51eead2ab9 100644 Binary files a/samples/h264SampleFrames/frame-0826.h264 and b/samples/h264SampleFrames/frame-0826.h264 differ diff --git a/samples/h264SampleFrames/frame-0827.h264 b/samples/h264SampleFrames/frame-0827.h264 index 45d7fed236..9785f8c1a3 100644 Binary files a/samples/h264SampleFrames/frame-0827.h264 and b/samples/h264SampleFrames/frame-0827.h264 differ diff --git a/samples/h264SampleFrames/frame-0828.h264 b/samples/h264SampleFrames/frame-0828.h264 index 5505858f24..759ce71ab7 100644 Binary files a/samples/h264SampleFrames/frame-0828.h264 and b/samples/h264SampleFrames/frame-0828.h264 differ diff --git a/samples/h264SampleFrames/frame-0829.h264 b/samples/h264SampleFrames/frame-0829.h264 index d51831aed7..8f9509b8a4 100644 Binary files a/samples/h264SampleFrames/frame-0829.h264 and b/samples/h264SampleFrames/frame-0829.h264 differ diff --git a/samples/h264SampleFrames/frame-0830.h264 b/samples/h264SampleFrames/frame-0830.h264 index fce34366d6..09fc2f893e 100644 Binary files a/samples/h264SampleFrames/frame-0830.h264 and b/samples/h264SampleFrames/frame-0830.h264 differ diff --git a/samples/h264SampleFrames/frame-0831.h264 b/samples/h264SampleFrames/frame-0831.h264 index fb0e30a323..6019348a2d 100644 Binary files a/samples/h264SampleFrames/frame-0831.h264 and b/samples/h264SampleFrames/frame-0831.h264 differ diff --git a/samples/h264SampleFrames/frame-0832.h264 b/samples/h264SampleFrames/frame-0832.h264 index df5a07731b..bd11c15294 100644 Binary files a/samples/h264SampleFrames/frame-0832.h264 and b/samples/h264SampleFrames/frame-0832.h264 differ diff --git a/samples/h264SampleFrames/frame-0833.h264 b/samples/h264SampleFrames/frame-0833.h264 index 7064b052e3..7bedec9cd9 100644 Binary files a/samples/h264SampleFrames/frame-0833.h264 and b/samples/h264SampleFrames/frame-0833.h264 differ diff --git a/samples/h264SampleFrames/frame-0834.h264 b/samples/h264SampleFrames/frame-0834.h264 index 430bf8b887..f3e23bb024 100644 Binary files a/samples/h264SampleFrames/frame-0834.h264 and b/samples/h264SampleFrames/frame-0834.h264 differ diff --git a/samples/h264SampleFrames/frame-0835.h264 b/samples/h264SampleFrames/frame-0835.h264 index 72a960b0fe..589b9cc862 100644 Binary files a/samples/h264SampleFrames/frame-0835.h264 and b/samples/h264SampleFrames/frame-0835.h264 differ diff --git a/samples/h264SampleFrames/frame-0836.h264 b/samples/h264SampleFrames/frame-0836.h264 index 412bd81fc7..146b577cee 100644 Binary files a/samples/h264SampleFrames/frame-0836.h264 and b/samples/h264SampleFrames/frame-0836.h264 differ diff --git a/samples/h264SampleFrames/frame-0837.h264 b/samples/h264SampleFrames/frame-0837.h264 index 6b54ecc20f..417df1d4eb 100644 Binary files a/samples/h264SampleFrames/frame-0837.h264 and b/samples/h264SampleFrames/frame-0837.h264 differ diff --git a/samples/h264SampleFrames/frame-0838.h264 b/samples/h264SampleFrames/frame-0838.h264 index bc3aee56d8..718ee1b007 100644 Binary files a/samples/h264SampleFrames/frame-0838.h264 and b/samples/h264SampleFrames/frame-0838.h264 differ diff --git a/samples/h264SampleFrames/frame-0839.h264 b/samples/h264SampleFrames/frame-0839.h264 index 22de80b7fc..0b57cf3b71 100644 Binary files a/samples/h264SampleFrames/frame-0839.h264 and b/samples/h264SampleFrames/frame-0839.h264 differ diff --git a/samples/h264SampleFrames/frame-0840.h264 b/samples/h264SampleFrames/frame-0840.h264 index 2341d3b9ff..0c148f3088 100644 Binary files a/samples/h264SampleFrames/frame-0840.h264 and b/samples/h264SampleFrames/frame-0840.h264 differ diff --git a/samples/h264SampleFrames/frame-0841.h264 b/samples/h264SampleFrames/frame-0841.h264 index acb10aec71..e0d79d3c05 100644 Binary files a/samples/h264SampleFrames/frame-0841.h264 and b/samples/h264SampleFrames/frame-0841.h264 differ diff --git a/samples/h264SampleFrames/frame-0842.h264 b/samples/h264SampleFrames/frame-0842.h264 index 6b232b1296..25fb8ff920 100644 Binary files a/samples/h264SampleFrames/frame-0842.h264 and b/samples/h264SampleFrames/frame-0842.h264 differ diff --git a/samples/h264SampleFrames/frame-0843.h264 b/samples/h264SampleFrames/frame-0843.h264 index 2c4d4bbb0f..3f613231b5 100644 Binary files a/samples/h264SampleFrames/frame-0843.h264 and b/samples/h264SampleFrames/frame-0843.h264 differ diff --git a/samples/h264SampleFrames/frame-0844.h264 b/samples/h264SampleFrames/frame-0844.h264 index ea604832d8..98caf80a01 100644 Binary files a/samples/h264SampleFrames/frame-0844.h264 and b/samples/h264SampleFrames/frame-0844.h264 differ diff --git a/samples/h264SampleFrames/frame-0845.h264 b/samples/h264SampleFrames/frame-0845.h264 index 8b1f84e6e0..5c3edfcfd6 100644 Binary files a/samples/h264SampleFrames/frame-0845.h264 and b/samples/h264SampleFrames/frame-0845.h264 differ diff --git a/samples/h264SampleFrames/frame-0846.h264 b/samples/h264SampleFrames/frame-0846.h264 index 4ee2e1f181..b3bb90ee73 100644 Binary files a/samples/h264SampleFrames/frame-0846.h264 and b/samples/h264SampleFrames/frame-0846.h264 differ diff --git a/samples/h264SampleFrames/frame-0847.h264 b/samples/h264SampleFrames/frame-0847.h264 index e68c8b8d22..0d129ff968 100644 Binary files a/samples/h264SampleFrames/frame-0847.h264 and b/samples/h264SampleFrames/frame-0847.h264 differ diff --git a/samples/h264SampleFrames/frame-0848.h264 b/samples/h264SampleFrames/frame-0848.h264 index 13340e730c..f18cf65e64 100644 Binary files a/samples/h264SampleFrames/frame-0848.h264 and b/samples/h264SampleFrames/frame-0848.h264 differ diff --git a/samples/h264SampleFrames/frame-0849.h264 b/samples/h264SampleFrames/frame-0849.h264 index 9edba5603a..1db566495f 100644 Binary files a/samples/h264SampleFrames/frame-0849.h264 and b/samples/h264SampleFrames/frame-0849.h264 differ diff --git a/samples/h264SampleFrames/frame-0850.h264 b/samples/h264SampleFrames/frame-0850.h264 index e03ff30224..ae61228cf8 100644 Binary files a/samples/h264SampleFrames/frame-0850.h264 and b/samples/h264SampleFrames/frame-0850.h264 differ diff --git a/samples/h264SampleFrames/frame-0851.h264 b/samples/h264SampleFrames/frame-0851.h264 index 3782d14505..c828bc66c1 100644 Binary files a/samples/h264SampleFrames/frame-0851.h264 and b/samples/h264SampleFrames/frame-0851.h264 differ diff --git a/samples/h264SampleFrames/frame-0852.h264 b/samples/h264SampleFrames/frame-0852.h264 index 1809d9186f..7117d5ccae 100644 Binary files a/samples/h264SampleFrames/frame-0852.h264 and b/samples/h264SampleFrames/frame-0852.h264 differ diff --git a/samples/h264SampleFrames/frame-0853.h264 b/samples/h264SampleFrames/frame-0853.h264 index 2254a3d23e..baf0848177 100644 Binary files a/samples/h264SampleFrames/frame-0853.h264 and b/samples/h264SampleFrames/frame-0853.h264 differ diff --git a/samples/h264SampleFrames/frame-0854.h264 b/samples/h264SampleFrames/frame-0854.h264 index d65ff2df3a..5a1e7ece78 100644 Binary files a/samples/h264SampleFrames/frame-0854.h264 and b/samples/h264SampleFrames/frame-0854.h264 differ diff --git a/samples/h264SampleFrames/frame-0855.h264 b/samples/h264SampleFrames/frame-0855.h264 index 3cdc58ec39..35ef34fc7d 100644 Binary files a/samples/h264SampleFrames/frame-0855.h264 and b/samples/h264SampleFrames/frame-0855.h264 differ diff --git a/samples/h264SampleFrames/frame-0856.h264 b/samples/h264SampleFrames/frame-0856.h264 index b1c5ab8365..f10cb0881a 100644 Binary files a/samples/h264SampleFrames/frame-0856.h264 and b/samples/h264SampleFrames/frame-0856.h264 differ diff --git a/samples/h264SampleFrames/frame-0857.h264 b/samples/h264SampleFrames/frame-0857.h264 index 0996c8dfc8..466d7d289e 100644 Binary files a/samples/h264SampleFrames/frame-0857.h264 and b/samples/h264SampleFrames/frame-0857.h264 differ diff --git a/samples/h264SampleFrames/frame-0858.h264 b/samples/h264SampleFrames/frame-0858.h264 index e532c1ab09..a3f0189c81 100644 Binary files a/samples/h264SampleFrames/frame-0858.h264 and b/samples/h264SampleFrames/frame-0858.h264 differ diff --git a/samples/h264SampleFrames/frame-0859.h264 b/samples/h264SampleFrames/frame-0859.h264 index 4b33411bb4..0171f5df96 100644 Binary files a/samples/h264SampleFrames/frame-0859.h264 and b/samples/h264SampleFrames/frame-0859.h264 differ diff --git a/samples/h264SampleFrames/frame-0860.h264 b/samples/h264SampleFrames/frame-0860.h264 index af55f8b7bb..e9c4e96ba9 100644 Binary files a/samples/h264SampleFrames/frame-0860.h264 and b/samples/h264SampleFrames/frame-0860.h264 differ diff --git a/samples/h264SampleFrames/frame-0861.h264 b/samples/h264SampleFrames/frame-0861.h264 index 30b35be64d..1d849cbc4c 100644 Binary files a/samples/h264SampleFrames/frame-0861.h264 and b/samples/h264SampleFrames/frame-0861.h264 differ diff --git a/samples/h264SampleFrames/frame-0862.h264 b/samples/h264SampleFrames/frame-0862.h264 index 7362ba5d83..b363bd97eb 100644 Binary files a/samples/h264SampleFrames/frame-0862.h264 and b/samples/h264SampleFrames/frame-0862.h264 differ diff --git a/samples/h264SampleFrames/frame-0863.h264 b/samples/h264SampleFrames/frame-0863.h264 index 776274b5ef..a935006e30 100644 Binary files a/samples/h264SampleFrames/frame-0863.h264 and b/samples/h264SampleFrames/frame-0863.h264 differ diff --git a/samples/h264SampleFrames/frame-0864.h264 b/samples/h264SampleFrames/frame-0864.h264 index 50129606e3..136dfa21e9 100644 Binary files a/samples/h264SampleFrames/frame-0864.h264 and b/samples/h264SampleFrames/frame-0864.h264 differ diff --git a/samples/h264SampleFrames/frame-0865.h264 b/samples/h264SampleFrames/frame-0865.h264 index d51aba5410..af3826e227 100644 Binary files a/samples/h264SampleFrames/frame-0865.h264 and b/samples/h264SampleFrames/frame-0865.h264 differ diff --git a/samples/h264SampleFrames/frame-0866.h264 b/samples/h264SampleFrames/frame-0866.h264 index 961428214d..15e1cafca7 100644 Binary files a/samples/h264SampleFrames/frame-0866.h264 and b/samples/h264SampleFrames/frame-0866.h264 differ diff --git a/samples/h264SampleFrames/frame-0867.h264 b/samples/h264SampleFrames/frame-0867.h264 index 9c9c2af294..49b96ae036 100644 Binary files a/samples/h264SampleFrames/frame-0867.h264 and b/samples/h264SampleFrames/frame-0867.h264 differ diff --git a/samples/h264SampleFrames/frame-0868.h264 b/samples/h264SampleFrames/frame-0868.h264 index 991914ee83..e09ae0e264 100644 Binary files a/samples/h264SampleFrames/frame-0868.h264 and b/samples/h264SampleFrames/frame-0868.h264 differ diff --git a/samples/h264SampleFrames/frame-0869.h264 b/samples/h264SampleFrames/frame-0869.h264 index 5e819e0715..ae6177e785 100644 Binary files a/samples/h264SampleFrames/frame-0869.h264 and b/samples/h264SampleFrames/frame-0869.h264 differ diff --git a/samples/h264SampleFrames/frame-0870.h264 b/samples/h264SampleFrames/frame-0870.h264 index 19d3eeddf3..80ec887fdf 100644 Binary files a/samples/h264SampleFrames/frame-0870.h264 and b/samples/h264SampleFrames/frame-0870.h264 differ diff --git a/samples/h264SampleFrames/frame-0871.h264 b/samples/h264SampleFrames/frame-0871.h264 index 40d2b22347..790d5a6771 100644 Binary files a/samples/h264SampleFrames/frame-0871.h264 and b/samples/h264SampleFrames/frame-0871.h264 differ diff --git a/samples/h264SampleFrames/frame-0872.h264 b/samples/h264SampleFrames/frame-0872.h264 index 869ed7c5fe..478e3ca7ef 100644 Binary files a/samples/h264SampleFrames/frame-0872.h264 and b/samples/h264SampleFrames/frame-0872.h264 differ diff --git a/samples/h264SampleFrames/frame-0873.h264 b/samples/h264SampleFrames/frame-0873.h264 index d2b206df1c..17051733db 100644 Binary files a/samples/h264SampleFrames/frame-0873.h264 and b/samples/h264SampleFrames/frame-0873.h264 differ diff --git a/samples/h264SampleFrames/frame-0874.h264 b/samples/h264SampleFrames/frame-0874.h264 index aba42f6696..2abe8c7f1f 100644 Binary files a/samples/h264SampleFrames/frame-0874.h264 and b/samples/h264SampleFrames/frame-0874.h264 differ diff --git a/samples/h264SampleFrames/frame-0875.h264 b/samples/h264SampleFrames/frame-0875.h264 index 17632b8cd2..2743e1f926 100644 Binary files a/samples/h264SampleFrames/frame-0875.h264 and b/samples/h264SampleFrames/frame-0875.h264 differ diff --git a/samples/h264SampleFrames/frame-0876.h264 b/samples/h264SampleFrames/frame-0876.h264 index bd856a9169..ee4eee25f8 100644 Binary files a/samples/h264SampleFrames/frame-0876.h264 and b/samples/h264SampleFrames/frame-0876.h264 differ diff --git a/samples/h264SampleFrames/frame-0877.h264 b/samples/h264SampleFrames/frame-0877.h264 index f938f8d350..70b615e1c6 100644 Binary files a/samples/h264SampleFrames/frame-0877.h264 and b/samples/h264SampleFrames/frame-0877.h264 differ diff --git a/samples/h264SampleFrames/frame-0878.h264 b/samples/h264SampleFrames/frame-0878.h264 index bc1cc0cfc0..501042c6b1 100644 Binary files a/samples/h264SampleFrames/frame-0878.h264 and b/samples/h264SampleFrames/frame-0878.h264 differ diff --git a/samples/h264SampleFrames/frame-0879.h264 b/samples/h264SampleFrames/frame-0879.h264 index a419b459aa..6a00a07b30 100644 Binary files a/samples/h264SampleFrames/frame-0879.h264 and b/samples/h264SampleFrames/frame-0879.h264 differ diff --git a/samples/h264SampleFrames/frame-0880.h264 b/samples/h264SampleFrames/frame-0880.h264 index b9126445a8..1acb98246c 100644 Binary files a/samples/h264SampleFrames/frame-0880.h264 and b/samples/h264SampleFrames/frame-0880.h264 differ diff --git a/samples/h264SampleFrames/frame-0881.h264 b/samples/h264SampleFrames/frame-0881.h264 index 7376bc73fb..d1c375b807 100644 Binary files a/samples/h264SampleFrames/frame-0881.h264 and b/samples/h264SampleFrames/frame-0881.h264 differ diff --git a/samples/h264SampleFrames/frame-0882.h264 b/samples/h264SampleFrames/frame-0882.h264 index bbbd004c41..a22cb429d4 100644 Binary files a/samples/h264SampleFrames/frame-0882.h264 and b/samples/h264SampleFrames/frame-0882.h264 differ diff --git a/samples/h264SampleFrames/frame-0883.h264 b/samples/h264SampleFrames/frame-0883.h264 index a25b39d3a1..060a5d9170 100644 Binary files a/samples/h264SampleFrames/frame-0883.h264 and b/samples/h264SampleFrames/frame-0883.h264 differ diff --git a/samples/h264SampleFrames/frame-0884.h264 b/samples/h264SampleFrames/frame-0884.h264 index 1ad91cabd6..6df59a65dd 100644 Binary files a/samples/h264SampleFrames/frame-0884.h264 and b/samples/h264SampleFrames/frame-0884.h264 differ diff --git a/samples/h264SampleFrames/frame-0885.h264 b/samples/h264SampleFrames/frame-0885.h264 index 9a98442c0a..3fa1213e1f 100644 Binary files a/samples/h264SampleFrames/frame-0885.h264 and b/samples/h264SampleFrames/frame-0885.h264 differ diff --git a/samples/h264SampleFrames/frame-0886.h264 b/samples/h264SampleFrames/frame-0886.h264 index 1487804f83..56b0aa6a2c 100644 Binary files a/samples/h264SampleFrames/frame-0886.h264 and b/samples/h264SampleFrames/frame-0886.h264 differ diff --git a/samples/h264SampleFrames/frame-0887.h264 b/samples/h264SampleFrames/frame-0887.h264 index 88ec0d915f..971b569aed 100644 Binary files a/samples/h264SampleFrames/frame-0887.h264 and b/samples/h264SampleFrames/frame-0887.h264 differ diff --git a/samples/h264SampleFrames/frame-0888.h264 b/samples/h264SampleFrames/frame-0888.h264 index 54cc169af1..209e233cb1 100644 Binary files a/samples/h264SampleFrames/frame-0888.h264 and b/samples/h264SampleFrames/frame-0888.h264 differ diff --git a/samples/h264SampleFrames/frame-0889.h264 b/samples/h264SampleFrames/frame-0889.h264 index 9f55336028..1c12538398 100644 Binary files a/samples/h264SampleFrames/frame-0889.h264 and b/samples/h264SampleFrames/frame-0889.h264 differ diff --git a/samples/h264SampleFrames/frame-0890.h264 b/samples/h264SampleFrames/frame-0890.h264 index a99929c05e..b1ba22b51f 100644 Binary files a/samples/h264SampleFrames/frame-0890.h264 and b/samples/h264SampleFrames/frame-0890.h264 differ diff --git a/samples/h264SampleFrames/frame-0891.h264 b/samples/h264SampleFrames/frame-0891.h264 index c1954d1e3a..aa7fe580ab 100644 Binary files a/samples/h264SampleFrames/frame-0891.h264 and b/samples/h264SampleFrames/frame-0891.h264 differ diff --git a/samples/h264SampleFrames/frame-0892.h264 b/samples/h264SampleFrames/frame-0892.h264 index 52e88f72b5..9617126c0e 100644 Binary files a/samples/h264SampleFrames/frame-0892.h264 and b/samples/h264SampleFrames/frame-0892.h264 differ diff --git a/samples/h264SampleFrames/frame-0893.h264 b/samples/h264SampleFrames/frame-0893.h264 index bbb847dbc4..6d71088fbe 100644 Binary files a/samples/h264SampleFrames/frame-0893.h264 and b/samples/h264SampleFrames/frame-0893.h264 differ diff --git a/samples/h264SampleFrames/frame-0894.h264 b/samples/h264SampleFrames/frame-0894.h264 index 261760e748..6bd1d2259b 100644 Binary files a/samples/h264SampleFrames/frame-0894.h264 and b/samples/h264SampleFrames/frame-0894.h264 differ diff --git a/samples/h264SampleFrames/frame-0895.h264 b/samples/h264SampleFrames/frame-0895.h264 index 48830d4d35..e217fbb8c6 100644 Binary files a/samples/h264SampleFrames/frame-0895.h264 and b/samples/h264SampleFrames/frame-0895.h264 differ diff --git a/samples/h264SampleFrames/frame-0896.h264 b/samples/h264SampleFrames/frame-0896.h264 index bb1513edbb..7b175e1bba 100644 Binary files a/samples/h264SampleFrames/frame-0896.h264 and b/samples/h264SampleFrames/frame-0896.h264 differ diff --git a/samples/h264SampleFrames/frame-0897.h264 b/samples/h264SampleFrames/frame-0897.h264 index adf31612e5..0128225171 100644 Binary files a/samples/h264SampleFrames/frame-0897.h264 and b/samples/h264SampleFrames/frame-0897.h264 differ diff --git a/samples/h264SampleFrames/frame-0898.h264 b/samples/h264SampleFrames/frame-0898.h264 index 10f28c0631..528985359c 100644 Binary files a/samples/h264SampleFrames/frame-0898.h264 and b/samples/h264SampleFrames/frame-0898.h264 differ diff --git a/samples/h264SampleFrames/frame-0899.h264 b/samples/h264SampleFrames/frame-0899.h264 index 487a7d7151..4f84d95d49 100644 Binary files a/samples/h264SampleFrames/frame-0899.h264 and b/samples/h264SampleFrames/frame-0899.h264 differ diff --git a/samples/h264SampleFrames/frame-0900.h264 b/samples/h264SampleFrames/frame-0900.h264 index 64414cadf0..fe05bc44ba 100644 Binary files a/samples/h264SampleFrames/frame-0900.h264 and b/samples/h264SampleFrames/frame-0900.h264 differ diff --git a/samples/h264SampleFrames/frame-0901.h264 b/samples/h264SampleFrames/frame-0901.h264 index 18dee5ac62..0255a3e1e7 100644 Binary files a/samples/h264SampleFrames/frame-0901.h264 and b/samples/h264SampleFrames/frame-0901.h264 differ diff --git a/samples/h264SampleFrames/frame-0902.h264 b/samples/h264SampleFrames/frame-0902.h264 index 27f01f41f9..3000a8b9aa 100644 Binary files a/samples/h264SampleFrames/frame-0902.h264 and b/samples/h264SampleFrames/frame-0902.h264 differ diff --git a/samples/h264SampleFrames/frame-0903.h264 b/samples/h264SampleFrames/frame-0903.h264 index 59c11275dd..177166490a 100644 Binary files a/samples/h264SampleFrames/frame-0903.h264 and b/samples/h264SampleFrames/frame-0903.h264 differ diff --git a/samples/h264SampleFrames/frame-0904.h264 b/samples/h264SampleFrames/frame-0904.h264 index cb6b1e7e42..14a0d993e9 100644 Binary files a/samples/h264SampleFrames/frame-0904.h264 and b/samples/h264SampleFrames/frame-0904.h264 differ diff --git a/samples/h264SampleFrames/frame-0905.h264 b/samples/h264SampleFrames/frame-0905.h264 index 92bb0b4a01..f40f766d7e 100644 Binary files a/samples/h264SampleFrames/frame-0905.h264 and b/samples/h264SampleFrames/frame-0905.h264 differ diff --git a/samples/h264SampleFrames/frame-0906.h264 b/samples/h264SampleFrames/frame-0906.h264 index 82f0a08008..9261adc49d 100644 Binary files a/samples/h264SampleFrames/frame-0906.h264 and b/samples/h264SampleFrames/frame-0906.h264 differ diff --git a/samples/h264SampleFrames/frame-0907.h264 b/samples/h264SampleFrames/frame-0907.h264 index af646bdd37..6b66bac65f 100644 Binary files a/samples/h264SampleFrames/frame-0907.h264 and b/samples/h264SampleFrames/frame-0907.h264 differ diff --git a/samples/h264SampleFrames/frame-0908.h264 b/samples/h264SampleFrames/frame-0908.h264 index af2233378c..fbd6c1982a 100644 Binary files a/samples/h264SampleFrames/frame-0908.h264 and b/samples/h264SampleFrames/frame-0908.h264 differ diff --git a/samples/h264SampleFrames/frame-0909.h264 b/samples/h264SampleFrames/frame-0909.h264 index e5d8858040..b3f9931c92 100644 Binary files a/samples/h264SampleFrames/frame-0909.h264 and b/samples/h264SampleFrames/frame-0909.h264 differ diff --git a/samples/h264SampleFrames/frame-0910.h264 b/samples/h264SampleFrames/frame-0910.h264 index 0fdedac08f..2671e920b4 100644 Binary files a/samples/h264SampleFrames/frame-0910.h264 and b/samples/h264SampleFrames/frame-0910.h264 differ diff --git a/samples/h264SampleFrames/frame-0911.h264 b/samples/h264SampleFrames/frame-0911.h264 index c22dc08088..98cf6ce4c3 100644 Binary files a/samples/h264SampleFrames/frame-0911.h264 and b/samples/h264SampleFrames/frame-0911.h264 differ diff --git a/samples/h264SampleFrames/frame-0912.h264 b/samples/h264SampleFrames/frame-0912.h264 index c877f8b1af..53cb6d471d 100644 Binary files a/samples/h264SampleFrames/frame-0912.h264 and b/samples/h264SampleFrames/frame-0912.h264 differ diff --git a/samples/h264SampleFrames/frame-0913.h264 b/samples/h264SampleFrames/frame-0913.h264 index e8c3eed5a0..d8aa0f7d40 100644 Binary files a/samples/h264SampleFrames/frame-0913.h264 and b/samples/h264SampleFrames/frame-0913.h264 differ diff --git a/samples/h264SampleFrames/frame-0914.h264 b/samples/h264SampleFrames/frame-0914.h264 index 80ca70b111..690fad4b83 100644 Binary files a/samples/h264SampleFrames/frame-0914.h264 and b/samples/h264SampleFrames/frame-0914.h264 differ diff --git a/samples/h264SampleFrames/frame-0915.h264 b/samples/h264SampleFrames/frame-0915.h264 index 7d9bbb5441..5cdc31becb 100644 Binary files a/samples/h264SampleFrames/frame-0915.h264 and b/samples/h264SampleFrames/frame-0915.h264 differ diff --git a/samples/h264SampleFrames/frame-0916.h264 b/samples/h264SampleFrames/frame-0916.h264 index cf802f95ce..106b91b9f3 100644 Binary files a/samples/h264SampleFrames/frame-0916.h264 and b/samples/h264SampleFrames/frame-0916.h264 differ diff --git a/samples/h264SampleFrames/frame-0917.h264 b/samples/h264SampleFrames/frame-0917.h264 index c746725bf5..3785cdedc5 100644 Binary files a/samples/h264SampleFrames/frame-0917.h264 and b/samples/h264SampleFrames/frame-0917.h264 differ diff --git a/samples/h264SampleFrames/frame-0918.h264 b/samples/h264SampleFrames/frame-0918.h264 index 097c465669..f95c52ad1c 100644 Binary files a/samples/h264SampleFrames/frame-0918.h264 and b/samples/h264SampleFrames/frame-0918.h264 differ diff --git a/samples/h264SampleFrames/frame-0919.h264 b/samples/h264SampleFrames/frame-0919.h264 index ada3524dbb..ba9eed801d 100644 Binary files a/samples/h264SampleFrames/frame-0919.h264 and b/samples/h264SampleFrames/frame-0919.h264 differ diff --git a/samples/h264SampleFrames/frame-0920.h264 b/samples/h264SampleFrames/frame-0920.h264 index a06b5e3711..2f1fb169f6 100644 Binary files a/samples/h264SampleFrames/frame-0920.h264 and b/samples/h264SampleFrames/frame-0920.h264 differ diff --git a/samples/h264SampleFrames/frame-0921.h264 b/samples/h264SampleFrames/frame-0921.h264 index 131407acb1..96870890bc 100644 Binary files a/samples/h264SampleFrames/frame-0921.h264 and b/samples/h264SampleFrames/frame-0921.h264 differ diff --git a/samples/h264SampleFrames/frame-0922.h264 b/samples/h264SampleFrames/frame-0922.h264 index 64cb359922..8ee81ab387 100644 Binary files a/samples/h264SampleFrames/frame-0922.h264 and b/samples/h264SampleFrames/frame-0922.h264 differ diff --git a/samples/h264SampleFrames/frame-0923.h264 b/samples/h264SampleFrames/frame-0923.h264 index b77dc44457..bdaa361ff5 100644 Binary files a/samples/h264SampleFrames/frame-0923.h264 and b/samples/h264SampleFrames/frame-0923.h264 differ diff --git a/samples/h264SampleFrames/frame-0924.h264 b/samples/h264SampleFrames/frame-0924.h264 index 8b76636f41..c7b19a88d0 100644 Binary files a/samples/h264SampleFrames/frame-0924.h264 and b/samples/h264SampleFrames/frame-0924.h264 differ diff --git a/samples/h264SampleFrames/frame-0925.h264 b/samples/h264SampleFrames/frame-0925.h264 index 5230ad0d1d..08c0481fd9 100644 Binary files a/samples/h264SampleFrames/frame-0925.h264 and b/samples/h264SampleFrames/frame-0925.h264 differ diff --git a/samples/h264SampleFrames/frame-0926.h264 b/samples/h264SampleFrames/frame-0926.h264 index 9061ed3282..53d5ccfaf3 100644 Binary files a/samples/h264SampleFrames/frame-0926.h264 and b/samples/h264SampleFrames/frame-0926.h264 differ diff --git a/samples/h264SampleFrames/frame-0927.h264 b/samples/h264SampleFrames/frame-0927.h264 index 9fc928cc75..253f1d5ca0 100644 Binary files a/samples/h264SampleFrames/frame-0927.h264 and b/samples/h264SampleFrames/frame-0927.h264 differ diff --git a/samples/h264SampleFrames/frame-0928.h264 b/samples/h264SampleFrames/frame-0928.h264 index 6aa13e380b..70be18cda5 100644 Binary files a/samples/h264SampleFrames/frame-0928.h264 and b/samples/h264SampleFrames/frame-0928.h264 differ diff --git a/samples/h264SampleFrames/frame-0929.h264 b/samples/h264SampleFrames/frame-0929.h264 index ca2cac8efa..bbefb60ea5 100644 Binary files a/samples/h264SampleFrames/frame-0929.h264 and b/samples/h264SampleFrames/frame-0929.h264 differ diff --git a/samples/h264SampleFrames/frame-0930.h264 b/samples/h264SampleFrames/frame-0930.h264 index 0e2ddd8bca..c172ad5161 100644 Binary files a/samples/h264SampleFrames/frame-0930.h264 and b/samples/h264SampleFrames/frame-0930.h264 differ diff --git a/samples/h264SampleFrames/frame-0931.h264 b/samples/h264SampleFrames/frame-0931.h264 index ea7d30cb12..e739882c7f 100644 Binary files a/samples/h264SampleFrames/frame-0931.h264 and b/samples/h264SampleFrames/frame-0931.h264 differ diff --git a/samples/h264SampleFrames/frame-0932.h264 b/samples/h264SampleFrames/frame-0932.h264 index 1e30e389f8..04478f8cff 100644 Binary files a/samples/h264SampleFrames/frame-0932.h264 and b/samples/h264SampleFrames/frame-0932.h264 differ diff --git a/samples/h264SampleFrames/frame-0933.h264 b/samples/h264SampleFrames/frame-0933.h264 index 8238a96ce4..4fa99827da 100644 Binary files a/samples/h264SampleFrames/frame-0933.h264 and b/samples/h264SampleFrames/frame-0933.h264 differ diff --git a/samples/h264SampleFrames/frame-0934.h264 b/samples/h264SampleFrames/frame-0934.h264 index c0e8f94f21..c58bfd5137 100644 Binary files a/samples/h264SampleFrames/frame-0934.h264 and b/samples/h264SampleFrames/frame-0934.h264 differ diff --git a/samples/h264SampleFrames/frame-0935.h264 b/samples/h264SampleFrames/frame-0935.h264 index ebd15f766b..c63f05e0b3 100644 Binary files a/samples/h264SampleFrames/frame-0935.h264 and b/samples/h264SampleFrames/frame-0935.h264 differ diff --git a/samples/h264SampleFrames/frame-0936.h264 b/samples/h264SampleFrames/frame-0936.h264 index 7c1e518a42..ed97251fdc 100644 Binary files a/samples/h264SampleFrames/frame-0936.h264 and b/samples/h264SampleFrames/frame-0936.h264 differ diff --git a/samples/h264SampleFrames/frame-0937.h264 b/samples/h264SampleFrames/frame-0937.h264 index 3f1cd42174..35fcf07471 100644 Binary files a/samples/h264SampleFrames/frame-0937.h264 and b/samples/h264SampleFrames/frame-0937.h264 differ diff --git a/samples/h264SampleFrames/frame-0938.h264 b/samples/h264SampleFrames/frame-0938.h264 index 33b1bed8c5..d4541b645f 100644 Binary files a/samples/h264SampleFrames/frame-0938.h264 and b/samples/h264SampleFrames/frame-0938.h264 differ diff --git a/samples/h264SampleFrames/frame-0939.h264 b/samples/h264SampleFrames/frame-0939.h264 index 5f7a776645..59c1e0be41 100644 Binary files a/samples/h264SampleFrames/frame-0939.h264 and b/samples/h264SampleFrames/frame-0939.h264 differ diff --git a/samples/h264SampleFrames/frame-0940.h264 b/samples/h264SampleFrames/frame-0940.h264 index 0156fbfe10..91f102cf58 100644 Binary files a/samples/h264SampleFrames/frame-0940.h264 and b/samples/h264SampleFrames/frame-0940.h264 differ diff --git a/samples/h264SampleFrames/frame-0941.h264 b/samples/h264SampleFrames/frame-0941.h264 index 456a7e50c4..36d82ef8cb 100644 Binary files a/samples/h264SampleFrames/frame-0941.h264 and b/samples/h264SampleFrames/frame-0941.h264 differ diff --git a/samples/h264SampleFrames/frame-0942.h264 b/samples/h264SampleFrames/frame-0942.h264 index 31ae9773cd..603710ca0f 100644 Binary files a/samples/h264SampleFrames/frame-0942.h264 and b/samples/h264SampleFrames/frame-0942.h264 differ diff --git a/samples/h264SampleFrames/frame-0943.h264 b/samples/h264SampleFrames/frame-0943.h264 index 8657119f45..5510db2352 100644 Binary files a/samples/h264SampleFrames/frame-0943.h264 and b/samples/h264SampleFrames/frame-0943.h264 differ diff --git a/samples/h264SampleFrames/frame-0944.h264 b/samples/h264SampleFrames/frame-0944.h264 index 4275180890..5917ce77ac 100644 Binary files a/samples/h264SampleFrames/frame-0944.h264 and b/samples/h264SampleFrames/frame-0944.h264 differ diff --git a/samples/h264SampleFrames/frame-0945.h264 b/samples/h264SampleFrames/frame-0945.h264 index 4d4f6ab031..5553866d1d 100644 Binary files a/samples/h264SampleFrames/frame-0945.h264 and b/samples/h264SampleFrames/frame-0945.h264 differ diff --git a/samples/h264SampleFrames/frame-0946.h264 b/samples/h264SampleFrames/frame-0946.h264 index f956b8c970..942bc7710e 100644 Binary files a/samples/h264SampleFrames/frame-0946.h264 and b/samples/h264SampleFrames/frame-0946.h264 differ diff --git a/samples/h264SampleFrames/frame-0947.h264 b/samples/h264SampleFrames/frame-0947.h264 index 4bdb7179a3..d36fbe472f 100644 Binary files a/samples/h264SampleFrames/frame-0947.h264 and b/samples/h264SampleFrames/frame-0947.h264 differ diff --git a/samples/h264SampleFrames/frame-0948.h264 b/samples/h264SampleFrames/frame-0948.h264 index b63484699a..66a2fbc47d 100644 Binary files a/samples/h264SampleFrames/frame-0948.h264 and b/samples/h264SampleFrames/frame-0948.h264 differ diff --git a/samples/h264SampleFrames/frame-0949.h264 b/samples/h264SampleFrames/frame-0949.h264 index 219e18ebca..ecc684e38c 100644 Binary files a/samples/h264SampleFrames/frame-0949.h264 and b/samples/h264SampleFrames/frame-0949.h264 differ diff --git a/samples/h264SampleFrames/frame-0950.h264 b/samples/h264SampleFrames/frame-0950.h264 index b9e1952c29..1e31b16c9b 100644 Binary files a/samples/h264SampleFrames/frame-0950.h264 and b/samples/h264SampleFrames/frame-0950.h264 differ diff --git a/samples/h264SampleFrames/frame-0951.h264 b/samples/h264SampleFrames/frame-0951.h264 index c75d827f95..03792cd102 100644 Binary files a/samples/h264SampleFrames/frame-0951.h264 and b/samples/h264SampleFrames/frame-0951.h264 differ diff --git a/samples/h264SampleFrames/frame-0952.h264 b/samples/h264SampleFrames/frame-0952.h264 index 0b2d27cdb9..1c6b9a56fd 100644 Binary files a/samples/h264SampleFrames/frame-0952.h264 and b/samples/h264SampleFrames/frame-0952.h264 differ diff --git a/samples/h264SampleFrames/frame-0953.h264 b/samples/h264SampleFrames/frame-0953.h264 index ad087f5e1f..d684af0840 100644 Binary files a/samples/h264SampleFrames/frame-0953.h264 and b/samples/h264SampleFrames/frame-0953.h264 differ diff --git a/samples/h264SampleFrames/frame-0954.h264 b/samples/h264SampleFrames/frame-0954.h264 index 00fcf1eb51..b35874715a 100644 Binary files a/samples/h264SampleFrames/frame-0954.h264 and b/samples/h264SampleFrames/frame-0954.h264 differ diff --git a/samples/h264SampleFrames/frame-0955.h264 b/samples/h264SampleFrames/frame-0955.h264 index d41f55888a..cda8ca2297 100644 Binary files a/samples/h264SampleFrames/frame-0955.h264 and b/samples/h264SampleFrames/frame-0955.h264 differ diff --git a/samples/h264SampleFrames/frame-0956.h264 b/samples/h264SampleFrames/frame-0956.h264 index e0302a6aeb..54cd0204a7 100644 Binary files a/samples/h264SampleFrames/frame-0956.h264 and b/samples/h264SampleFrames/frame-0956.h264 differ diff --git a/samples/h264SampleFrames/frame-0957.h264 b/samples/h264SampleFrames/frame-0957.h264 index 5492ce8615..aef011db4d 100644 Binary files a/samples/h264SampleFrames/frame-0957.h264 and b/samples/h264SampleFrames/frame-0957.h264 differ diff --git a/samples/h264SampleFrames/frame-0958.h264 b/samples/h264SampleFrames/frame-0958.h264 index b357a7bc37..c98b22123e 100644 Binary files a/samples/h264SampleFrames/frame-0958.h264 and b/samples/h264SampleFrames/frame-0958.h264 differ diff --git a/samples/h264SampleFrames/frame-0959.h264 b/samples/h264SampleFrames/frame-0959.h264 index 7f60c9a338..a62fc172b1 100644 Binary files a/samples/h264SampleFrames/frame-0959.h264 and b/samples/h264SampleFrames/frame-0959.h264 differ diff --git a/samples/h264SampleFrames/frame-0960.h264 b/samples/h264SampleFrames/frame-0960.h264 index 45c0814943..7fb16d6966 100644 Binary files a/samples/h264SampleFrames/frame-0960.h264 and b/samples/h264SampleFrames/frame-0960.h264 differ diff --git a/samples/h264SampleFrames/frame-0961.h264 b/samples/h264SampleFrames/frame-0961.h264 index 335c33ffc4..5a12bd905e 100644 Binary files a/samples/h264SampleFrames/frame-0961.h264 and b/samples/h264SampleFrames/frame-0961.h264 differ diff --git a/samples/h264SampleFrames/frame-0962.h264 b/samples/h264SampleFrames/frame-0962.h264 index de8883e008..43fdcfc30e 100644 Binary files a/samples/h264SampleFrames/frame-0962.h264 and b/samples/h264SampleFrames/frame-0962.h264 differ diff --git a/samples/h264SampleFrames/frame-0963.h264 b/samples/h264SampleFrames/frame-0963.h264 index 97a40f85b4..f00aa0c6d0 100644 Binary files a/samples/h264SampleFrames/frame-0963.h264 and b/samples/h264SampleFrames/frame-0963.h264 differ diff --git a/samples/h264SampleFrames/frame-0964.h264 b/samples/h264SampleFrames/frame-0964.h264 index cde6011773..a16937a5f4 100644 Binary files a/samples/h264SampleFrames/frame-0964.h264 and b/samples/h264SampleFrames/frame-0964.h264 differ diff --git a/samples/h264SampleFrames/frame-0965.h264 b/samples/h264SampleFrames/frame-0965.h264 index 0990e42e8b..e638c35a15 100644 Binary files a/samples/h264SampleFrames/frame-0965.h264 and b/samples/h264SampleFrames/frame-0965.h264 differ diff --git a/samples/h264SampleFrames/frame-0966.h264 b/samples/h264SampleFrames/frame-0966.h264 index 85875b8d4f..d22f0b9049 100644 Binary files a/samples/h264SampleFrames/frame-0966.h264 and b/samples/h264SampleFrames/frame-0966.h264 differ diff --git a/samples/h264SampleFrames/frame-0967.h264 b/samples/h264SampleFrames/frame-0967.h264 index 10880cf394..1de1a5f68c 100644 Binary files a/samples/h264SampleFrames/frame-0967.h264 and b/samples/h264SampleFrames/frame-0967.h264 differ diff --git a/samples/h264SampleFrames/frame-0968.h264 b/samples/h264SampleFrames/frame-0968.h264 index 66e4425653..c0ef55e89a 100644 Binary files a/samples/h264SampleFrames/frame-0968.h264 and b/samples/h264SampleFrames/frame-0968.h264 differ diff --git a/samples/h264SampleFrames/frame-0969.h264 b/samples/h264SampleFrames/frame-0969.h264 index 15618266d4..d8bf3f9d51 100644 Binary files a/samples/h264SampleFrames/frame-0969.h264 and b/samples/h264SampleFrames/frame-0969.h264 differ diff --git a/samples/h264SampleFrames/frame-0970.h264 b/samples/h264SampleFrames/frame-0970.h264 index d334b6cf2d..0f111e58ba 100644 Binary files a/samples/h264SampleFrames/frame-0970.h264 and b/samples/h264SampleFrames/frame-0970.h264 differ diff --git a/samples/h264SampleFrames/frame-0971.h264 b/samples/h264SampleFrames/frame-0971.h264 index 24d4429358..3942343ac5 100644 Binary files a/samples/h264SampleFrames/frame-0971.h264 and b/samples/h264SampleFrames/frame-0971.h264 differ diff --git a/samples/h264SampleFrames/frame-0972.h264 b/samples/h264SampleFrames/frame-0972.h264 index 613ff68485..5d90a5ef18 100644 Binary files a/samples/h264SampleFrames/frame-0972.h264 and b/samples/h264SampleFrames/frame-0972.h264 differ diff --git a/samples/h264SampleFrames/frame-0973.h264 b/samples/h264SampleFrames/frame-0973.h264 index a7e2472e79..3aef4f8749 100644 Binary files a/samples/h264SampleFrames/frame-0973.h264 and b/samples/h264SampleFrames/frame-0973.h264 differ diff --git a/samples/h264SampleFrames/frame-0974.h264 b/samples/h264SampleFrames/frame-0974.h264 index 98bedb9a9e..8fe70fc0ad 100644 Binary files a/samples/h264SampleFrames/frame-0974.h264 and b/samples/h264SampleFrames/frame-0974.h264 differ diff --git a/samples/h264SampleFrames/frame-0975.h264 b/samples/h264SampleFrames/frame-0975.h264 index 9bb5185b45..3c2144f02a 100644 Binary files a/samples/h264SampleFrames/frame-0975.h264 and b/samples/h264SampleFrames/frame-0975.h264 differ diff --git a/samples/h264SampleFrames/frame-0976.h264 b/samples/h264SampleFrames/frame-0976.h264 index 277e320d39..690cf47482 100644 Binary files a/samples/h264SampleFrames/frame-0976.h264 and b/samples/h264SampleFrames/frame-0976.h264 differ diff --git a/samples/h264SampleFrames/frame-0977.h264 b/samples/h264SampleFrames/frame-0977.h264 index 4f93a82584..e510021c69 100644 Binary files a/samples/h264SampleFrames/frame-0977.h264 and b/samples/h264SampleFrames/frame-0977.h264 differ diff --git a/samples/h264SampleFrames/frame-0978.h264 b/samples/h264SampleFrames/frame-0978.h264 index 2f8b7f5de6..ec54ff35a9 100644 Binary files a/samples/h264SampleFrames/frame-0978.h264 and b/samples/h264SampleFrames/frame-0978.h264 differ diff --git a/samples/h264SampleFrames/frame-0979.h264 b/samples/h264SampleFrames/frame-0979.h264 index baad53cc92..1dbc30203f 100644 Binary files a/samples/h264SampleFrames/frame-0979.h264 and b/samples/h264SampleFrames/frame-0979.h264 differ diff --git a/samples/h264SampleFrames/frame-0980.h264 b/samples/h264SampleFrames/frame-0980.h264 index 54c21d2e6c..630f6cb8b1 100644 Binary files a/samples/h264SampleFrames/frame-0980.h264 and b/samples/h264SampleFrames/frame-0980.h264 differ diff --git a/samples/h264SampleFrames/frame-0981.h264 b/samples/h264SampleFrames/frame-0981.h264 index b85f7056c6..713e39886f 100644 Binary files a/samples/h264SampleFrames/frame-0981.h264 and b/samples/h264SampleFrames/frame-0981.h264 differ diff --git a/samples/h264SampleFrames/frame-0982.h264 b/samples/h264SampleFrames/frame-0982.h264 index 62ab75ab81..7ca903b23e 100644 Binary files a/samples/h264SampleFrames/frame-0982.h264 and b/samples/h264SampleFrames/frame-0982.h264 differ diff --git a/samples/h264SampleFrames/frame-0983.h264 b/samples/h264SampleFrames/frame-0983.h264 index 963b30a74a..940b9d5d47 100644 Binary files a/samples/h264SampleFrames/frame-0983.h264 and b/samples/h264SampleFrames/frame-0983.h264 differ diff --git a/samples/h264SampleFrames/frame-0984.h264 b/samples/h264SampleFrames/frame-0984.h264 index 3eb31ca90e..2f3e74b5d0 100644 Binary files a/samples/h264SampleFrames/frame-0984.h264 and b/samples/h264SampleFrames/frame-0984.h264 differ diff --git a/samples/h264SampleFrames/frame-0985.h264 b/samples/h264SampleFrames/frame-0985.h264 index aabdf762f5..2e60fba1c4 100644 Binary files a/samples/h264SampleFrames/frame-0985.h264 and b/samples/h264SampleFrames/frame-0985.h264 differ diff --git a/samples/h264SampleFrames/frame-0986.h264 b/samples/h264SampleFrames/frame-0986.h264 index 3d2759fed2..fb0846ca9d 100644 Binary files a/samples/h264SampleFrames/frame-0986.h264 and b/samples/h264SampleFrames/frame-0986.h264 differ diff --git a/samples/h264SampleFrames/frame-0987.h264 b/samples/h264SampleFrames/frame-0987.h264 index 848f0607a5..f66ca1fc57 100644 Binary files a/samples/h264SampleFrames/frame-0987.h264 and b/samples/h264SampleFrames/frame-0987.h264 differ diff --git a/samples/h264SampleFrames/frame-0988.h264 b/samples/h264SampleFrames/frame-0988.h264 index ea66925285..f16e1547d8 100644 Binary files a/samples/h264SampleFrames/frame-0988.h264 and b/samples/h264SampleFrames/frame-0988.h264 differ diff --git a/samples/h264SampleFrames/frame-0989.h264 b/samples/h264SampleFrames/frame-0989.h264 index b630952d73..fe2ee02d6e 100644 Binary files a/samples/h264SampleFrames/frame-0989.h264 and b/samples/h264SampleFrames/frame-0989.h264 differ diff --git a/samples/h264SampleFrames/frame-0990.h264 b/samples/h264SampleFrames/frame-0990.h264 index 60489e2a97..37dfe06eb1 100644 Binary files a/samples/h264SampleFrames/frame-0990.h264 and b/samples/h264SampleFrames/frame-0990.h264 differ diff --git a/samples/h264SampleFrames/frame-0991.h264 b/samples/h264SampleFrames/frame-0991.h264 index 8b0cda5c2e..9fdb8b94c4 100644 Binary files a/samples/h264SampleFrames/frame-0991.h264 and b/samples/h264SampleFrames/frame-0991.h264 differ diff --git a/samples/h264SampleFrames/frame-0992.h264 b/samples/h264SampleFrames/frame-0992.h264 index e3dc3cd9c5..ed3624ce65 100644 Binary files a/samples/h264SampleFrames/frame-0992.h264 and b/samples/h264SampleFrames/frame-0992.h264 differ diff --git a/samples/h264SampleFrames/frame-0993.h264 b/samples/h264SampleFrames/frame-0993.h264 index 255273141d..53b5605c48 100644 Binary files a/samples/h264SampleFrames/frame-0993.h264 and b/samples/h264SampleFrames/frame-0993.h264 differ diff --git a/samples/h264SampleFrames/frame-0994.h264 b/samples/h264SampleFrames/frame-0994.h264 index 66fa0a6d6a..7a165323ee 100644 Binary files a/samples/h264SampleFrames/frame-0994.h264 and b/samples/h264SampleFrames/frame-0994.h264 differ diff --git a/samples/h264SampleFrames/frame-0995.h264 b/samples/h264SampleFrames/frame-0995.h264 index ff292e9714..d720fce54b 100644 Binary files a/samples/h264SampleFrames/frame-0995.h264 and b/samples/h264SampleFrames/frame-0995.h264 differ diff --git a/samples/h264SampleFrames/frame-0996.h264 b/samples/h264SampleFrames/frame-0996.h264 index 6b1f2f5962..97eafd5d34 100644 Binary files a/samples/h264SampleFrames/frame-0996.h264 and b/samples/h264SampleFrames/frame-0996.h264 differ diff --git a/samples/h264SampleFrames/frame-0997.h264 b/samples/h264SampleFrames/frame-0997.h264 index fc7f113c84..8df069182a 100644 Binary files a/samples/h264SampleFrames/frame-0997.h264 and b/samples/h264SampleFrames/frame-0997.h264 differ diff --git a/samples/h264SampleFrames/frame-0998.h264 b/samples/h264SampleFrames/frame-0998.h264 index af01e2eb05..6a3d3fe0e9 100644 Binary files a/samples/h264SampleFrames/frame-0998.h264 and b/samples/h264SampleFrames/frame-0998.h264 differ diff --git a/samples/h264SampleFrames/frame-0999.h264 b/samples/h264SampleFrames/frame-0999.h264 index 2f889e7ed3..5324229f19 100644 Binary files a/samples/h264SampleFrames/frame-0999.h264 and b/samples/h264SampleFrames/frame-0999.h264 differ diff --git a/samples/h264SampleFrames/frame-1000.h264 b/samples/h264SampleFrames/frame-1000.h264 index 1e4742ba99..98a22fbaa9 100644 Binary files a/samples/h264SampleFrames/frame-1000.h264 and b/samples/h264SampleFrames/frame-1000.h264 differ diff --git a/samples/h264SampleFrames/frame-1001.h264 b/samples/h264SampleFrames/frame-1001.h264 index 4b8e0ab5aa..ae830f3e84 100644 Binary files a/samples/h264SampleFrames/frame-1001.h264 and b/samples/h264SampleFrames/frame-1001.h264 differ diff --git a/samples/h264SampleFrames/frame-1002.h264 b/samples/h264SampleFrames/frame-1002.h264 index 5707a1275a..600bd6e5be 100644 Binary files a/samples/h264SampleFrames/frame-1002.h264 and b/samples/h264SampleFrames/frame-1002.h264 differ diff --git a/samples/h264SampleFrames/frame-1003.h264 b/samples/h264SampleFrames/frame-1003.h264 index 773385fde1..4548856840 100644 Binary files a/samples/h264SampleFrames/frame-1003.h264 and b/samples/h264SampleFrames/frame-1003.h264 differ diff --git a/samples/h264SampleFrames/frame-1004.h264 b/samples/h264SampleFrames/frame-1004.h264 index 9f304b3593..23a0bff355 100644 Binary files a/samples/h264SampleFrames/frame-1004.h264 and b/samples/h264SampleFrames/frame-1004.h264 differ diff --git a/samples/h264SampleFrames/frame-1005.h264 b/samples/h264SampleFrames/frame-1005.h264 index 994dd54bad..c000675a48 100644 Binary files a/samples/h264SampleFrames/frame-1005.h264 and b/samples/h264SampleFrames/frame-1005.h264 differ diff --git a/samples/h264SampleFrames/frame-1006.h264 b/samples/h264SampleFrames/frame-1006.h264 index 6f68157d49..4f36b8e868 100644 Binary files a/samples/h264SampleFrames/frame-1006.h264 and b/samples/h264SampleFrames/frame-1006.h264 differ diff --git a/samples/h264SampleFrames/frame-1007.h264 b/samples/h264SampleFrames/frame-1007.h264 index f24a227776..102562d8e3 100644 Binary files a/samples/h264SampleFrames/frame-1007.h264 and b/samples/h264SampleFrames/frame-1007.h264 differ diff --git a/samples/h264SampleFrames/frame-1008.h264 b/samples/h264SampleFrames/frame-1008.h264 index 2056e0223d..4976d92d86 100644 Binary files a/samples/h264SampleFrames/frame-1008.h264 and b/samples/h264SampleFrames/frame-1008.h264 differ diff --git a/samples/h264SampleFrames/frame-1009.h264 b/samples/h264SampleFrames/frame-1009.h264 index 7120a64ea5..c97457cb8d 100644 Binary files a/samples/h264SampleFrames/frame-1009.h264 and b/samples/h264SampleFrames/frame-1009.h264 differ diff --git a/samples/h264SampleFrames/frame-1010.h264 b/samples/h264SampleFrames/frame-1010.h264 index e882188a98..cf587214e7 100644 Binary files a/samples/h264SampleFrames/frame-1010.h264 and b/samples/h264SampleFrames/frame-1010.h264 differ diff --git a/samples/h264SampleFrames/frame-1011.h264 b/samples/h264SampleFrames/frame-1011.h264 index 52fd101407..a4445f8be3 100644 Binary files a/samples/h264SampleFrames/frame-1011.h264 and b/samples/h264SampleFrames/frame-1011.h264 differ diff --git a/samples/h264SampleFrames/frame-1012.h264 b/samples/h264SampleFrames/frame-1012.h264 index e80048b4c6..38c616c16b 100644 Binary files a/samples/h264SampleFrames/frame-1012.h264 and b/samples/h264SampleFrames/frame-1012.h264 differ diff --git a/samples/h264SampleFrames/frame-1013.h264 b/samples/h264SampleFrames/frame-1013.h264 index 2f59b70274..90d4a807ce 100644 Binary files a/samples/h264SampleFrames/frame-1013.h264 and b/samples/h264SampleFrames/frame-1013.h264 differ diff --git a/samples/h264SampleFrames/frame-1014.h264 b/samples/h264SampleFrames/frame-1014.h264 index 7dbac860bf..f73a8d8906 100644 Binary files a/samples/h264SampleFrames/frame-1014.h264 and b/samples/h264SampleFrames/frame-1014.h264 differ diff --git a/samples/h264SampleFrames/frame-1015.h264 b/samples/h264SampleFrames/frame-1015.h264 index 477a8a860b..36ab143112 100644 Binary files a/samples/h264SampleFrames/frame-1015.h264 and b/samples/h264SampleFrames/frame-1015.h264 differ diff --git a/samples/h264SampleFrames/frame-1016.h264 b/samples/h264SampleFrames/frame-1016.h264 index 0e3a908ce2..55f822577c 100644 Binary files a/samples/h264SampleFrames/frame-1016.h264 and b/samples/h264SampleFrames/frame-1016.h264 differ diff --git a/samples/h264SampleFrames/frame-1017.h264 b/samples/h264SampleFrames/frame-1017.h264 index bb895a9889..d23e3299b2 100644 Binary files a/samples/h264SampleFrames/frame-1017.h264 and b/samples/h264SampleFrames/frame-1017.h264 differ diff --git a/samples/h264SampleFrames/frame-1018.h264 b/samples/h264SampleFrames/frame-1018.h264 index a4cec77c91..55e874e0eb 100644 Binary files a/samples/h264SampleFrames/frame-1018.h264 and b/samples/h264SampleFrames/frame-1018.h264 differ diff --git a/samples/h264SampleFrames/frame-1019.h264 b/samples/h264SampleFrames/frame-1019.h264 index 623350389d..b665a8e111 100644 Binary files a/samples/h264SampleFrames/frame-1019.h264 and b/samples/h264SampleFrames/frame-1019.h264 differ diff --git a/samples/h264SampleFrames/frame-1020.h264 b/samples/h264SampleFrames/frame-1020.h264 index b2eb36e351..d0669efc85 100644 Binary files a/samples/h264SampleFrames/frame-1020.h264 and b/samples/h264SampleFrames/frame-1020.h264 differ diff --git a/samples/h264SampleFrames/frame-1021.h264 b/samples/h264SampleFrames/frame-1021.h264 index d70ab4011c..ab220613d2 100644 Binary files a/samples/h264SampleFrames/frame-1021.h264 and b/samples/h264SampleFrames/frame-1021.h264 differ diff --git a/samples/h264SampleFrames/frame-1022.h264 b/samples/h264SampleFrames/frame-1022.h264 index 1e53f756ee..352510612c 100644 Binary files a/samples/h264SampleFrames/frame-1022.h264 and b/samples/h264SampleFrames/frame-1022.h264 differ diff --git a/samples/h264SampleFrames/frame-1023.h264 b/samples/h264SampleFrames/frame-1023.h264 index 17ab608d32..83604c3314 100644 Binary files a/samples/h264SampleFrames/frame-1023.h264 and b/samples/h264SampleFrames/frame-1023.h264 differ diff --git a/samples/h264SampleFrames/frame-1024.h264 b/samples/h264SampleFrames/frame-1024.h264 index b1912fd1c7..fb2d0041e7 100644 Binary files a/samples/h264SampleFrames/frame-1024.h264 and b/samples/h264SampleFrames/frame-1024.h264 differ diff --git a/samples/h264SampleFrames/frame-1025.h264 b/samples/h264SampleFrames/frame-1025.h264 index 2d1e1a13a0..2c0d7fdb27 100644 Binary files a/samples/h264SampleFrames/frame-1025.h264 and b/samples/h264SampleFrames/frame-1025.h264 differ diff --git a/samples/h264SampleFrames/frame-1026.h264 b/samples/h264SampleFrames/frame-1026.h264 index 3bf0d230a3..3ce67ee3fa 100644 Binary files a/samples/h264SampleFrames/frame-1026.h264 and b/samples/h264SampleFrames/frame-1026.h264 differ diff --git a/samples/h264SampleFrames/frame-1027.h264 b/samples/h264SampleFrames/frame-1027.h264 index b9817e832b..0e9f82e12e 100644 Binary files a/samples/h264SampleFrames/frame-1027.h264 and b/samples/h264SampleFrames/frame-1027.h264 differ diff --git a/samples/h264SampleFrames/frame-1028.h264 b/samples/h264SampleFrames/frame-1028.h264 index 89398540d2..fe2d98f361 100644 Binary files a/samples/h264SampleFrames/frame-1028.h264 and b/samples/h264SampleFrames/frame-1028.h264 differ diff --git a/samples/h264SampleFrames/frame-1029.h264 b/samples/h264SampleFrames/frame-1029.h264 index 00828d018b..ff6ee8f9dc 100644 Binary files a/samples/h264SampleFrames/frame-1029.h264 and b/samples/h264SampleFrames/frame-1029.h264 differ diff --git a/samples/h264SampleFrames/frame-1030.h264 b/samples/h264SampleFrames/frame-1030.h264 index 86a1941ea0..d68bf70562 100644 Binary files a/samples/h264SampleFrames/frame-1030.h264 and b/samples/h264SampleFrames/frame-1030.h264 differ diff --git a/samples/h264SampleFrames/frame-1031.h264 b/samples/h264SampleFrames/frame-1031.h264 index 9895a7564d..16efcdd45f 100644 Binary files a/samples/h264SampleFrames/frame-1031.h264 and b/samples/h264SampleFrames/frame-1031.h264 differ diff --git a/samples/h264SampleFrames/frame-1032.h264 b/samples/h264SampleFrames/frame-1032.h264 index 7ebee93a7f..bc141b6f1b 100644 Binary files a/samples/h264SampleFrames/frame-1032.h264 and b/samples/h264SampleFrames/frame-1032.h264 differ diff --git a/samples/h264SampleFrames/frame-1033.h264 b/samples/h264SampleFrames/frame-1033.h264 index 951754f003..ec62cb0990 100644 Binary files a/samples/h264SampleFrames/frame-1033.h264 and b/samples/h264SampleFrames/frame-1033.h264 differ diff --git a/samples/h264SampleFrames/frame-1034.h264 b/samples/h264SampleFrames/frame-1034.h264 index 104a6501b7..c2afa3dd69 100644 Binary files a/samples/h264SampleFrames/frame-1034.h264 and b/samples/h264SampleFrames/frame-1034.h264 differ diff --git a/samples/h264SampleFrames/frame-1035.h264 b/samples/h264SampleFrames/frame-1035.h264 index 41146649cc..fd62487fe4 100644 Binary files a/samples/h264SampleFrames/frame-1035.h264 and b/samples/h264SampleFrames/frame-1035.h264 differ diff --git a/samples/h264SampleFrames/frame-1036.h264 b/samples/h264SampleFrames/frame-1036.h264 index cb6248c4f6..909df332a9 100644 Binary files a/samples/h264SampleFrames/frame-1036.h264 and b/samples/h264SampleFrames/frame-1036.h264 differ diff --git a/samples/h264SampleFrames/frame-1037.h264 b/samples/h264SampleFrames/frame-1037.h264 index 975c3fde03..b7ea81f5d1 100644 Binary files a/samples/h264SampleFrames/frame-1037.h264 and b/samples/h264SampleFrames/frame-1037.h264 differ diff --git a/samples/h264SampleFrames/frame-1038.h264 b/samples/h264SampleFrames/frame-1038.h264 index 50669223a1..e11f8e384c 100644 Binary files a/samples/h264SampleFrames/frame-1038.h264 and b/samples/h264SampleFrames/frame-1038.h264 differ diff --git a/samples/h264SampleFrames/frame-1039.h264 b/samples/h264SampleFrames/frame-1039.h264 index 1c28bf507c..7f02532848 100644 Binary files a/samples/h264SampleFrames/frame-1039.h264 and b/samples/h264SampleFrames/frame-1039.h264 differ diff --git a/samples/h264SampleFrames/frame-1040.h264 b/samples/h264SampleFrames/frame-1040.h264 index 161056da79..6495d4472e 100644 Binary files a/samples/h264SampleFrames/frame-1040.h264 and b/samples/h264SampleFrames/frame-1040.h264 differ diff --git a/samples/h264SampleFrames/frame-1041.h264 b/samples/h264SampleFrames/frame-1041.h264 index 91514cf10b..f939416b66 100644 Binary files a/samples/h264SampleFrames/frame-1041.h264 and b/samples/h264SampleFrames/frame-1041.h264 differ diff --git a/samples/h264SampleFrames/frame-1042.h264 b/samples/h264SampleFrames/frame-1042.h264 index 62e9ad6021..40988a0de7 100644 Binary files a/samples/h264SampleFrames/frame-1042.h264 and b/samples/h264SampleFrames/frame-1042.h264 differ diff --git a/samples/h264SampleFrames/frame-1043.h264 b/samples/h264SampleFrames/frame-1043.h264 index c7e4ad2251..dd6d4832bb 100644 Binary files a/samples/h264SampleFrames/frame-1043.h264 and b/samples/h264SampleFrames/frame-1043.h264 differ diff --git a/samples/h264SampleFrames/frame-1044.h264 b/samples/h264SampleFrames/frame-1044.h264 index 0ce50d8624..6b7939f4af 100644 Binary files a/samples/h264SampleFrames/frame-1044.h264 and b/samples/h264SampleFrames/frame-1044.h264 differ diff --git a/samples/h264SampleFrames/frame-1045.h264 b/samples/h264SampleFrames/frame-1045.h264 index 1d6d494457..6a81bff239 100644 Binary files a/samples/h264SampleFrames/frame-1045.h264 and b/samples/h264SampleFrames/frame-1045.h264 differ diff --git a/samples/h264SampleFrames/frame-1046.h264 b/samples/h264SampleFrames/frame-1046.h264 index ffab35c211..37588fb33f 100644 Binary files a/samples/h264SampleFrames/frame-1046.h264 and b/samples/h264SampleFrames/frame-1046.h264 differ diff --git a/samples/h264SampleFrames/frame-1047.h264 b/samples/h264SampleFrames/frame-1047.h264 index 5b305a2c39..f98071b4d1 100644 Binary files a/samples/h264SampleFrames/frame-1047.h264 and b/samples/h264SampleFrames/frame-1047.h264 differ diff --git a/samples/h264SampleFrames/frame-1048.h264 b/samples/h264SampleFrames/frame-1048.h264 index ee33655eaa..5d746b0bd9 100644 Binary files a/samples/h264SampleFrames/frame-1048.h264 and b/samples/h264SampleFrames/frame-1048.h264 differ diff --git a/samples/h264SampleFrames/frame-1049.h264 b/samples/h264SampleFrames/frame-1049.h264 index 813face33d..9d08ae39dc 100644 Binary files a/samples/h264SampleFrames/frame-1049.h264 and b/samples/h264SampleFrames/frame-1049.h264 differ diff --git a/samples/h264SampleFrames/frame-1050.h264 b/samples/h264SampleFrames/frame-1050.h264 index aacef5b573..0320103ca4 100644 Binary files a/samples/h264SampleFrames/frame-1050.h264 and b/samples/h264SampleFrames/frame-1050.h264 differ diff --git a/samples/h264SampleFrames/frame-1051.h264 b/samples/h264SampleFrames/frame-1051.h264 index 1ddfbc7ecc..14a59e146d 100644 Binary files a/samples/h264SampleFrames/frame-1051.h264 and b/samples/h264SampleFrames/frame-1051.h264 differ diff --git a/samples/h264SampleFrames/frame-1052.h264 b/samples/h264SampleFrames/frame-1052.h264 index dfd2b98b86..abbf594b2d 100644 Binary files a/samples/h264SampleFrames/frame-1052.h264 and b/samples/h264SampleFrames/frame-1052.h264 differ diff --git a/samples/h264SampleFrames/frame-1053.h264 b/samples/h264SampleFrames/frame-1053.h264 index a0c70cc2a1..a697328acd 100644 Binary files a/samples/h264SampleFrames/frame-1053.h264 and b/samples/h264SampleFrames/frame-1053.h264 differ diff --git a/samples/h264SampleFrames/frame-1054.h264 b/samples/h264SampleFrames/frame-1054.h264 index 8bcf7cd5c5..f3df6a171a 100644 Binary files a/samples/h264SampleFrames/frame-1054.h264 and b/samples/h264SampleFrames/frame-1054.h264 differ diff --git a/samples/h264SampleFrames/frame-1055.h264 b/samples/h264SampleFrames/frame-1055.h264 index 207ccb0658..2e02118458 100644 Binary files a/samples/h264SampleFrames/frame-1055.h264 and b/samples/h264SampleFrames/frame-1055.h264 differ diff --git a/samples/h264SampleFrames/frame-1056.h264 b/samples/h264SampleFrames/frame-1056.h264 index 93241240ef..5b6c9267d1 100644 Binary files a/samples/h264SampleFrames/frame-1056.h264 and b/samples/h264SampleFrames/frame-1056.h264 differ diff --git a/samples/h264SampleFrames/frame-1057.h264 b/samples/h264SampleFrames/frame-1057.h264 index cf898e1173..3f836695ec 100644 Binary files a/samples/h264SampleFrames/frame-1057.h264 and b/samples/h264SampleFrames/frame-1057.h264 differ diff --git a/samples/h264SampleFrames/frame-1058.h264 b/samples/h264SampleFrames/frame-1058.h264 index b019e42d68..270b121300 100644 Binary files a/samples/h264SampleFrames/frame-1058.h264 and b/samples/h264SampleFrames/frame-1058.h264 differ diff --git a/samples/h264SampleFrames/frame-1059.h264 b/samples/h264SampleFrames/frame-1059.h264 index bf67928233..472dd3a772 100644 Binary files a/samples/h264SampleFrames/frame-1059.h264 and b/samples/h264SampleFrames/frame-1059.h264 differ diff --git a/samples/h264SampleFrames/frame-1060.h264 b/samples/h264SampleFrames/frame-1060.h264 index 2f4a260ffa..ac0910a1fe 100644 Binary files a/samples/h264SampleFrames/frame-1060.h264 and b/samples/h264SampleFrames/frame-1060.h264 differ diff --git a/samples/h264SampleFrames/frame-1061.h264 b/samples/h264SampleFrames/frame-1061.h264 index 6aa571dcc1..1ccb300149 100644 Binary files a/samples/h264SampleFrames/frame-1061.h264 and b/samples/h264SampleFrames/frame-1061.h264 differ diff --git a/samples/h264SampleFrames/frame-1062.h264 b/samples/h264SampleFrames/frame-1062.h264 index 901cbb6f8f..3b29cc8907 100644 Binary files a/samples/h264SampleFrames/frame-1062.h264 and b/samples/h264SampleFrames/frame-1062.h264 differ diff --git a/samples/h264SampleFrames/frame-1063.h264 b/samples/h264SampleFrames/frame-1063.h264 index ae77b444c5..06f2d2e60a 100644 Binary files a/samples/h264SampleFrames/frame-1063.h264 and b/samples/h264SampleFrames/frame-1063.h264 differ diff --git a/samples/h264SampleFrames/frame-1064.h264 b/samples/h264SampleFrames/frame-1064.h264 index 7a634c6d1c..a6e9747243 100644 Binary files a/samples/h264SampleFrames/frame-1064.h264 and b/samples/h264SampleFrames/frame-1064.h264 differ diff --git a/samples/h264SampleFrames/frame-1065.h264 b/samples/h264SampleFrames/frame-1065.h264 index c3170675ee..3c654f9f1a 100644 Binary files a/samples/h264SampleFrames/frame-1065.h264 and b/samples/h264SampleFrames/frame-1065.h264 differ diff --git a/samples/h264SampleFrames/frame-1066.h264 b/samples/h264SampleFrames/frame-1066.h264 index f5ba07fdfc..2f219cfc60 100644 Binary files a/samples/h264SampleFrames/frame-1066.h264 and b/samples/h264SampleFrames/frame-1066.h264 differ diff --git a/samples/h264SampleFrames/frame-1067.h264 b/samples/h264SampleFrames/frame-1067.h264 index 8fbd79a775..43b5f1955f 100644 Binary files a/samples/h264SampleFrames/frame-1067.h264 and b/samples/h264SampleFrames/frame-1067.h264 differ diff --git a/samples/h264SampleFrames/frame-1068.h264 b/samples/h264SampleFrames/frame-1068.h264 index 0e27cfede0..5d8e4aae84 100644 Binary files a/samples/h264SampleFrames/frame-1068.h264 and b/samples/h264SampleFrames/frame-1068.h264 differ diff --git a/samples/h264SampleFrames/frame-1069.h264 b/samples/h264SampleFrames/frame-1069.h264 index 436a8ae14e..c072a53ff7 100644 Binary files a/samples/h264SampleFrames/frame-1069.h264 and b/samples/h264SampleFrames/frame-1069.h264 differ diff --git a/samples/h264SampleFrames/frame-1070.h264 b/samples/h264SampleFrames/frame-1070.h264 index f90a490b4c..fdf7e5c72d 100644 Binary files a/samples/h264SampleFrames/frame-1070.h264 and b/samples/h264SampleFrames/frame-1070.h264 differ diff --git a/samples/h264SampleFrames/frame-1071.h264 b/samples/h264SampleFrames/frame-1071.h264 index efc04af466..0669d1441d 100644 Binary files a/samples/h264SampleFrames/frame-1071.h264 and b/samples/h264SampleFrames/frame-1071.h264 differ diff --git a/samples/h264SampleFrames/frame-1072.h264 b/samples/h264SampleFrames/frame-1072.h264 index a19544d218..93e9cdffb4 100644 Binary files a/samples/h264SampleFrames/frame-1072.h264 and b/samples/h264SampleFrames/frame-1072.h264 differ diff --git a/samples/h264SampleFrames/frame-1073.h264 b/samples/h264SampleFrames/frame-1073.h264 index 9d2cf485f4..3f05aa2ded 100644 Binary files a/samples/h264SampleFrames/frame-1073.h264 and b/samples/h264SampleFrames/frame-1073.h264 differ diff --git a/samples/h264SampleFrames/frame-1074.h264 b/samples/h264SampleFrames/frame-1074.h264 index bb937589c1..8f7436f1ee 100644 Binary files a/samples/h264SampleFrames/frame-1074.h264 and b/samples/h264SampleFrames/frame-1074.h264 differ diff --git a/samples/h264SampleFrames/frame-1075.h264 b/samples/h264SampleFrames/frame-1075.h264 index c93662b608..14ba891b08 100644 Binary files a/samples/h264SampleFrames/frame-1075.h264 and b/samples/h264SampleFrames/frame-1075.h264 differ diff --git a/samples/h264SampleFrames/frame-1076.h264 b/samples/h264SampleFrames/frame-1076.h264 index 986161bc9d..93cbb3f335 100644 Binary files a/samples/h264SampleFrames/frame-1076.h264 and b/samples/h264SampleFrames/frame-1076.h264 differ diff --git a/samples/h264SampleFrames/frame-1077.h264 b/samples/h264SampleFrames/frame-1077.h264 index 8748064c82..c1d1ea9d12 100644 Binary files a/samples/h264SampleFrames/frame-1077.h264 and b/samples/h264SampleFrames/frame-1077.h264 differ diff --git a/samples/h264SampleFrames/frame-1078.h264 b/samples/h264SampleFrames/frame-1078.h264 index 4a47538bc1..489f5bb009 100644 Binary files a/samples/h264SampleFrames/frame-1078.h264 and b/samples/h264SampleFrames/frame-1078.h264 differ diff --git a/samples/h264SampleFrames/frame-1079.h264 b/samples/h264SampleFrames/frame-1079.h264 index b7c1fdb69a..a5b748d1eb 100644 Binary files a/samples/h264SampleFrames/frame-1079.h264 and b/samples/h264SampleFrames/frame-1079.h264 differ diff --git a/samples/h264SampleFrames/frame-1080.h264 b/samples/h264SampleFrames/frame-1080.h264 index e4384e38ec..92c774d9ca 100644 Binary files a/samples/h264SampleFrames/frame-1080.h264 and b/samples/h264SampleFrames/frame-1080.h264 differ diff --git a/samples/h264SampleFrames/frame-1081.h264 b/samples/h264SampleFrames/frame-1081.h264 index f4ce38384f..5c6d9cb53d 100644 Binary files a/samples/h264SampleFrames/frame-1081.h264 and b/samples/h264SampleFrames/frame-1081.h264 differ diff --git a/samples/h264SampleFrames/frame-1082.h264 b/samples/h264SampleFrames/frame-1082.h264 index 106004dd20..c00e8b7eee 100644 Binary files a/samples/h264SampleFrames/frame-1082.h264 and b/samples/h264SampleFrames/frame-1082.h264 differ diff --git a/samples/h264SampleFrames/frame-1083.h264 b/samples/h264SampleFrames/frame-1083.h264 index 2ce221335b..f9122ebbf0 100644 Binary files a/samples/h264SampleFrames/frame-1083.h264 and b/samples/h264SampleFrames/frame-1083.h264 differ diff --git a/samples/h264SampleFrames/frame-1084.h264 b/samples/h264SampleFrames/frame-1084.h264 index 282de36cf6..007a1d09ff 100644 Binary files a/samples/h264SampleFrames/frame-1084.h264 and b/samples/h264SampleFrames/frame-1084.h264 differ diff --git a/samples/h264SampleFrames/frame-1085.h264 b/samples/h264SampleFrames/frame-1085.h264 index 52bb63a152..a7703f6144 100644 Binary files a/samples/h264SampleFrames/frame-1085.h264 and b/samples/h264SampleFrames/frame-1085.h264 differ diff --git a/samples/h264SampleFrames/frame-1086.h264 b/samples/h264SampleFrames/frame-1086.h264 index 8657c7b6d8..e196a18e11 100644 Binary files a/samples/h264SampleFrames/frame-1086.h264 and b/samples/h264SampleFrames/frame-1086.h264 differ diff --git a/samples/h264SampleFrames/frame-1087.h264 b/samples/h264SampleFrames/frame-1087.h264 index 7a7691995c..d2316cf4db 100644 Binary files a/samples/h264SampleFrames/frame-1087.h264 and b/samples/h264SampleFrames/frame-1087.h264 differ diff --git a/samples/h264SampleFrames/frame-1088.h264 b/samples/h264SampleFrames/frame-1088.h264 index b80ff65bec..49401eb047 100644 Binary files a/samples/h264SampleFrames/frame-1088.h264 and b/samples/h264SampleFrames/frame-1088.h264 differ diff --git a/samples/h264SampleFrames/frame-1089.h264 b/samples/h264SampleFrames/frame-1089.h264 index 84bb0156b2..c9faf1f74d 100644 Binary files a/samples/h264SampleFrames/frame-1089.h264 and b/samples/h264SampleFrames/frame-1089.h264 differ diff --git a/samples/h264SampleFrames/frame-1090.h264 b/samples/h264SampleFrames/frame-1090.h264 index 7f12d2f9e6..79e0226993 100644 Binary files a/samples/h264SampleFrames/frame-1090.h264 and b/samples/h264SampleFrames/frame-1090.h264 differ diff --git a/samples/h264SampleFrames/frame-1091.h264 b/samples/h264SampleFrames/frame-1091.h264 index 532ccc26b4..c746d11fb1 100644 Binary files a/samples/h264SampleFrames/frame-1091.h264 and b/samples/h264SampleFrames/frame-1091.h264 differ diff --git a/samples/h264SampleFrames/frame-1092.h264 b/samples/h264SampleFrames/frame-1092.h264 index 6f5b151b8d..51de435b07 100644 Binary files a/samples/h264SampleFrames/frame-1092.h264 and b/samples/h264SampleFrames/frame-1092.h264 differ diff --git a/samples/h264SampleFrames/frame-1093.h264 b/samples/h264SampleFrames/frame-1093.h264 index 1a45ddf33d..a26b0abf1e 100644 Binary files a/samples/h264SampleFrames/frame-1093.h264 and b/samples/h264SampleFrames/frame-1093.h264 differ diff --git a/samples/h264SampleFrames/frame-1094.h264 b/samples/h264SampleFrames/frame-1094.h264 index 94d942dd92..f4084f167d 100644 Binary files a/samples/h264SampleFrames/frame-1094.h264 and b/samples/h264SampleFrames/frame-1094.h264 differ diff --git a/samples/h264SampleFrames/frame-1095.h264 b/samples/h264SampleFrames/frame-1095.h264 index ea46c692ae..bf61928ed9 100644 Binary files a/samples/h264SampleFrames/frame-1095.h264 and b/samples/h264SampleFrames/frame-1095.h264 differ diff --git a/samples/h264SampleFrames/frame-1096.h264 b/samples/h264SampleFrames/frame-1096.h264 index be5ac8f3c8..69ec9efd67 100644 Binary files a/samples/h264SampleFrames/frame-1096.h264 and b/samples/h264SampleFrames/frame-1096.h264 differ diff --git a/samples/h264SampleFrames/frame-1097.h264 b/samples/h264SampleFrames/frame-1097.h264 index 021854ad0e..f5a35c8beb 100644 Binary files a/samples/h264SampleFrames/frame-1097.h264 and b/samples/h264SampleFrames/frame-1097.h264 differ diff --git a/samples/h264SampleFrames/frame-1098.h264 b/samples/h264SampleFrames/frame-1098.h264 index d9f0cd618a..5cc4471ad0 100644 Binary files a/samples/h264SampleFrames/frame-1098.h264 and b/samples/h264SampleFrames/frame-1098.h264 differ diff --git a/samples/h264SampleFrames/frame-1099.h264 b/samples/h264SampleFrames/frame-1099.h264 index 7f67c87300..861b073246 100644 Binary files a/samples/h264SampleFrames/frame-1099.h264 and b/samples/h264SampleFrames/frame-1099.h264 differ diff --git a/samples/h264SampleFrames/frame-1100.h264 b/samples/h264SampleFrames/frame-1100.h264 index 6897f26afd..25070235ba 100644 Binary files a/samples/h264SampleFrames/frame-1100.h264 and b/samples/h264SampleFrames/frame-1100.h264 differ diff --git a/samples/h264SampleFrames/frame-1101.h264 b/samples/h264SampleFrames/frame-1101.h264 index 156367945c..a57882d394 100644 Binary files a/samples/h264SampleFrames/frame-1101.h264 and b/samples/h264SampleFrames/frame-1101.h264 differ diff --git a/samples/h264SampleFrames/frame-1102.h264 b/samples/h264SampleFrames/frame-1102.h264 index 1c620c703a..56d4dd9564 100644 Binary files a/samples/h264SampleFrames/frame-1102.h264 and b/samples/h264SampleFrames/frame-1102.h264 differ diff --git a/samples/h264SampleFrames/frame-1103.h264 b/samples/h264SampleFrames/frame-1103.h264 index d0846ca567..587b8e34ef 100644 Binary files a/samples/h264SampleFrames/frame-1103.h264 and b/samples/h264SampleFrames/frame-1103.h264 differ diff --git a/samples/h264SampleFrames/frame-1104.h264 b/samples/h264SampleFrames/frame-1104.h264 index b783a30076..416b55809b 100644 Binary files a/samples/h264SampleFrames/frame-1104.h264 and b/samples/h264SampleFrames/frame-1104.h264 differ diff --git a/samples/h264SampleFrames/frame-1105.h264 b/samples/h264SampleFrames/frame-1105.h264 index 59d4028d57..5e4bb47d69 100644 Binary files a/samples/h264SampleFrames/frame-1105.h264 and b/samples/h264SampleFrames/frame-1105.h264 differ diff --git a/samples/h264SampleFrames/frame-1106.h264 b/samples/h264SampleFrames/frame-1106.h264 index 7d6493cdb4..35637c9891 100644 Binary files a/samples/h264SampleFrames/frame-1106.h264 and b/samples/h264SampleFrames/frame-1106.h264 differ diff --git a/samples/h264SampleFrames/frame-1107.h264 b/samples/h264SampleFrames/frame-1107.h264 index 9e43f10c14..f191cf4c9f 100644 Binary files a/samples/h264SampleFrames/frame-1107.h264 and b/samples/h264SampleFrames/frame-1107.h264 differ diff --git a/samples/h264SampleFrames/frame-1108.h264 b/samples/h264SampleFrames/frame-1108.h264 index 335e337829..f0111d538c 100644 Binary files a/samples/h264SampleFrames/frame-1108.h264 and b/samples/h264SampleFrames/frame-1108.h264 differ diff --git a/samples/h264SampleFrames/frame-1109.h264 b/samples/h264SampleFrames/frame-1109.h264 index b45fc3c8e2..14cc07bb32 100644 Binary files a/samples/h264SampleFrames/frame-1109.h264 and b/samples/h264SampleFrames/frame-1109.h264 differ diff --git a/samples/h264SampleFrames/frame-1110.h264 b/samples/h264SampleFrames/frame-1110.h264 index fab0a0d0dc..9e6d497709 100644 Binary files a/samples/h264SampleFrames/frame-1110.h264 and b/samples/h264SampleFrames/frame-1110.h264 differ diff --git a/samples/h264SampleFrames/frame-1111.h264 b/samples/h264SampleFrames/frame-1111.h264 index 8e9890ff6d..c8a513edbf 100644 Binary files a/samples/h264SampleFrames/frame-1111.h264 and b/samples/h264SampleFrames/frame-1111.h264 differ diff --git a/samples/h264SampleFrames/frame-1112.h264 b/samples/h264SampleFrames/frame-1112.h264 index f35d80b8c7..71130ccbc2 100644 Binary files a/samples/h264SampleFrames/frame-1112.h264 and b/samples/h264SampleFrames/frame-1112.h264 differ diff --git a/samples/h264SampleFrames/frame-1113.h264 b/samples/h264SampleFrames/frame-1113.h264 index b43e0a3f03..e721b5d4f6 100644 Binary files a/samples/h264SampleFrames/frame-1113.h264 and b/samples/h264SampleFrames/frame-1113.h264 differ diff --git a/samples/h264SampleFrames/frame-1114.h264 b/samples/h264SampleFrames/frame-1114.h264 index ed57f9068e..fe08d7ba9f 100644 Binary files a/samples/h264SampleFrames/frame-1114.h264 and b/samples/h264SampleFrames/frame-1114.h264 differ diff --git a/samples/h264SampleFrames/frame-1115.h264 b/samples/h264SampleFrames/frame-1115.h264 index 5266559845..92e8dc5f1e 100644 Binary files a/samples/h264SampleFrames/frame-1115.h264 and b/samples/h264SampleFrames/frame-1115.h264 differ diff --git a/samples/h264SampleFrames/frame-1116.h264 b/samples/h264SampleFrames/frame-1116.h264 index 1e8b23e082..a0ceefc1c1 100644 Binary files a/samples/h264SampleFrames/frame-1116.h264 and b/samples/h264SampleFrames/frame-1116.h264 differ diff --git a/samples/h264SampleFrames/frame-1117.h264 b/samples/h264SampleFrames/frame-1117.h264 index 524a63a63a..bc45d38e16 100644 Binary files a/samples/h264SampleFrames/frame-1117.h264 and b/samples/h264SampleFrames/frame-1117.h264 differ diff --git a/samples/h264SampleFrames/frame-1118.h264 b/samples/h264SampleFrames/frame-1118.h264 index 25613ca560..c21592110d 100644 Binary files a/samples/h264SampleFrames/frame-1118.h264 and b/samples/h264SampleFrames/frame-1118.h264 differ diff --git a/samples/h264SampleFrames/frame-1119.h264 b/samples/h264SampleFrames/frame-1119.h264 index 61bd9084f5..d3f9d13608 100644 Binary files a/samples/h264SampleFrames/frame-1119.h264 and b/samples/h264SampleFrames/frame-1119.h264 differ diff --git a/samples/h264SampleFrames/frame-1120.h264 b/samples/h264SampleFrames/frame-1120.h264 index 1c04b580fe..8e0a7fc2f2 100644 Binary files a/samples/h264SampleFrames/frame-1120.h264 and b/samples/h264SampleFrames/frame-1120.h264 differ diff --git a/samples/h264SampleFrames/frame-1121.h264 b/samples/h264SampleFrames/frame-1121.h264 index f6cea8cc93..45b3be9868 100644 Binary files a/samples/h264SampleFrames/frame-1121.h264 and b/samples/h264SampleFrames/frame-1121.h264 differ diff --git a/samples/h264SampleFrames/frame-1122.h264 b/samples/h264SampleFrames/frame-1122.h264 index 8d07a5d618..cea0c2606c 100644 Binary files a/samples/h264SampleFrames/frame-1122.h264 and b/samples/h264SampleFrames/frame-1122.h264 differ diff --git a/samples/h264SampleFrames/frame-1123.h264 b/samples/h264SampleFrames/frame-1123.h264 index a6f61b5355..a460e50982 100644 Binary files a/samples/h264SampleFrames/frame-1123.h264 and b/samples/h264SampleFrames/frame-1123.h264 differ diff --git a/samples/h264SampleFrames/frame-1124.h264 b/samples/h264SampleFrames/frame-1124.h264 index 5a811135e0..7b6595bf37 100644 Binary files a/samples/h264SampleFrames/frame-1124.h264 and b/samples/h264SampleFrames/frame-1124.h264 differ diff --git a/samples/h264SampleFrames/frame-1125.h264 b/samples/h264SampleFrames/frame-1125.h264 index 622a80e53a..5d6d79d648 100644 Binary files a/samples/h264SampleFrames/frame-1125.h264 and b/samples/h264SampleFrames/frame-1125.h264 differ diff --git a/samples/h264SampleFrames/frame-1126.h264 b/samples/h264SampleFrames/frame-1126.h264 index 9704e4c1f5..bad5980371 100644 Binary files a/samples/h264SampleFrames/frame-1126.h264 and b/samples/h264SampleFrames/frame-1126.h264 differ diff --git a/samples/h264SampleFrames/frame-1127.h264 b/samples/h264SampleFrames/frame-1127.h264 index cf42af5911..1e2787de41 100644 Binary files a/samples/h264SampleFrames/frame-1127.h264 and b/samples/h264SampleFrames/frame-1127.h264 differ diff --git a/samples/h264SampleFrames/frame-1128.h264 b/samples/h264SampleFrames/frame-1128.h264 index a495eafd36..b8c64c0ec9 100644 Binary files a/samples/h264SampleFrames/frame-1128.h264 and b/samples/h264SampleFrames/frame-1128.h264 differ diff --git a/samples/h264SampleFrames/frame-1129.h264 b/samples/h264SampleFrames/frame-1129.h264 index 26320d3bbb..65ed1b0fef 100644 Binary files a/samples/h264SampleFrames/frame-1129.h264 and b/samples/h264SampleFrames/frame-1129.h264 differ diff --git a/samples/h264SampleFrames/frame-1130.h264 b/samples/h264SampleFrames/frame-1130.h264 index 6060414ac6..bb1a304613 100644 Binary files a/samples/h264SampleFrames/frame-1130.h264 and b/samples/h264SampleFrames/frame-1130.h264 differ diff --git a/samples/h264SampleFrames/frame-1131.h264 b/samples/h264SampleFrames/frame-1131.h264 index c51890db43..4e8464b9e1 100644 Binary files a/samples/h264SampleFrames/frame-1131.h264 and b/samples/h264SampleFrames/frame-1131.h264 differ diff --git a/samples/h264SampleFrames/frame-1132.h264 b/samples/h264SampleFrames/frame-1132.h264 index abd0034bda..626fd1d514 100644 Binary files a/samples/h264SampleFrames/frame-1132.h264 and b/samples/h264SampleFrames/frame-1132.h264 differ diff --git a/samples/h264SampleFrames/frame-1133.h264 b/samples/h264SampleFrames/frame-1133.h264 index 81092e2cf9..48b632eeab 100644 Binary files a/samples/h264SampleFrames/frame-1133.h264 and b/samples/h264SampleFrames/frame-1133.h264 differ diff --git a/samples/h264SampleFrames/frame-1134.h264 b/samples/h264SampleFrames/frame-1134.h264 index 0227ea5de5..21388655eb 100644 Binary files a/samples/h264SampleFrames/frame-1134.h264 and b/samples/h264SampleFrames/frame-1134.h264 differ diff --git a/samples/h264SampleFrames/frame-1135.h264 b/samples/h264SampleFrames/frame-1135.h264 index 1bb69a602c..307b265e6c 100644 Binary files a/samples/h264SampleFrames/frame-1135.h264 and b/samples/h264SampleFrames/frame-1135.h264 differ diff --git a/samples/h264SampleFrames/frame-1136.h264 b/samples/h264SampleFrames/frame-1136.h264 index 16b2e4bff8..6b7dbd171e 100644 Binary files a/samples/h264SampleFrames/frame-1136.h264 and b/samples/h264SampleFrames/frame-1136.h264 differ diff --git a/samples/h264SampleFrames/frame-1137.h264 b/samples/h264SampleFrames/frame-1137.h264 index 72b010388d..244b2909ef 100644 Binary files a/samples/h264SampleFrames/frame-1137.h264 and b/samples/h264SampleFrames/frame-1137.h264 differ diff --git a/samples/h264SampleFrames/frame-1138.h264 b/samples/h264SampleFrames/frame-1138.h264 index 9c70dc26b4..19657b516c 100644 Binary files a/samples/h264SampleFrames/frame-1138.h264 and b/samples/h264SampleFrames/frame-1138.h264 differ diff --git a/samples/h264SampleFrames/frame-1139.h264 b/samples/h264SampleFrames/frame-1139.h264 index f7a9f85ea1..17bf38ab1b 100644 Binary files a/samples/h264SampleFrames/frame-1139.h264 and b/samples/h264SampleFrames/frame-1139.h264 differ diff --git a/samples/h264SampleFrames/frame-1140.h264 b/samples/h264SampleFrames/frame-1140.h264 index 0e3885329a..16bdbb5cb7 100644 Binary files a/samples/h264SampleFrames/frame-1140.h264 and b/samples/h264SampleFrames/frame-1140.h264 differ diff --git a/samples/h264SampleFrames/frame-1141.h264 b/samples/h264SampleFrames/frame-1141.h264 index 3955517b51..c385d333bb 100644 Binary files a/samples/h264SampleFrames/frame-1141.h264 and b/samples/h264SampleFrames/frame-1141.h264 differ diff --git a/samples/h264SampleFrames/frame-1142.h264 b/samples/h264SampleFrames/frame-1142.h264 index 35f7d31136..90d3fef892 100644 Binary files a/samples/h264SampleFrames/frame-1142.h264 and b/samples/h264SampleFrames/frame-1142.h264 differ diff --git a/samples/h264SampleFrames/frame-1143.h264 b/samples/h264SampleFrames/frame-1143.h264 index 5909b0c220..144345d6e3 100644 Binary files a/samples/h264SampleFrames/frame-1143.h264 and b/samples/h264SampleFrames/frame-1143.h264 differ diff --git a/samples/h264SampleFrames/frame-1144.h264 b/samples/h264SampleFrames/frame-1144.h264 index 802aad28e5..4a586b1f36 100644 Binary files a/samples/h264SampleFrames/frame-1144.h264 and b/samples/h264SampleFrames/frame-1144.h264 differ diff --git a/samples/h264SampleFrames/frame-1145.h264 b/samples/h264SampleFrames/frame-1145.h264 index fe03489bd1..b1da8d2d3b 100644 Binary files a/samples/h264SampleFrames/frame-1145.h264 and b/samples/h264SampleFrames/frame-1145.h264 differ diff --git a/samples/h264SampleFrames/frame-1146.h264 b/samples/h264SampleFrames/frame-1146.h264 index 948c88499b..6c03ec9ab8 100644 Binary files a/samples/h264SampleFrames/frame-1146.h264 and b/samples/h264SampleFrames/frame-1146.h264 differ diff --git a/samples/h264SampleFrames/frame-1147.h264 b/samples/h264SampleFrames/frame-1147.h264 index 0a04f5dd9a..cfa632936f 100644 Binary files a/samples/h264SampleFrames/frame-1147.h264 and b/samples/h264SampleFrames/frame-1147.h264 differ diff --git a/samples/h264SampleFrames/frame-1148.h264 b/samples/h264SampleFrames/frame-1148.h264 index 81d1689d32..26513bac01 100644 Binary files a/samples/h264SampleFrames/frame-1148.h264 and b/samples/h264SampleFrames/frame-1148.h264 differ diff --git a/samples/h264SampleFrames/frame-1149.h264 b/samples/h264SampleFrames/frame-1149.h264 index d557d3baae..6b65545df5 100644 Binary files a/samples/h264SampleFrames/frame-1149.h264 and b/samples/h264SampleFrames/frame-1149.h264 differ diff --git a/samples/h264SampleFrames/frame-1150.h264 b/samples/h264SampleFrames/frame-1150.h264 index c37e978812..662d1eccbb 100644 Binary files a/samples/h264SampleFrames/frame-1150.h264 and b/samples/h264SampleFrames/frame-1150.h264 differ diff --git a/samples/h264SampleFrames/frame-1151.h264 b/samples/h264SampleFrames/frame-1151.h264 index 9c860e3a33..a89e009fd3 100644 Binary files a/samples/h264SampleFrames/frame-1151.h264 and b/samples/h264SampleFrames/frame-1151.h264 differ diff --git a/samples/h264SampleFrames/frame-1152.h264 b/samples/h264SampleFrames/frame-1152.h264 index 5a8f1b981d..e947f34ad8 100644 Binary files a/samples/h264SampleFrames/frame-1152.h264 and b/samples/h264SampleFrames/frame-1152.h264 differ diff --git a/samples/h264SampleFrames/frame-1153.h264 b/samples/h264SampleFrames/frame-1153.h264 index 0795f3433e..6a49b791ee 100644 Binary files a/samples/h264SampleFrames/frame-1153.h264 and b/samples/h264SampleFrames/frame-1153.h264 differ diff --git a/samples/h264SampleFrames/frame-1154.h264 b/samples/h264SampleFrames/frame-1154.h264 index 4bc1b8409d..e7f12a5196 100644 Binary files a/samples/h264SampleFrames/frame-1154.h264 and b/samples/h264SampleFrames/frame-1154.h264 differ diff --git a/samples/h264SampleFrames/frame-1155.h264 b/samples/h264SampleFrames/frame-1155.h264 index 2a409aaeb6..b1b248229b 100644 Binary files a/samples/h264SampleFrames/frame-1155.h264 and b/samples/h264SampleFrames/frame-1155.h264 differ diff --git a/samples/h264SampleFrames/frame-1156.h264 b/samples/h264SampleFrames/frame-1156.h264 index bc1e941199..1fbccf6378 100644 Binary files a/samples/h264SampleFrames/frame-1156.h264 and b/samples/h264SampleFrames/frame-1156.h264 differ diff --git a/samples/h264SampleFrames/frame-1157.h264 b/samples/h264SampleFrames/frame-1157.h264 index ce9e4d33eb..0b0906a612 100644 Binary files a/samples/h264SampleFrames/frame-1157.h264 and b/samples/h264SampleFrames/frame-1157.h264 differ diff --git a/samples/h264SampleFrames/frame-1158.h264 b/samples/h264SampleFrames/frame-1158.h264 index 9a81274676..4515519b6c 100644 Binary files a/samples/h264SampleFrames/frame-1158.h264 and b/samples/h264SampleFrames/frame-1158.h264 differ diff --git a/samples/h264SampleFrames/frame-1159.h264 b/samples/h264SampleFrames/frame-1159.h264 index ed8fdb6dfc..6dcdf75b5a 100644 Binary files a/samples/h264SampleFrames/frame-1159.h264 and b/samples/h264SampleFrames/frame-1159.h264 differ diff --git a/samples/h264SampleFrames/frame-1160.h264 b/samples/h264SampleFrames/frame-1160.h264 index 6a70556de1..431b8990c9 100644 Binary files a/samples/h264SampleFrames/frame-1160.h264 and b/samples/h264SampleFrames/frame-1160.h264 differ diff --git a/samples/h264SampleFrames/frame-1161.h264 b/samples/h264SampleFrames/frame-1161.h264 index c075849218..4a2666a6ac 100644 Binary files a/samples/h264SampleFrames/frame-1161.h264 and b/samples/h264SampleFrames/frame-1161.h264 differ diff --git a/samples/h264SampleFrames/frame-1162.h264 b/samples/h264SampleFrames/frame-1162.h264 index 8cd7f827eb..b81865baeb 100644 Binary files a/samples/h264SampleFrames/frame-1162.h264 and b/samples/h264SampleFrames/frame-1162.h264 differ diff --git a/samples/h264SampleFrames/frame-1163.h264 b/samples/h264SampleFrames/frame-1163.h264 index bf700af443..6867af0465 100644 Binary files a/samples/h264SampleFrames/frame-1163.h264 and b/samples/h264SampleFrames/frame-1163.h264 differ diff --git a/samples/h264SampleFrames/frame-1164.h264 b/samples/h264SampleFrames/frame-1164.h264 index 4b2d52e17c..7df8399f94 100644 Binary files a/samples/h264SampleFrames/frame-1164.h264 and b/samples/h264SampleFrames/frame-1164.h264 differ diff --git a/samples/h264SampleFrames/frame-1165.h264 b/samples/h264SampleFrames/frame-1165.h264 index e458faba3c..b938ce875b 100644 Binary files a/samples/h264SampleFrames/frame-1165.h264 and b/samples/h264SampleFrames/frame-1165.h264 differ diff --git a/samples/h264SampleFrames/frame-1166.h264 b/samples/h264SampleFrames/frame-1166.h264 index d9b2331da8..04d3b2bbc9 100644 Binary files a/samples/h264SampleFrames/frame-1166.h264 and b/samples/h264SampleFrames/frame-1166.h264 differ diff --git a/samples/h264SampleFrames/frame-1167.h264 b/samples/h264SampleFrames/frame-1167.h264 index fddc3f5976..f804a7777a 100644 Binary files a/samples/h264SampleFrames/frame-1167.h264 and b/samples/h264SampleFrames/frame-1167.h264 differ diff --git a/samples/h264SampleFrames/frame-1168.h264 b/samples/h264SampleFrames/frame-1168.h264 index 18ae2ae663..b8cc993d7b 100644 Binary files a/samples/h264SampleFrames/frame-1168.h264 and b/samples/h264SampleFrames/frame-1168.h264 differ diff --git a/samples/h264SampleFrames/frame-1169.h264 b/samples/h264SampleFrames/frame-1169.h264 index 46080e4d5f..0c8c2e6f36 100644 Binary files a/samples/h264SampleFrames/frame-1169.h264 and b/samples/h264SampleFrames/frame-1169.h264 differ diff --git a/samples/h264SampleFrames/frame-1170.h264 b/samples/h264SampleFrames/frame-1170.h264 index b68802c3ef..d0a7aaf604 100644 Binary files a/samples/h264SampleFrames/frame-1170.h264 and b/samples/h264SampleFrames/frame-1170.h264 differ diff --git a/samples/h264SampleFrames/frame-1171.h264 b/samples/h264SampleFrames/frame-1171.h264 index ff5f5646e1..986f32ba7c 100644 Binary files a/samples/h264SampleFrames/frame-1171.h264 and b/samples/h264SampleFrames/frame-1171.h264 differ diff --git a/samples/h264SampleFrames/frame-1172.h264 b/samples/h264SampleFrames/frame-1172.h264 index 223e6267d6..ee013d0b08 100644 Binary files a/samples/h264SampleFrames/frame-1172.h264 and b/samples/h264SampleFrames/frame-1172.h264 differ diff --git a/samples/h264SampleFrames/frame-1173.h264 b/samples/h264SampleFrames/frame-1173.h264 index 7224b7b199..bb7f9b30f2 100644 Binary files a/samples/h264SampleFrames/frame-1173.h264 and b/samples/h264SampleFrames/frame-1173.h264 differ diff --git a/samples/h264SampleFrames/frame-1174.h264 b/samples/h264SampleFrames/frame-1174.h264 index 20ef54d9fe..efb56d0489 100644 Binary files a/samples/h264SampleFrames/frame-1174.h264 and b/samples/h264SampleFrames/frame-1174.h264 differ diff --git a/samples/h264SampleFrames/frame-1175.h264 b/samples/h264SampleFrames/frame-1175.h264 index a67a42df92..22b20ad771 100644 Binary files a/samples/h264SampleFrames/frame-1175.h264 and b/samples/h264SampleFrames/frame-1175.h264 differ diff --git a/samples/h264SampleFrames/frame-1176.h264 b/samples/h264SampleFrames/frame-1176.h264 index 88f136ce82..f4492f1f85 100644 Binary files a/samples/h264SampleFrames/frame-1176.h264 and b/samples/h264SampleFrames/frame-1176.h264 differ diff --git a/samples/h264SampleFrames/frame-1177.h264 b/samples/h264SampleFrames/frame-1177.h264 index 315621b014..c501de8be7 100644 Binary files a/samples/h264SampleFrames/frame-1177.h264 and b/samples/h264SampleFrames/frame-1177.h264 differ diff --git a/samples/h264SampleFrames/frame-1178.h264 b/samples/h264SampleFrames/frame-1178.h264 index cb0f951197..b24ac677b4 100644 Binary files a/samples/h264SampleFrames/frame-1178.h264 and b/samples/h264SampleFrames/frame-1178.h264 differ diff --git a/samples/h264SampleFrames/frame-1179.h264 b/samples/h264SampleFrames/frame-1179.h264 index 9a2ece99a1..4beafbf1ac 100644 Binary files a/samples/h264SampleFrames/frame-1179.h264 and b/samples/h264SampleFrames/frame-1179.h264 differ diff --git a/samples/h264SampleFrames/frame-1180.h264 b/samples/h264SampleFrames/frame-1180.h264 index c2a796162f..25376fecac 100644 Binary files a/samples/h264SampleFrames/frame-1180.h264 and b/samples/h264SampleFrames/frame-1180.h264 differ diff --git a/samples/h264SampleFrames/frame-1181.h264 b/samples/h264SampleFrames/frame-1181.h264 index 7af1fd51d5..14dd80966e 100644 Binary files a/samples/h264SampleFrames/frame-1181.h264 and b/samples/h264SampleFrames/frame-1181.h264 differ diff --git a/samples/h264SampleFrames/frame-1182.h264 b/samples/h264SampleFrames/frame-1182.h264 index 86bf467508..ba3b9678a5 100644 Binary files a/samples/h264SampleFrames/frame-1182.h264 and b/samples/h264SampleFrames/frame-1182.h264 differ diff --git a/samples/h264SampleFrames/frame-1183.h264 b/samples/h264SampleFrames/frame-1183.h264 index 007c840fb0..68b8d8eb9f 100644 Binary files a/samples/h264SampleFrames/frame-1183.h264 and b/samples/h264SampleFrames/frame-1183.h264 differ diff --git a/samples/h264SampleFrames/frame-1184.h264 b/samples/h264SampleFrames/frame-1184.h264 index 86e5727fad..222b5dd28e 100644 Binary files a/samples/h264SampleFrames/frame-1184.h264 and b/samples/h264SampleFrames/frame-1184.h264 differ diff --git a/samples/h264SampleFrames/frame-1185.h264 b/samples/h264SampleFrames/frame-1185.h264 index d1bca6aaee..022ca15028 100644 Binary files a/samples/h264SampleFrames/frame-1185.h264 and b/samples/h264SampleFrames/frame-1185.h264 differ diff --git a/samples/h264SampleFrames/frame-1186.h264 b/samples/h264SampleFrames/frame-1186.h264 index daf948ee43..632c7e5026 100644 Binary files a/samples/h264SampleFrames/frame-1186.h264 and b/samples/h264SampleFrames/frame-1186.h264 differ diff --git a/samples/h264SampleFrames/frame-1187.h264 b/samples/h264SampleFrames/frame-1187.h264 index 8e9c5c775b..98ddb18c4a 100644 Binary files a/samples/h264SampleFrames/frame-1187.h264 and b/samples/h264SampleFrames/frame-1187.h264 differ diff --git a/samples/h264SampleFrames/frame-1188.h264 b/samples/h264SampleFrames/frame-1188.h264 index 7dd58e8f93..c257fc5ef6 100644 Binary files a/samples/h264SampleFrames/frame-1188.h264 and b/samples/h264SampleFrames/frame-1188.h264 differ diff --git a/samples/h264SampleFrames/frame-1189.h264 b/samples/h264SampleFrames/frame-1189.h264 index f4621db21b..3003904fa4 100644 Binary files a/samples/h264SampleFrames/frame-1189.h264 and b/samples/h264SampleFrames/frame-1189.h264 differ diff --git a/samples/h264SampleFrames/frame-1190.h264 b/samples/h264SampleFrames/frame-1190.h264 index 04d7ebf91d..0923ff9e0a 100644 Binary files a/samples/h264SampleFrames/frame-1190.h264 and b/samples/h264SampleFrames/frame-1190.h264 differ diff --git a/samples/h264SampleFrames/frame-1191.h264 b/samples/h264SampleFrames/frame-1191.h264 index 13f3ee50c6..c58ed54d47 100644 Binary files a/samples/h264SampleFrames/frame-1191.h264 and b/samples/h264SampleFrames/frame-1191.h264 differ diff --git a/samples/h264SampleFrames/frame-1192.h264 b/samples/h264SampleFrames/frame-1192.h264 index 69c7796d3e..3edea03949 100644 Binary files a/samples/h264SampleFrames/frame-1192.h264 and b/samples/h264SampleFrames/frame-1192.h264 differ diff --git a/samples/h264SampleFrames/frame-1193.h264 b/samples/h264SampleFrames/frame-1193.h264 index 7924abaa6b..5240f5e136 100644 Binary files a/samples/h264SampleFrames/frame-1193.h264 and b/samples/h264SampleFrames/frame-1193.h264 differ diff --git a/samples/h264SampleFrames/frame-1194.h264 b/samples/h264SampleFrames/frame-1194.h264 index a9d3d43673..c471069cab 100644 Binary files a/samples/h264SampleFrames/frame-1194.h264 and b/samples/h264SampleFrames/frame-1194.h264 differ diff --git a/samples/h264SampleFrames/frame-1195.h264 b/samples/h264SampleFrames/frame-1195.h264 index 58bb87a8af..f1cf8cc233 100644 Binary files a/samples/h264SampleFrames/frame-1195.h264 and b/samples/h264SampleFrames/frame-1195.h264 differ diff --git a/samples/h264SampleFrames/frame-1196.h264 b/samples/h264SampleFrames/frame-1196.h264 index b01a41aadc..388fd22164 100644 Binary files a/samples/h264SampleFrames/frame-1196.h264 and b/samples/h264SampleFrames/frame-1196.h264 differ diff --git a/samples/h264SampleFrames/frame-1197.h264 b/samples/h264SampleFrames/frame-1197.h264 index c04fba5d56..0beb27620b 100644 Binary files a/samples/h264SampleFrames/frame-1197.h264 and b/samples/h264SampleFrames/frame-1197.h264 differ diff --git a/samples/h264SampleFrames/frame-1198.h264 b/samples/h264SampleFrames/frame-1198.h264 index ec5d0f031e..3b9e5965b4 100644 Binary files a/samples/h264SampleFrames/frame-1198.h264 and b/samples/h264SampleFrames/frame-1198.h264 differ diff --git a/samples/h264SampleFrames/frame-1199.h264 b/samples/h264SampleFrames/frame-1199.h264 index c290b9cb5f..a7a3c94b93 100644 Binary files a/samples/h264SampleFrames/frame-1199.h264 and b/samples/h264SampleFrames/frame-1199.h264 differ diff --git a/samples/h264SampleFrames/frame-1200.h264 b/samples/h264SampleFrames/frame-1200.h264 index a6c58d047d..8b2d2c2ab7 100644 Binary files a/samples/h264SampleFrames/frame-1200.h264 and b/samples/h264SampleFrames/frame-1200.h264 differ diff --git a/samples/h264SampleFrames/frame-1201.h264 b/samples/h264SampleFrames/frame-1201.h264 index ab647ba3d4..7d34932c77 100644 Binary files a/samples/h264SampleFrames/frame-1201.h264 and b/samples/h264SampleFrames/frame-1201.h264 differ diff --git a/samples/h264SampleFrames/frame-1202.h264 b/samples/h264SampleFrames/frame-1202.h264 index ca63d7b3e9..54db9cbe65 100644 Binary files a/samples/h264SampleFrames/frame-1202.h264 and b/samples/h264SampleFrames/frame-1202.h264 differ diff --git a/samples/h264SampleFrames/frame-1203.h264 b/samples/h264SampleFrames/frame-1203.h264 index bb7584e58d..4cdc59afeb 100644 Binary files a/samples/h264SampleFrames/frame-1203.h264 and b/samples/h264SampleFrames/frame-1203.h264 differ diff --git a/samples/h264SampleFrames/frame-1204.h264 b/samples/h264SampleFrames/frame-1204.h264 index 0d19b2174c..b54742c42d 100644 Binary files a/samples/h264SampleFrames/frame-1204.h264 and b/samples/h264SampleFrames/frame-1204.h264 differ diff --git a/samples/h264SampleFrames/frame-1205.h264 b/samples/h264SampleFrames/frame-1205.h264 index 8be689b6eb..236940492e 100644 Binary files a/samples/h264SampleFrames/frame-1205.h264 and b/samples/h264SampleFrames/frame-1205.h264 differ diff --git a/samples/h264SampleFrames/frame-1206.h264 b/samples/h264SampleFrames/frame-1206.h264 index c7c4449d70..5baa8ea6b1 100644 Binary files a/samples/h264SampleFrames/frame-1206.h264 and b/samples/h264SampleFrames/frame-1206.h264 differ diff --git a/samples/h264SampleFrames/frame-1207.h264 b/samples/h264SampleFrames/frame-1207.h264 index c4da520ce7..1b29d3a11c 100644 Binary files a/samples/h264SampleFrames/frame-1207.h264 and b/samples/h264SampleFrames/frame-1207.h264 differ diff --git a/samples/h264SampleFrames/frame-1208.h264 b/samples/h264SampleFrames/frame-1208.h264 index 16b7fdd156..f3ff49b8ed 100644 Binary files a/samples/h264SampleFrames/frame-1208.h264 and b/samples/h264SampleFrames/frame-1208.h264 differ diff --git a/samples/h264SampleFrames/frame-1209.h264 b/samples/h264SampleFrames/frame-1209.h264 index 18c496515c..79b80fdf0f 100644 Binary files a/samples/h264SampleFrames/frame-1209.h264 and b/samples/h264SampleFrames/frame-1209.h264 differ diff --git a/samples/h264SampleFrames/frame-1210.h264 b/samples/h264SampleFrames/frame-1210.h264 index 347836290e..4806e92f15 100644 Binary files a/samples/h264SampleFrames/frame-1210.h264 and b/samples/h264SampleFrames/frame-1210.h264 differ diff --git a/samples/h264SampleFrames/frame-1211.h264 b/samples/h264SampleFrames/frame-1211.h264 index 3b96b7cef3..c0efb0cc71 100644 Binary files a/samples/h264SampleFrames/frame-1211.h264 and b/samples/h264SampleFrames/frame-1211.h264 differ diff --git a/samples/h264SampleFrames/frame-1212.h264 b/samples/h264SampleFrames/frame-1212.h264 index 4751c1199d..e12900430f 100644 Binary files a/samples/h264SampleFrames/frame-1212.h264 and b/samples/h264SampleFrames/frame-1212.h264 differ diff --git a/samples/h264SampleFrames/frame-1213.h264 b/samples/h264SampleFrames/frame-1213.h264 index d2c9995d03..6cf29b74f8 100644 Binary files a/samples/h264SampleFrames/frame-1213.h264 and b/samples/h264SampleFrames/frame-1213.h264 differ diff --git a/samples/h264SampleFrames/frame-1214.h264 b/samples/h264SampleFrames/frame-1214.h264 index 38d6a611c5..adb5d5d768 100644 Binary files a/samples/h264SampleFrames/frame-1214.h264 and b/samples/h264SampleFrames/frame-1214.h264 differ diff --git a/samples/h264SampleFrames/frame-1215.h264 b/samples/h264SampleFrames/frame-1215.h264 index fb062c022b..e5e3d68d5f 100644 Binary files a/samples/h264SampleFrames/frame-1215.h264 and b/samples/h264SampleFrames/frame-1215.h264 differ diff --git a/samples/h264SampleFrames/frame-1216.h264 b/samples/h264SampleFrames/frame-1216.h264 index 577326c572..bb86b88350 100644 Binary files a/samples/h264SampleFrames/frame-1216.h264 and b/samples/h264SampleFrames/frame-1216.h264 differ diff --git a/samples/h264SampleFrames/frame-1217.h264 b/samples/h264SampleFrames/frame-1217.h264 index 07fc41b6fd..4682463101 100644 Binary files a/samples/h264SampleFrames/frame-1217.h264 and b/samples/h264SampleFrames/frame-1217.h264 differ diff --git a/samples/h264SampleFrames/frame-1218.h264 b/samples/h264SampleFrames/frame-1218.h264 index 8d82ce897b..1fcfc7e86b 100644 Binary files a/samples/h264SampleFrames/frame-1218.h264 and b/samples/h264SampleFrames/frame-1218.h264 differ diff --git a/samples/h264SampleFrames/frame-1219.h264 b/samples/h264SampleFrames/frame-1219.h264 index f53f5a4667..5f8d98cd0d 100644 Binary files a/samples/h264SampleFrames/frame-1219.h264 and b/samples/h264SampleFrames/frame-1219.h264 differ diff --git a/samples/h264SampleFrames/frame-1220.h264 b/samples/h264SampleFrames/frame-1220.h264 index 1fb517c881..df0d0c9659 100644 Binary files a/samples/h264SampleFrames/frame-1220.h264 and b/samples/h264SampleFrames/frame-1220.h264 differ diff --git a/samples/h264SampleFrames/frame-1221.h264 b/samples/h264SampleFrames/frame-1221.h264 index 83fbca4725..42230a9760 100644 Binary files a/samples/h264SampleFrames/frame-1221.h264 and b/samples/h264SampleFrames/frame-1221.h264 differ diff --git a/samples/h264SampleFrames/frame-1222.h264 b/samples/h264SampleFrames/frame-1222.h264 index cf3623b741..a5dfe4dc23 100644 Binary files a/samples/h264SampleFrames/frame-1222.h264 and b/samples/h264SampleFrames/frame-1222.h264 differ diff --git a/samples/h264SampleFrames/frame-1223.h264 b/samples/h264SampleFrames/frame-1223.h264 index c2adb2a17d..e09ed51250 100644 Binary files a/samples/h264SampleFrames/frame-1223.h264 and b/samples/h264SampleFrames/frame-1223.h264 differ diff --git a/samples/h264SampleFrames/frame-1224.h264 b/samples/h264SampleFrames/frame-1224.h264 index f6c951f460..6100b2f3d9 100644 Binary files a/samples/h264SampleFrames/frame-1224.h264 and b/samples/h264SampleFrames/frame-1224.h264 differ diff --git a/samples/h264SampleFrames/frame-1225.h264 b/samples/h264SampleFrames/frame-1225.h264 index e7672d9049..a694d4847b 100644 Binary files a/samples/h264SampleFrames/frame-1225.h264 and b/samples/h264SampleFrames/frame-1225.h264 differ diff --git a/samples/h264SampleFrames/frame-1226.h264 b/samples/h264SampleFrames/frame-1226.h264 index e08988ead4..033357c1c2 100644 Binary files a/samples/h264SampleFrames/frame-1226.h264 and b/samples/h264SampleFrames/frame-1226.h264 differ diff --git a/samples/h264SampleFrames/frame-1227.h264 b/samples/h264SampleFrames/frame-1227.h264 index f4aef86b22..ef5081d940 100644 Binary files a/samples/h264SampleFrames/frame-1227.h264 and b/samples/h264SampleFrames/frame-1227.h264 differ diff --git a/samples/h264SampleFrames/frame-1228.h264 b/samples/h264SampleFrames/frame-1228.h264 index 513198afb5..b33cd832a9 100644 Binary files a/samples/h264SampleFrames/frame-1228.h264 and b/samples/h264SampleFrames/frame-1228.h264 differ diff --git a/samples/h264SampleFrames/frame-1229.h264 b/samples/h264SampleFrames/frame-1229.h264 index 90fdabd677..dc4cae5f29 100644 Binary files a/samples/h264SampleFrames/frame-1229.h264 and b/samples/h264SampleFrames/frame-1229.h264 differ diff --git a/samples/h264SampleFrames/frame-1230.h264 b/samples/h264SampleFrames/frame-1230.h264 index e026752d3a..0862fb5947 100644 Binary files a/samples/h264SampleFrames/frame-1230.h264 and b/samples/h264SampleFrames/frame-1230.h264 differ diff --git a/samples/h264SampleFrames/frame-1231.h264 b/samples/h264SampleFrames/frame-1231.h264 index 6b651c5bd1..5682cfabe2 100644 Binary files a/samples/h264SampleFrames/frame-1231.h264 and b/samples/h264SampleFrames/frame-1231.h264 differ diff --git a/samples/h264SampleFrames/frame-1232.h264 b/samples/h264SampleFrames/frame-1232.h264 index 8ffb7de03f..b24b759040 100644 Binary files a/samples/h264SampleFrames/frame-1232.h264 and b/samples/h264SampleFrames/frame-1232.h264 differ diff --git a/samples/h264SampleFrames/frame-1233.h264 b/samples/h264SampleFrames/frame-1233.h264 index 71b03e2589..a7137e2ebc 100644 Binary files a/samples/h264SampleFrames/frame-1233.h264 and b/samples/h264SampleFrames/frame-1233.h264 differ diff --git a/samples/h264SampleFrames/frame-1234.h264 b/samples/h264SampleFrames/frame-1234.h264 index 9286f905d0..4cef350b92 100644 Binary files a/samples/h264SampleFrames/frame-1234.h264 and b/samples/h264SampleFrames/frame-1234.h264 differ diff --git a/samples/h264SampleFrames/frame-1235.h264 b/samples/h264SampleFrames/frame-1235.h264 index 196780a280..1a14f6a742 100644 Binary files a/samples/h264SampleFrames/frame-1235.h264 and b/samples/h264SampleFrames/frame-1235.h264 differ diff --git a/samples/h264SampleFrames/frame-1236.h264 b/samples/h264SampleFrames/frame-1236.h264 index 6709241003..9eb82f74f0 100644 Binary files a/samples/h264SampleFrames/frame-1236.h264 and b/samples/h264SampleFrames/frame-1236.h264 differ diff --git a/samples/h264SampleFrames/frame-1237.h264 b/samples/h264SampleFrames/frame-1237.h264 index 75370384ab..a919028c60 100644 Binary files a/samples/h264SampleFrames/frame-1237.h264 and b/samples/h264SampleFrames/frame-1237.h264 differ diff --git a/samples/h264SampleFrames/frame-1238.h264 b/samples/h264SampleFrames/frame-1238.h264 index 14642c438d..61682e25df 100644 Binary files a/samples/h264SampleFrames/frame-1238.h264 and b/samples/h264SampleFrames/frame-1238.h264 differ diff --git a/samples/h264SampleFrames/frame-1239.h264 b/samples/h264SampleFrames/frame-1239.h264 index 7960ecc518..b5cb13465a 100644 Binary files a/samples/h264SampleFrames/frame-1239.h264 and b/samples/h264SampleFrames/frame-1239.h264 differ diff --git a/samples/h264SampleFrames/frame-1240.h264 b/samples/h264SampleFrames/frame-1240.h264 index 8e7a491e24..455b7c45b7 100644 Binary files a/samples/h264SampleFrames/frame-1240.h264 and b/samples/h264SampleFrames/frame-1240.h264 differ diff --git a/samples/h264SampleFrames/frame-1241.h264 b/samples/h264SampleFrames/frame-1241.h264 index 900e95af4f..542f136ce2 100644 Binary files a/samples/h264SampleFrames/frame-1241.h264 and b/samples/h264SampleFrames/frame-1241.h264 differ diff --git a/samples/h264SampleFrames/frame-1242.h264 b/samples/h264SampleFrames/frame-1242.h264 index d9714dadd4..ed4a107e9d 100644 Binary files a/samples/h264SampleFrames/frame-1242.h264 and b/samples/h264SampleFrames/frame-1242.h264 differ diff --git a/samples/h264SampleFrames/frame-1243.h264 b/samples/h264SampleFrames/frame-1243.h264 index ad8ce7d6cd..a61b900938 100644 Binary files a/samples/h264SampleFrames/frame-1243.h264 and b/samples/h264SampleFrames/frame-1243.h264 differ diff --git a/samples/h264SampleFrames/frame-1244.h264 b/samples/h264SampleFrames/frame-1244.h264 index 71a87a2497..57f7df868f 100644 Binary files a/samples/h264SampleFrames/frame-1244.h264 and b/samples/h264SampleFrames/frame-1244.h264 differ diff --git a/samples/h264SampleFrames/frame-1245.h264 b/samples/h264SampleFrames/frame-1245.h264 index b67261521b..40eb3353ed 100644 Binary files a/samples/h264SampleFrames/frame-1245.h264 and b/samples/h264SampleFrames/frame-1245.h264 differ diff --git a/samples/h264SampleFrames/frame-1246.h264 b/samples/h264SampleFrames/frame-1246.h264 index 19ef7e8efb..5d2fb54941 100644 Binary files a/samples/h264SampleFrames/frame-1246.h264 and b/samples/h264SampleFrames/frame-1246.h264 differ diff --git a/samples/h264SampleFrames/frame-1247.h264 b/samples/h264SampleFrames/frame-1247.h264 index cfdb07f7de..968ceb36a2 100644 Binary files a/samples/h264SampleFrames/frame-1247.h264 and b/samples/h264SampleFrames/frame-1247.h264 differ diff --git a/samples/h264SampleFrames/frame-1248.h264 b/samples/h264SampleFrames/frame-1248.h264 index 5fc2f0787a..a286dd8e30 100644 Binary files a/samples/h264SampleFrames/frame-1248.h264 and b/samples/h264SampleFrames/frame-1248.h264 differ diff --git a/samples/h264SampleFrames/frame-1249.h264 b/samples/h264SampleFrames/frame-1249.h264 index 86448acb42..64bcc8822d 100644 Binary files a/samples/h264SampleFrames/frame-1249.h264 and b/samples/h264SampleFrames/frame-1249.h264 differ diff --git a/samples/h264SampleFrames/frame-1250.h264 b/samples/h264SampleFrames/frame-1250.h264 index ed771a6233..da95df3936 100644 Binary files a/samples/h264SampleFrames/frame-1250.h264 and b/samples/h264SampleFrames/frame-1250.h264 differ diff --git a/samples/h264SampleFrames/frame-1251.h264 b/samples/h264SampleFrames/frame-1251.h264 index aa619a2501..4b92ffa520 100644 Binary files a/samples/h264SampleFrames/frame-1251.h264 and b/samples/h264SampleFrames/frame-1251.h264 differ diff --git a/samples/h264SampleFrames/frame-1252.h264 b/samples/h264SampleFrames/frame-1252.h264 index 31bbea4e3d..96e066dcca 100644 Binary files a/samples/h264SampleFrames/frame-1252.h264 and b/samples/h264SampleFrames/frame-1252.h264 differ diff --git a/samples/h264SampleFrames/frame-1253.h264 b/samples/h264SampleFrames/frame-1253.h264 index 59c1dc746b..aefbeae0aa 100644 Binary files a/samples/h264SampleFrames/frame-1253.h264 and b/samples/h264SampleFrames/frame-1253.h264 differ diff --git a/samples/h264SampleFrames/frame-1254.h264 b/samples/h264SampleFrames/frame-1254.h264 index 7c091650e3..45be0df67d 100644 Binary files a/samples/h264SampleFrames/frame-1254.h264 and b/samples/h264SampleFrames/frame-1254.h264 differ diff --git a/samples/h264SampleFrames/frame-1255.h264 b/samples/h264SampleFrames/frame-1255.h264 index e674f9501b..621ce70e96 100644 Binary files a/samples/h264SampleFrames/frame-1255.h264 and b/samples/h264SampleFrames/frame-1255.h264 differ diff --git a/samples/h264SampleFrames/frame-1256.h264 b/samples/h264SampleFrames/frame-1256.h264 index e98a2b9167..2b88a10a34 100644 Binary files a/samples/h264SampleFrames/frame-1256.h264 and b/samples/h264SampleFrames/frame-1256.h264 differ diff --git a/samples/h264SampleFrames/frame-1257.h264 b/samples/h264SampleFrames/frame-1257.h264 index 87797e9401..8f5e0f719f 100644 Binary files a/samples/h264SampleFrames/frame-1257.h264 and b/samples/h264SampleFrames/frame-1257.h264 differ diff --git a/samples/h264SampleFrames/frame-1258.h264 b/samples/h264SampleFrames/frame-1258.h264 index 15a8090906..696102b183 100644 Binary files a/samples/h264SampleFrames/frame-1258.h264 and b/samples/h264SampleFrames/frame-1258.h264 differ diff --git a/samples/h264SampleFrames/frame-1259.h264 b/samples/h264SampleFrames/frame-1259.h264 index e6936507fc..c92d77a142 100644 Binary files a/samples/h264SampleFrames/frame-1259.h264 and b/samples/h264SampleFrames/frame-1259.h264 differ diff --git a/samples/h264SampleFrames/frame-1260.h264 b/samples/h264SampleFrames/frame-1260.h264 index 4bcad8443d..95befe9f83 100644 Binary files a/samples/h264SampleFrames/frame-1260.h264 and b/samples/h264SampleFrames/frame-1260.h264 differ diff --git a/samples/h264SampleFrames/frame-1261.h264 b/samples/h264SampleFrames/frame-1261.h264 index 19a6538711..1fef5bfa7a 100644 Binary files a/samples/h264SampleFrames/frame-1261.h264 and b/samples/h264SampleFrames/frame-1261.h264 differ diff --git a/samples/h264SampleFrames/frame-1262.h264 b/samples/h264SampleFrames/frame-1262.h264 index 3f9643fcf1..30b195e24c 100644 Binary files a/samples/h264SampleFrames/frame-1262.h264 and b/samples/h264SampleFrames/frame-1262.h264 differ diff --git a/samples/h264SampleFrames/frame-1263.h264 b/samples/h264SampleFrames/frame-1263.h264 index c33a02b83e..d2f28f3c91 100644 Binary files a/samples/h264SampleFrames/frame-1263.h264 and b/samples/h264SampleFrames/frame-1263.h264 differ diff --git a/samples/h264SampleFrames/frame-1264.h264 b/samples/h264SampleFrames/frame-1264.h264 index 35f7ed8fa1..300187b4dd 100644 Binary files a/samples/h264SampleFrames/frame-1264.h264 and b/samples/h264SampleFrames/frame-1264.h264 differ diff --git a/samples/h264SampleFrames/frame-1265.h264 b/samples/h264SampleFrames/frame-1265.h264 index a5cb5c1d89..ca2811e1b0 100644 Binary files a/samples/h264SampleFrames/frame-1265.h264 and b/samples/h264SampleFrames/frame-1265.h264 differ diff --git a/samples/h264SampleFrames/frame-1266.h264 b/samples/h264SampleFrames/frame-1266.h264 index fca759a774..13d2dc76cb 100644 Binary files a/samples/h264SampleFrames/frame-1266.h264 and b/samples/h264SampleFrames/frame-1266.h264 differ diff --git a/samples/h264SampleFrames/frame-1267.h264 b/samples/h264SampleFrames/frame-1267.h264 index bc81721adf..954f1bf415 100644 Binary files a/samples/h264SampleFrames/frame-1267.h264 and b/samples/h264SampleFrames/frame-1267.h264 differ diff --git a/samples/h264SampleFrames/frame-1268.h264 b/samples/h264SampleFrames/frame-1268.h264 index 0d8edf7f4b..d002015592 100644 Binary files a/samples/h264SampleFrames/frame-1268.h264 and b/samples/h264SampleFrames/frame-1268.h264 differ diff --git a/samples/h264SampleFrames/frame-1269.h264 b/samples/h264SampleFrames/frame-1269.h264 index 4e3edb41a7..9dbdc1492a 100644 Binary files a/samples/h264SampleFrames/frame-1269.h264 and b/samples/h264SampleFrames/frame-1269.h264 differ diff --git a/samples/h264SampleFrames/frame-1270.h264 b/samples/h264SampleFrames/frame-1270.h264 index 5cbc359678..04db1be7ff 100644 Binary files a/samples/h264SampleFrames/frame-1270.h264 and b/samples/h264SampleFrames/frame-1270.h264 differ diff --git a/samples/h264SampleFrames/frame-1271.h264 b/samples/h264SampleFrames/frame-1271.h264 index 3a83da8a32..db387d19fb 100644 Binary files a/samples/h264SampleFrames/frame-1271.h264 and b/samples/h264SampleFrames/frame-1271.h264 differ diff --git a/samples/h264SampleFrames/frame-1272.h264 b/samples/h264SampleFrames/frame-1272.h264 index 746800cf42..1cccda9086 100644 Binary files a/samples/h264SampleFrames/frame-1272.h264 and b/samples/h264SampleFrames/frame-1272.h264 differ diff --git a/samples/h264SampleFrames/frame-1273.h264 b/samples/h264SampleFrames/frame-1273.h264 index a39da1cd33..4fb7bf6879 100644 Binary files a/samples/h264SampleFrames/frame-1273.h264 and b/samples/h264SampleFrames/frame-1273.h264 differ diff --git a/samples/h264SampleFrames/frame-1274.h264 b/samples/h264SampleFrames/frame-1274.h264 index 9f03be9dc9..a95edda286 100644 Binary files a/samples/h264SampleFrames/frame-1274.h264 and b/samples/h264SampleFrames/frame-1274.h264 differ diff --git a/samples/h264SampleFrames/frame-1275.h264 b/samples/h264SampleFrames/frame-1275.h264 index 55310a7ad2..d59ab324c0 100644 Binary files a/samples/h264SampleFrames/frame-1275.h264 and b/samples/h264SampleFrames/frame-1275.h264 differ diff --git a/samples/h264SampleFrames/frame-1276.h264 b/samples/h264SampleFrames/frame-1276.h264 index 2f0e850779..372ef17418 100644 Binary files a/samples/h264SampleFrames/frame-1276.h264 and b/samples/h264SampleFrames/frame-1276.h264 differ diff --git a/samples/h264SampleFrames/frame-1277.h264 b/samples/h264SampleFrames/frame-1277.h264 index a795df6f4d..c0b81b5d37 100644 Binary files a/samples/h264SampleFrames/frame-1277.h264 and b/samples/h264SampleFrames/frame-1277.h264 differ diff --git a/samples/h264SampleFrames/frame-1278.h264 b/samples/h264SampleFrames/frame-1278.h264 index e98314a278..1d2b632360 100644 Binary files a/samples/h264SampleFrames/frame-1278.h264 and b/samples/h264SampleFrames/frame-1278.h264 differ diff --git a/samples/h264SampleFrames/frame-1279.h264 b/samples/h264SampleFrames/frame-1279.h264 index f95f7c2ba7..7d1de6d557 100644 Binary files a/samples/h264SampleFrames/frame-1279.h264 and b/samples/h264SampleFrames/frame-1279.h264 differ diff --git a/samples/h264SampleFrames/frame-1280.h264 b/samples/h264SampleFrames/frame-1280.h264 index e59ce06b36..aa05a137d7 100644 Binary files a/samples/h264SampleFrames/frame-1280.h264 and b/samples/h264SampleFrames/frame-1280.h264 differ diff --git a/samples/h264SampleFrames/frame-1281.h264 b/samples/h264SampleFrames/frame-1281.h264 index 5da883a1ab..3ebc19eade 100644 Binary files a/samples/h264SampleFrames/frame-1281.h264 and b/samples/h264SampleFrames/frame-1281.h264 differ diff --git a/samples/h264SampleFrames/frame-1282.h264 b/samples/h264SampleFrames/frame-1282.h264 index b35e900e38..f543d002a2 100644 Binary files a/samples/h264SampleFrames/frame-1282.h264 and b/samples/h264SampleFrames/frame-1282.h264 differ diff --git a/samples/h264SampleFrames/frame-1283.h264 b/samples/h264SampleFrames/frame-1283.h264 index b8c71d584b..8b059b99a9 100644 Binary files a/samples/h264SampleFrames/frame-1283.h264 and b/samples/h264SampleFrames/frame-1283.h264 differ diff --git a/samples/h264SampleFrames/frame-1284.h264 b/samples/h264SampleFrames/frame-1284.h264 index 2aa7efc44c..ec911fff9d 100644 Binary files a/samples/h264SampleFrames/frame-1284.h264 and b/samples/h264SampleFrames/frame-1284.h264 differ diff --git a/samples/h264SampleFrames/frame-1285.h264 b/samples/h264SampleFrames/frame-1285.h264 index 4417b0f775..0ec23e79ee 100644 Binary files a/samples/h264SampleFrames/frame-1285.h264 and b/samples/h264SampleFrames/frame-1285.h264 differ diff --git a/samples/h264SampleFrames/frame-1286.h264 b/samples/h264SampleFrames/frame-1286.h264 index 4ad5c7cc98..0f20b177fa 100644 Binary files a/samples/h264SampleFrames/frame-1286.h264 and b/samples/h264SampleFrames/frame-1286.h264 differ diff --git a/samples/h264SampleFrames/frame-1287.h264 b/samples/h264SampleFrames/frame-1287.h264 index 26dc69f312..02b49ca875 100644 Binary files a/samples/h264SampleFrames/frame-1287.h264 and b/samples/h264SampleFrames/frame-1287.h264 differ diff --git a/samples/h264SampleFrames/frame-1288.h264 b/samples/h264SampleFrames/frame-1288.h264 index 22050f7758..04ed40292f 100644 Binary files a/samples/h264SampleFrames/frame-1288.h264 and b/samples/h264SampleFrames/frame-1288.h264 differ diff --git a/samples/h264SampleFrames/frame-1289.h264 b/samples/h264SampleFrames/frame-1289.h264 index e8e1cb948c..59bbe24564 100644 Binary files a/samples/h264SampleFrames/frame-1289.h264 and b/samples/h264SampleFrames/frame-1289.h264 differ diff --git a/samples/h264SampleFrames/frame-1290.h264 b/samples/h264SampleFrames/frame-1290.h264 index e67d2deb3e..5e09cb20d5 100644 Binary files a/samples/h264SampleFrames/frame-1290.h264 and b/samples/h264SampleFrames/frame-1290.h264 differ diff --git a/samples/h264SampleFrames/frame-1291.h264 b/samples/h264SampleFrames/frame-1291.h264 index b2034486e9..7ba02f4cd1 100644 Binary files a/samples/h264SampleFrames/frame-1291.h264 and b/samples/h264SampleFrames/frame-1291.h264 differ diff --git a/samples/h264SampleFrames/frame-1292.h264 b/samples/h264SampleFrames/frame-1292.h264 index e9fe2c0dba..5ffe4e2ef2 100644 Binary files a/samples/h264SampleFrames/frame-1292.h264 and b/samples/h264SampleFrames/frame-1292.h264 differ diff --git a/samples/h264SampleFrames/frame-1293.h264 b/samples/h264SampleFrames/frame-1293.h264 index 0b9f44be01..011d982f03 100644 Binary files a/samples/h264SampleFrames/frame-1293.h264 and b/samples/h264SampleFrames/frame-1293.h264 differ diff --git a/samples/h264SampleFrames/frame-1294.h264 b/samples/h264SampleFrames/frame-1294.h264 index 35ab23530c..f3494e1860 100644 Binary files a/samples/h264SampleFrames/frame-1294.h264 and b/samples/h264SampleFrames/frame-1294.h264 differ diff --git a/samples/h264SampleFrames/frame-1295.h264 b/samples/h264SampleFrames/frame-1295.h264 index 729698fb22..a36dcc4ffa 100644 Binary files a/samples/h264SampleFrames/frame-1295.h264 and b/samples/h264SampleFrames/frame-1295.h264 differ diff --git a/samples/h264SampleFrames/frame-1296.h264 b/samples/h264SampleFrames/frame-1296.h264 index 712e61cdff..cf2bbcc0b7 100644 Binary files a/samples/h264SampleFrames/frame-1296.h264 and b/samples/h264SampleFrames/frame-1296.h264 differ diff --git a/samples/h264SampleFrames/frame-1297.h264 b/samples/h264SampleFrames/frame-1297.h264 index 3c3bac6aaa..68d1707df7 100644 Binary files a/samples/h264SampleFrames/frame-1297.h264 and b/samples/h264SampleFrames/frame-1297.h264 differ diff --git a/samples/h264SampleFrames/frame-1298.h264 b/samples/h264SampleFrames/frame-1298.h264 index cd31f8ea2c..431225a799 100644 Binary files a/samples/h264SampleFrames/frame-1298.h264 and b/samples/h264SampleFrames/frame-1298.h264 differ diff --git a/samples/h264SampleFrames/frame-1299.h264 b/samples/h264SampleFrames/frame-1299.h264 index ddc294c40e..e1dec5f749 100644 Binary files a/samples/h264SampleFrames/frame-1299.h264 and b/samples/h264SampleFrames/frame-1299.h264 differ diff --git a/samples/h264SampleFrames/frame-1300.h264 b/samples/h264SampleFrames/frame-1300.h264 index 93c6d4cb19..53bb71ecac 100644 Binary files a/samples/h264SampleFrames/frame-1300.h264 and b/samples/h264SampleFrames/frame-1300.h264 differ diff --git a/samples/h264SampleFrames/frame-1301.h264 b/samples/h264SampleFrames/frame-1301.h264 index 19986e0268..42cb6fcf6d 100644 Binary files a/samples/h264SampleFrames/frame-1301.h264 and b/samples/h264SampleFrames/frame-1301.h264 differ diff --git a/samples/h264SampleFrames/frame-1302.h264 b/samples/h264SampleFrames/frame-1302.h264 index 412041133c..145ef87c28 100644 Binary files a/samples/h264SampleFrames/frame-1302.h264 and b/samples/h264SampleFrames/frame-1302.h264 differ diff --git a/samples/h264SampleFrames/frame-1303.h264 b/samples/h264SampleFrames/frame-1303.h264 index c00d828107..82c1f0f214 100644 Binary files a/samples/h264SampleFrames/frame-1303.h264 and b/samples/h264SampleFrames/frame-1303.h264 differ diff --git a/samples/h264SampleFrames/frame-1304.h264 b/samples/h264SampleFrames/frame-1304.h264 index 3ef5448396..59d0849877 100644 Binary files a/samples/h264SampleFrames/frame-1304.h264 and b/samples/h264SampleFrames/frame-1304.h264 differ diff --git a/samples/h264SampleFrames/frame-1305.h264 b/samples/h264SampleFrames/frame-1305.h264 index 50b7762a11..16f715361f 100644 Binary files a/samples/h264SampleFrames/frame-1305.h264 and b/samples/h264SampleFrames/frame-1305.h264 differ diff --git a/samples/h264SampleFrames/frame-1306.h264 b/samples/h264SampleFrames/frame-1306.h264 index d08a29fe8f..0dda5ccda0 100644 Binary files a/samples/h264SampleFrames/frame-1306.h264 and b/samples/h264SampleFrames/frame-1306.h264 differ diff --git a/samples/h264SampleFrames/frame-1307.h264 b/samples/h264SampleFrames/frame-1307.h264 index d68fcfddc4..e34297f6ac 100644 Binary files a/samples/h264SampleFrames/frame-1307.h264 and b/samples/h264SampleFrames/frame-1307.h264 differ diff --git a/samples/h264SampleFrames/frame-1308.h264 b/samples/h264SampleFrames/frame-1308.h264 index 426fbbc5fc..e14cb3aac8 100644 Binary files a/samples/h264SampleFrames/frame-1308.h264 and b/samples/h264SampleFrames/frame-1308.h264 differ diff --git a/samples/h264SampleFrames/frame-1309.h264 b/samples/h264SampleFrames/frame-1309.h264 index c080428592..20e5c9690f 100644 Binary files a/samples/h264SampleFrames/frame-1309.h264 and b/samples/h264SampleFrames/frame-1309.h264 differ diff --git a/samples/h264SampleFrames/frame-1310.h264 b/samples/h264SampleFrames/frame-1310.h264 index 4e84be4958..f05ab886b4 100644 Binary files a/samples/h264SampleFrames/frame-1310.h264 and b/samples/h264SampleFrames/frame-1310.h264 differ diff --git a/samples/h264SampleFrames/frame-1311.h264 b/samples/h264SampleFrames/frame-1311.h264 index 9640b1dd4b..5905950bf8 100644 Binary files a/samples/h264SampleFrames/frame-1311.h264 and b/samples/h264SampleFrames/frame-1311.h264 differ diff --git a/samples/h264SampleFrames/frame-1312.h264 b/samples/h264SampleFrames/frame-1312.h264 index 29c75015de..37cdb23f08 100644 Binary files a/samples/h264SampleFrames/frame-1312.h264 and b/samples/h264SampleFrames/frame-1312.h264 differ diff --git a/samples/h264SampleFrames/frame-1313.h264 b/samples/h264SampleFrames/frame-1313.h264 index 6c98a1b292..f98165b8e0 100644 Binary files a/samples/h264SampleFrames/frame-1313.h264 and b/samples/h264SampleFrames/frame-1313.h264 differ diff --git a/samples/h264SampleFrames/frame-1314.h264 b/samples/h264SampleFrames/frame-1314.h264 index 244d8260d8..d54b806547 100644 Binary files a/samples/h264SampleFrames/frame-1314.h264 and b/samples/h264SampleFrames/frame-1314.h264 differ diff --git a/samples/h264SampleFrames/frame-1315.h264 b/samples/h264SampleFrames/frame-1315.h264 index ca785100e4..88f3781f5a 100644 Binary files a/samples/h264SampleFrames/frame-1315.h264 and b/samples/h264SampleFrames/frame-1315.h264 differ diff --git a/samples/h264SampleFrames/frame-1316.h264 b/samples/h264SampleFrames/frame-1316.h264 index 76c826e10e..cf748495f2 100644 Binary files a/samples/h264SampleFrames/frame-1316.h264 and b/samples/h264SampleFrames/frame-1316.h264 differ diff --git a/samples/h264SampleFrames/frame-1317.h264 b/samples/h264SampleFrames/frame-1317.h264 index 214a369dc3..130aa243e8 100644 Binary files a/samples/h264SampleFrames/frame-1317.h264 and b/samples/h264SampleFrames/frame-1317.h264 differ diff --git a/samples/h264SampleFrames/frame-1318.h264 b/samples/h264SampleFrames/frame-1318.h264 index f088f48849..55406476b2 100644 Binary files a/samples/h264SampleFrames/frame-1318.h264 and b/samples/h264SampleFrames/frame-1318.h264 differ diff --git a/samples/h264SampleFrames/frame-1319.h264 b/samples/h264SampleFrames/frame-1319.h264 index 24b5852345..28b537f96c 100644 Binary files a/samples/h264SampleFrames/frame-1319.h264 and b/samples/h264SampleFrames/frame-1319.h264 differ diff --git a/samples/h264SampleFrames/frame-1320.h264 b/samples/h264SampleFrames/frame-1320.h264 index 5fae68dac8..775bb9c845 100644 Binary files a/samples/h264SampleFrames/frame-1320.h264 and b/samples/h264SampleFrames/frame-1320.h264 differ diff --git a/samples/h264SampleFrames/frame-1321.h264 b/samples/h264SampleFrames/frame-1321.h264 index 4ad1af05a9..721d28eacd 100644 Binary files a/samples/h264SampleFrames/frame-1321.h264 and b/samples/h264SampleFrames/frame-1321.h264 differ diff --git a/samples/h264SampleFrames/frame-1322.h264 b/samples/h264SampleFrames/frame-1322.h264 index c094ff31e4..09d817e21a 100644 Binary files a/samples/h264SampleFrames/frame-1322.h264 and b/samples/h264SampleFrames/frame-1322.h264 differ diff --git a/samples/h264SampleFrames/frame-1323.h264 b/samples/h264SampleFrames/frame-1323.h264 index 812a9e0ab2..98c506d7d5 100644 Binary files a/samples/h264SampleFrames/frame-1323.h264 and b/samples/h264SampleFrames/frame-1323.h264 differ diff --git a/samples/h264SampleFrames/frame-1324.h264 b/samples/h264SampleFrames/frame-1324.h264 index 4b4892a9bb..1445cc0116 100644 Binary files a/samples/h264SampleFrames/frame-1324.h264 and b/samples/h264SampleFrames/frame-1324.h264 differ diff --git a/samples/h264SampleFrames/frame-1325.h264 b/samples/h264SampleFrames/frame-1325.h264 index 27b54c3559..12dfd644e2 100644 Binary files a/samples/h264SampleFrames/frame-1325.h264 and b/samples/h264SampleFrames/frame-1325.h264 differ diff --git a/samples/h264SampleFrames/frame-1326.h264 b/samples/h264SampleFrames/frame-1326.h264 index 57ac90dd3f..c964ead9f1 100644 Binary files a/samples/h264SampleFrames/frame-1326.h264 and b/samples/h264SampleFrames/frame-1326.h264 differ diff --git a/samples/h264SampleFrames/frame-1327.h264 b/samples/h264SampleFrames/frame-1327.h264 index 7e83bf9a2f..ca5871786f 100644 Binary files a/samples/h264SampleFrames/frame-1327.h264 and b/samples/h264SampleFrames/frame-1327.h264 differ diff --git a/samples/h264SampleFrames/frame-1328.h264 b/samples/h264SampleFrames/frame-1328.h264 index 9ae7de4de0..66ac45ddec 100644 Binary files a/samples/h264SampleFrames/frame-1328.h264 and b/samples/h264SampleFrames/frame-1328.h264 differ diff --git a/samples/h264SampleFrames/frame-1329.h264 b/samples/h264SampleFrames/frame-1329.h264 index a911c661a1..51158a30d4 100644 Binary files a/samples/h264SampleFrames/frame-1329.h264 and b/samples/h264SampleFrames/frame-1329.h264 differ diff --git a/samples/h264SampleFrames/frame-1330.h264 b/samples/h264SampleFrames/frame-1330.h264 index fa8170fd4a..5dfc67dbb6 100644 Binary files a/samples/h264SampleFrames/frame-1330.h264 and b/samples/h264SampleFrames/frame-1330.h264 differ diff --git a/samples/h264SampleFrames/frame-1331.h264 b/samples/h264SampleFrames/frame-1331.h264 index e1754244fb..c637410e68 100644 Binary files a/samples/h264SampleFrames/frame-1331.h264 and b/samples/h264SampleFrames/frame-1331.h264 differ diff --git a/samples/h264SampleFrames/frame-1332.h264 b/samples/h264SampleFrames/frame-1332.h264 index b6d54bf865..4a700123aa 100644 Binary files a/samples/h264SampleFrames/frame-1332.h264 and b/samples/h264SampleFrames/frame-1332.h264 differ diff --git a/samples/h264SampleFrames/frame-1333.h264 b/samples/h264SampleFrames/frame-1333.h264 index a43e72b1d6..be7556c75d 100644 Binary files a/samples/h264SampleFrames/frame-1333.h264 and b/samples/h264SampleFrames/frame-1333.h264 differ diff --git a/samples/h264SampleFrames/frame-1334.h264 b/samples/h264SampleFrames/frame-1334.h264 index 7df3e8daf9..88aedcd64d 100644 Binary files a/samples/h264SampleFrames/frame-1334.h264 and b/samples/h264SampleFrames/frame-1334.h264 differ diff --git a/samples/h264SampleFrames/frame-1335.h264 b/samples/h264SampleFrames/frame-1335.h264 index 9f3e1c1ae6..8417056fd7 100644 Binary files a/samples/h264SampleFrames/frame-1335.h264 and b/samples/h264SampleFrames/frame-1335.h264 differ diff --git a/samples/h264SampleFrames/frame-1336.h264 b/samples/h264SampleFrames/frame-1336.h264 index 2fc5bece8a..9d2c81b73f 100644 Binary files a/samples/h264SampleFrames/frame-1336.h264 and b/samples/h264SampleFrames/frame-1336.h264 differ diff --git a/samples/h264SampleFrames/frame-1337.h264 b/samples/h264SampleFrames/frame-1337.h264 index f6eeff4fe0..b2e7a9c6ad 100644 Binary files a/samples/h264SampleFrames/frame-1337.h264 and b/samples/h264SampleFrames/frame-1337.h264 differ diff --git a/samples/h264SampleFrames/frame-1338.h264 b/samples/h264SampleFrames/frame-1338.h264 index e0355d4ee7..56327fadb1 100644 Binary files a/samples/h264SampleFrames/frame-1338.h264 and b/samples/h264SampleFrames/frame-1338.h264 differ diff --git a/samples/h264SampleFrames/frame-1339.h264 b/samples/h264SampleFrames/frame-1339.h264 index ac46484a4d..401aca0623 100644 Binary files a/samples/h264SampleFrames/frame-1339.h264 and b/samples/h264SampleFrames/frame-1339.h264 differ diff --git a/samples/h264SampleFrames/frame-1340.h264 b/samples/h264SampleFrames/frame-1340.h264 index ca37130be7..8a48a8100d 100644 Binary files a/samples/h264SampleFrames/frame-1340.h264 and b/samples/h264SampleFrames/frame-1340.h264 differ diff --git a/samples/h264SampleFrames/frame-1341.h264 b/samples/h264SampleFrames/frame-1341.h264 index 25723a4f36..85804e11cd 100644 Binary files a/samples/h264SampleFrames/frame-1341.h264 and b/samples/h264SampleFrames/frame-1341.h264 differ diff --git a/samples/h264SampleFrames/frame-1342.h264 b/samples/h264SampleFrames/frame-1342.h264 index fb15b9b7e7..8f40fed1da 100644 Binary files a/samples/h264SampleFrames/frame-1342.h264 and b/samples/h264SampleFrames/frame-1342.h264 differ diff --git a/samples/h264SampleFrames/frame-1343.h264 b/samples/h264SampleFrames/frame-1343.h264 index 89eeb8e89f..35c825c460 100644 Binary files a/samples/h264SampleFrames/frame-1343.h264 and b/samples/h264SampleFrames/frame-1343.h264 differ diff --git a/samples/h264SampleFrames/frame-1344.h264 b/samples/h264SampleFrames/frame-1344.h264 index 7364078a60..d35010d73b 100644 Binary files a/samples/h264SampleFrames/frame-1344.h264 and b/samples/h264SampleFrames/frame-1344.h264 differ diff --git a/samples/h264SampleFrames/frame-1345.h264 b/samples/h264SampleFrames/frame-1345.h264 index 99e7fcf64e..f26aa3d9a9 100644 Binary files a/samples/h264SampleFrames/frame-1345.h264 and b/samples/h264SampleFrames/frame-1345.h264 differ diff --git a/samples/h264SampleFrames/frame-1346.h264 b/samples/h264SampleFrames/frame-1346.h264 index 5ac7e1600e..37f0b0834b 100644 Binary files a/samples/h264SampleFrames/frame-1346.h264 and b/samples/h264SampleFrames/frame-1346.h264 differ diff --git a/samples/h264SampleFrames/frame-1347.h264 b/samples/h264SampleFrames/frame-1347.h264 index 17eafc8e03..b50f7531c5 100644 Binary files a/samples/h264SampleFrames/frame-1347.h264 and b/samples/h264SampleFrames/frame-1347.h264 differ diff --git a/samples/h264SampleFrames/frame-1348.h264 b/samples/h264SampleFrames/frame-1348.h264 index 8cef83ef23..8d913dd25d 100644 Binary files a/samples/h264SampleFrames/frame-1348.h264 and b/samples/h264SampleFrames/frame-1348.h264 differ diff --git a/samples/h264SampleFrames/frame-1349.h264 b/samples/h264SampleFrames/frame-1349.h264 index 8da85e9c56..a8aaaaa606 100644 Binary files a/samples/h264SampleFrames/frame-1349.h264 and b/samples/h264SampleFrames/frame-1349.h264 differ diff --git a/samples/h264SampleFrames/frame-1350.h264 b/samples/h264SampleFrames/frame-1350.h264 index 04616d0f8b..914edaebdf 100644 Binary files a/samples/h264SampleFrames/frame-1350.h264 and b/samples/h264SampleFrames/frame-1350.h264 differ diff --git a/samples/h264SampleFrames/frame-1351.h264 b/samples/h264SampleFrames/frame-1351.h264 index 4b23bdb82b..14fba7cbf7 100644 Binary files a/samples/h264SampleFrames/frame-1351.h264 and b/samples/h264SampleFrames/frame-1351.h264 differ diff --git a/samples/h264SampleFrames/frame-1352.h264 b/samples/h264SampleFrames/frame-1352.h264 index a27ed6e642..3ad3002cd8 100644 Binary files a/samples/h264SampleFrames/frame-1352.h264 and b/samples/h264SampleFrames/frame-1352.h264 differ diff --git a/samples/h264SampleFrames/frame-1353.h264 b/samples/h264SampleFrames/frame-1353.h264 index 7dc15eba17..51c3fa38ca 100644 Binary files a/samples/h264SampleFrames/frame-1353.h264 and b/samples/h264SampleFrames/frame-1353.h264 differ diff --git a/samples/h264SampleFrames/frame-1354.h264 b/samples/h264SampleFrames/frame-1354.h264 index 4527482b41..b007337e77 100644 Binary files a/samples/h264SampleFrames/frame-1354.h264 and b/samples/h264SampleFrames/frame-1354.h264 differ diff --git a/samples/h264SampleFrames/frame-1355.h264 b/samples/h264SampleFrames/frame-1355.h264 index d0fd5b1781..101cb72359 100644 Binary files a/samples/h264SampleFrames/frame-1355.h264 and b/samples/h264SampleFrames/frame-1355.h264 differ diff --git a/samples/h264SampleFrames/frame-1356.h264 b/samples/h264SampleFrames/frame-1356.h264 index 6adc304296..8736dff2df 100644 Binary files a/samples/h264SampleFrames/frame-1356.h264 and b/samples/h264SampleFrames/frame-1356.h264 differ diff --git a/samples/h264SampleFrames/frame-1357.h264 b/samples/h264SampleFrames/frame-1357.h264 index 52730f678c..d34af03b6c 100644 Binary files a/samples/h264SampleFrames/frame-1357.h264 and b/samples/h264SampleFrames/frame-1357.h264 differ diff --git a/samples/h264SampleFrames/frame-1358.h264 b/samples/h264SampleFrames/frame-1358.h264 index 69d5868dc0..4b0c9897cf 100644 Binary files a/samples/h264SampleFrames/frame-1358.h264 and b/samples/h264SampleFrames/frame-1358.h264 differ diff --git a/samples/h264SampleFrames/frame-1359.h264 b/samples/h264SampleFrames/frame-1359.h264 index 4d5f7e754f..df9ecdf945 100644 Binary files a/samples/h264SampleFrames/frame-1359.h264 and b/samples/h264SampleFrames/frame-1359.h264 differ diff --git a/samples/h264SampleFrames/frame-1360.h264 b/samples/h264SampleFrames/frame-1360.h264 index c5d8a37527..26b8b1d2c1 100644 Binary files a/samples/h264SampleFrames/frame-1360.h264 and b/samples/h264SampleFrames/frame-1360.h264 differ diff --git a/samples/h264SampleFrames/frame-1361.h264 b/samples/h264SampleFrames/frame-1361.h264 index 880c29f1d1..579c900a25 100644 Binary files a/samples/h264SampleFrames/frame-1361.h264 and b/samples/h264SampleFrames/frame-1361.h264 differ diff --git a/samples/h264SampleFrames/frame-1362.h264 b/samples/h264SampleFrames/frame-1362.h264 index c40ce9fccb..1b2161b2a5 100644 Binary files a/samples/h264SampleFrames/frame-1362.h264 and b/samples/h264SampleFrames/frame-1362.h264 differ diff --git a/samples/h264SampleFrames/frame-1363.h264 b/samples/h264SampleFrames/frame-1363.h264 index 9a29937116..c5f8cc33d4 100644 Binary files a/samples/h264SampleFrames/frame-1363.h264 and b/samples/h264SampleFrames/frame-1363.h264 differ diff --git a/samples/h264SampleFrames/frame-1364.h264 b/samples/h264SampleFrames/frame-1364.h264 index 88dfbcf7de..7034b04b24 100644 Binary files a/samples/h264SampleFrames/frame-1364.h264 and b/samples/h264SampleFrames/frame-1364.h264 differ diff --git a/samples/h264SampleFrames/frame-1365.h264 b/samples/h264SampleFrames/frame-1365.h264 index 97e57809ae..1fe4fd4257 100644 Binary files a/samples/h264SampleFrames/frame-1365.h264 and b/samples/h264SampleFrames/frame-1365.h264 differ diff --git a/samples/h264SampleFrames/frame-1366.h264 b/samples/h264SampleFrames/frame-1366.h264 index f3feedce54..184e6a6788 100644 Binary files a/samples/h264SampleFrames/frame-1366.h264 and b/samples/h264SampleFrames/frame-1366.h264 differ diff --git a/samples/h264SampleFrames/frame-1367.h264 b/samples/h264SampleFrames/frame-1367.h264 index 07e792a32a..760b329876 100644 Binary files a/samples/h264SampleFrames/frame-1367.h264 and b/samples/h264SampleFrames/frame-1367.h264 differ diff --git a/samples/h264SampleFrames/frame-1368.h264 b/samples/h264SampleFrames/frame-1368.h264 index e396e35d05..91f510ecbb 100644 Binary files a/samples/h264SampleFrames/frame-1368.h264 and b/samples/h264SampleFrames/frame-1368.h264 differ diff --git a/samples/h264SampleFrames/frame-1369.h264 b/samples/h264SampleFrames/frame-1369.h264 index 74a9e3f80d..70a9f0b770 100644 Binary files a/samples/h264SampleFrames/frame-1369.h264 and b/samples/h264SampleFrames/frame-1369.h264 differ diff --git a/samples/h264SampleFrames/frame-1370.h264 b/samples/h264SampleFrames/frame-1370.h264 index c7ed6b7a27..97cc9b2d98 100644 Binary files a/samples/h264SampleFrames/frame-1370.h264 and b/samples/h264SampleFrames/frame-1370.h264 differ diff --git a/samples/h264SampleFrames/frame-1371.h264 b/samples/h264SampleFrames/frame-1371.h264 index 1df5afab50..4c6ceb17c6 100644 Binary files a/samples/h264SampleFrames/frame-1371.h264 and b/samples/h264SampleFrames/frame-1371.h264 differ diff --git a/samples/h264SampleFrames/frame-1372.h264 b/samples/h264SampleFrames/frame-1372.h264 index 7392a28c03..9ec720529f 100644 Binary files a/samples/h264SampleFrames/frame-1372.h264 and b/samples/h264SampleFrames/frame-1372.h264 differ diff --git a/samples/h264SampleFrames/frame-1373.h264 b/samples/h264SampleFrames/frame-1373.h264 index 296e653400..8948877e6f 100644 Binary files a/samples/h264SampleFrames/frame-1373.h264 and b/samples/h264SampleFrames/frame-1373.h264 differ diff --git a/samples/h264SampleFrames/frame-1374.h264 b/samples/h264SampleFrames/frame-1374.h264 index 1305f35a64..db31183ee3 100644 Binary files a/samples/h264SampleFrames/frame-1374.h264 and b/samples/h264SampleFrames/frame-1374.h264 differ diff --git a/samples/h264SampleFrames/frame-1375.h264 b/samples/h264SampleFrames/frame-1375.h264 index 2292f8ffac..623a84d857 100644 Binary files a/samples/h264SampleFrames/frame-1375.h264 and b/samples/h264SampleFrames/frame-1375.h264 differ diff --git a/samples/h264SampleFrames/frame-1376.h264 b/samples/h264SampleFrames/frame-1376.h264 index 8b1b6843db..9428597972 100644 Binary files a/samples/h264SampleFrames/frame-1376.h264 and b/samples/h264SampleFrames/frame-1376.h264 differ diff --git a/samples/h264SampleFrames/frame-1377.h264 b/samples/h264SampleFrames/frame-1377.h264 index e819d8d5da..a34f2a25c4 100644 Binary files a/samples/h264SampleFrames/frame-1377.h264 and b/samples/h264SampleFrames/frame-1377.h264 differ diff --git a/samples/h264SampleFrames/frame-1378.h264 b/samples/h264SampleFrames/frame-1378.h264 index b8dd675c1f..3b881713ba 100644 Binary files a/samples/h264SampleFrames/frame-1378.h264 and b/samples/h264SampleFrames/frame-1378.h264 differ diff --git a/samples/h264SampleFrames/frame-1379.h264 b/samples/h264SampleFrames/frame-1379.h264 index de3acfb27a..05b1f7bba4 100644 Binary files a/samples/h264SampleFrames/frame-1379.h264 and b/samples/h264SampleFrames/frame-1379.h264 differ diff --git a/samples/h264SampleFrames/frame-1380.h264 b/samples/h264SampleFrames/frame-1380.h264 index 580898c28b..c7ec629119 100644 Binary files a/samples/h264SampleFrames/frame-1380.h264 and b/samples/h264SampleFrames/frame-1380.h264 differ diff --git a/samples/h264SampleFrames/frame-1381.h264 b/samples/h264SampleFrames/frame-1381.h264 index a4fbfbde00..bd7c0472e8 100644 Binary files a/samples/h264SampleFrames/frame-1381.h264 and b/samples/h264SampleFrames/frame-1381.h264 differ diff --git a/samples/h264SampleFrames/frame-1382.h264 b/samples/h264SampleFrames/frame-1382.h264 index 437f368511..fed16f62f5 100644 Binary files a/samples/h264SampleFrames/frame-1382.h264 and b/samples/h264SampleFrames/frame-1382.h264 differ diff --git a/samples/h264SampleFrames/frame-1383.h264 b/samples/h264SampleFrames/frame-1383.h264 index d9cdac3a2d..ef23d69ae9 100644 Binary files a/samples/h264SampleFrames/frame-1383.h264 and b/samples/h264SampleFrames/frame-1383.h264 differ diff --git a/samples/h264SampleFrames/frame-1384.h264 b/samples/h264SampleFrames/frame-1384.h264 index 1b1c157bc0..e422623774 100644 Binary files a/samples/h264SampleFrames/frame-1384.h264 and b/samples/h264SampleFrames/frame-1384.h264 differ diff --git a/samples/h264SampleFrames/frame-1385.h264 b/samples/h264SampleFrames/frame-1385.h264 index 9f21fbfe2a..1f2ed604d0 100644 Binary files a/samples/h264SampleFrames/frame-1385.h264 and b/samples/h264SampleFrames/frame-1385.h264 differ diff --git a/samples/h264SampleFrames/frame-1386.h264 b/samples/h264SampleFrames/frame-1386.h264 index 9431666b53..530d0828d8 100644 Binary files a/samples/h264SampleFrames/frame-1386.h264 and b/samples/h264SampleFrames/frame-1386.h264 differ diff --git a/samples/h264SampleFrames/frame-1387.h264 b/samples/h264SampleFrames/frame-1387.h264 index f8c7794073..673a4b2069 100644 Binary files a/samples/h264SampleFrames/frame-1387.h264 and b/samples/h264SampleFrames/frame-1387.h264 differ diff --git a/samples/h264SampleFrames/frame-1388.h264 b/samples/h264SampleFrames/frame-1388.h264 index e7badc04c2..b9c6723e74 100644 Binary files a/samples/h264SampleFrames/frame-1388.h264 and b/samples/h264SampleFrames/frame-1388.h264 differ diff --git a/samples/h264SampleFrames/frame-1389.h264 b/samples/h264SampleFrames/frame-1389.h264 index d95e03d1cb..a366118e18 100644 Binary files a/samples/h264SampleFrames/frame-1389.h264 and b/samples/h264SampleFrames/frame-1389.h264 differ diff --git a/samples/h264SampleFrames/frame-1390.h264 b/samples/h264SampleFrames/frame-1390.h264 index f866bac52e..babea8d4f6 100644 Binary files a/samples/h264SampleFrames/frame-1390.h264 and b/samples/h264SampleFrames/frame-1390.h264 differ diff --git a/samples/h264SampleFrames/frame-1391.h264 b/samples/h264SampleFrames/frame-1391.h264 index 68b6315f30..46da748fce 100644 Binary files a/samples/h264SampleFrames/frame-1391.h264 and b/samples/h264SampleFrames/frame-1391.h264 differ diff --git a/samples/h264SampleFrames/frame-1392.h264 b/samples/h264SampleFrames/frame-1392.h264 index cd40324dd9..80075709ea 100644 Binary files a/samples/h264SampleFrames/frame-1392.h264 and b/samples/h264SampleFrames/frame-1392.h264 differ diff --git a/samples/h264SampleFrames/frame-1393.h264 b/samples/h264SampleFrames/frame-1393.h264 index 0ed23d8d99..53a0d8ee7b 100644 Binary files a/samples/h264SampleFrames/frame-1393.h264 and b/samples/h264SampleFrames/frame-1393.h264 differ diff --git a/samples/h264SampleFrames/frame-1394.h264 b/samples/h264SampleFrames/frame-1394.h264 index d496ff8186..a5fe255a5e 100644 Binary files a/samples/h264SampleFrames/frame-1394.h264 and b/samples/h264SampleFrames/frame-1394.h264 differ diff --git a/samples/h264SampleFrames/frame-1395.h264 b/samples/h264SampleFrames/frame-1395.h264 index 325b532d15..13483673d2 100644 Binary files a/samples/h264SampleFrames/frame-1395.h264 and b/samples/h264SampleFrames/frame-1395.h264 differ diff --git a/samples/h264SampleFrames/frame-1396.h264 b/samples/h264SampleFrames/frame-1396.h264 index f135116fbd..9baaf74ba2 100644 Binary files a/samples/h264SampleFrames/frame-1396.h264 and b/samples/h264SampleFrames/frame-1396.h264 differ diff --git a/samples/h264SampleFrames/frame-1397.h264 b/samples/h264SampleFrames/frame-1397.h264 index d4f05687d3..dd2ec7f4bc 100644 Binary files a/samples/h264SampleFrames/frame-1397.h264 and b/samples/h264SampleFrames/frame-1397.h264 differ diff --git a/samples/h264SampleFrames/frame-1398.h264 b/samples/h264SampleFrames/frame-1398.h264 index d6dbac2df1..48dae2b1f0 100644 Binary files a/samples/h264SampleFrames/frame-1398.h264 and b/samples/h264SampleFrames/frame-1398.h264 differ diff --git a/samples/h264SampleFrames/frame-1399.h264 b/samples/h264SampleFrames/frame-1399.h264 index 5bacef5058..54f2996b1e 100644 Binary files a/samples/h264SampleFrames/frame-1399.h264 and b/samples/h264SampleFrames/frame-1399.h264 differ diff --git a/samples/h264SampleFrames/frame-1400.h264 b/samples/h264SampleFrames/frame-1400.h264 index ba5080e15a..73c00b5ac3 100644 Binary files a/samples/h264SampleFrames/frame-1400.h264 and b/samples/h264SampleFrames/frame-1400.h264 differ diff --git a/samples/h264SampleFrames/frame-1401.h264 b/samples/h264SampleFrames/frame-1401.h264 index cc4d88a88d..a1f5eef567 100644 Binary files a/samples/h264SampleFrames/frame-1401.h264 and b/samples/h264SampleFrames/frame-1401.h264 differ diff --git a/samples/h264SampleFrames/frame-1402.h264 b/samples/h264SampleFrames/frame-1402.h264 index 71aae81ea8..6e6dff006c 100644 Binary files a/samples/h264SampleFrames/frame-1402.h264 and b/samples/h264SampleFrames/frame-1402.h264 differ diff --git a/samples/h264SampleFrames/frame-1403.h264 b/samples/h264SampleFrames/frame-1403.h264 index 341abe806c..9873acb45f 100644 Binary files a/samples/h264SampleFrames/frame-1403.h264 and b/samples/h264SampleFrames/frame-1403.h264 differ diff --git a/samples/h264SampleFrames/frame-1404.h264 b/samples/h264SampleFrames/frame-1404.h264 index 4f5d16435e..1805d676f5 100644 Binary files a/samples/h264SampleFrames/frame-1404.h264 and b/samples/h264SampleFrames/frame-1404.h264 differ diff --git a/samples/h264SampleFrames/frame-1405.h264 b/samples/h264SampleFrames/frame-1405.h264 index b61f91b7a3..ff02736762 100644 Binary files a/samples/h264SampleFrames/frame-1405.h264 and b/samples/h264SampleFrames/frame-1405.h264 differ diff --git a/samples/h264SampleFrames/frame-1406.h264 b/samples/h264SampleFrames/frame-1406.h264 index 09574df717..434774a1ae 100644 Binary files a/samples/h264SampleFrames/frame-1406.h264 and b/samples/h264SampleFrames/frame-1406.h264 differ diff --git a/samples/h264SampleFrames/frame-1407.h264 b/samples/h264SampleFrames/frame-1407.h264 index c85fa8247c..741ad48456 100644 Binary files a/samples/h264SampleFrames/frame-1407.h264 and b/samples/h264SampleFrames/frame-1407.h264 differ diff --git a/samples/h264SampleFrames/frame-1408.h264 b/samples/h264SampleFrames/frame-1408.h264 index 4b3d5fd20d..77571ac47f 100644 Binary files a/samples/h264SampleFrames/frame-1408.h264 and b/samples/h264SampleFrames/frame-1408.h264 differ diff --git a/samples/h264SampleFrames/frame-1409.h264 b/samples/h264SampleFrames/frame-1409.h264 index e23575855c..8b730a2bba 100644 Binary files a/samples/h264SampleFrames/frame-1409.h264 and b/samples/h264SampleFrames/frame-1409.h264 differ diff --git a/samples/h264SampleFrames/frame-1410.h264 b/samples/h264SampleFrames/frame-1410.h264 index 37a4497b67..51bcc11aa0 100644 Binary files a/samples/h264SampleFrames/frame-1410.h264 and b/samples/h264SampleFrames/frame-1410.h264 differ diff --git a/samples/h264SampleFrames/frame-1411.h264 b/samples/h264SampleFrames/frame-1411.h264 index 2346a5b9a4..922db557e8 100644 Binary files a/samples/h264SampleFrames/frame-1411.h264 and b/samples/h264SampleFrames/frame-1411.h264 differ diff --git a/samples/h264SampleFrames/frame-1412.h264 b/samples/h264SampleFrames/frame-1412.h264 index 629ae668a0..bc66782e49 100644 Binary files a/samples/h264SampleFrames/frame-1412.h264 and b/samples/h264SampleFrames/frame-1412.h264 differ diff --git a/samples/h264SampleFrames/frame-1413.h264 b/samples/h264SampleFrames/frame-1413.h264 index 2ff96a5002..434a38e0a8 100644 Binary files a/samples/h264SampleFrames/frame-1413.h264 and b/samples/h264SampleFrames/frame-1413.h264 differ diff --git a/samples/h264SampleFrames/frame-1414.h264 b/samples/h264SampleFrames/frame-1414.h264 index 06fafa9d3a..013a3323ff 100644 Binary files a/samples/h264SampleFrames/frame-1414.h264 and b/samples/h264SampleFrames/frame-1414.h264 differ diff --git a/samples/h264SampleFrames/frame-1415.h264 b/samples/h264SampleFrames/frame-1415.h264 index 96f32763f1..4e92d668a7 100644 Binary files a/samples/h264SampleFrames/frame-1415.h264 and b/samples/h264SampleFrames/frame-1415.h264 differ diff --git a/samples/h264SampleFrames/frame-1416.h264 b/samples/h264SampleFrames/frame-1416.h264 index 37c8b84750..ff9253bc66 100644 Binary files a/samples/h264SampleFrames/frame-1416.h264 and b/samples/h264SampleFrames/frame-1416.h264 differ diff --git a/samples/h264SampleFrames/frame-1417.h264 b/samples/h264SampleFrames/frame-1417.h264 index 375d6530f6..cfc4dc38e2 100644 Binary files a/samples/h264SampleFrames/frame-1417.h264 and b/samples/h264SampleFrames/frame-1417.h264 differ diff --git a/samples/h264SampleFrames/frame-1418.h264 b/samples/h264SampleFrames/frame-1418.h264 index 457eb2dc78..8a2cad6b34 100644 Binary files a/samples/h264SampleFrames/frame-1418.h264 and b/samples/h264SampleFrames/frame-1418.h264 differ diff --git a/samples/h264SampleFrames/frame-1419.h264 b/samples/h264SampleFrames/frame-1419.h264 index dbcd105b3b..c3f99d4a92 100644 Binary files a/samples/h264SampleFrames/frame-1419.h264 and b/samples/h264SampleFrames/frame-1419.h264 differ diff --git a/samples/h264SampleFrames/frame-1420.h264 b/samples/h264SampleFrames/frame-1420.h264 index fce6f37cd4..c85f4a3987 100644 Binary files a/samples/h264SampleFrames/frame-1420.h264 and b/samples/h264SampleFrames/frame-1420.h264 differ diff --git a/samples/h264SampleFrames/frame-1421.h264 b/samples/h264SampleFrames/frame-1421.h264 index 327e69d1c7..02278165df 100644 Binary files a/samples/h264SampleFrames/frame-1421.h264 and b/samples/h264SampleFrames/frame-1421.h264 differ diff --git a/samples/h264SampleFrames/frame-1422.h264 b/samples/h264SampleFrames/frame-1422.h264 index 030294dd72..311b3ff523 100644 Binary files a/samples/h264SampleFrames/frame-1422.h264 and b/samples/h264SampleFrames/frame-1422.h264 differ diff --git a/samples/h264SampleFrames/frame-1423.h264 b/samples/h264SampleFrames/frame-1423.h264 index 4b304d7a3a..da7606e3de 100644 Binary files a/samples/h264SampleFrames/frame-1423.h264 and b/samples/h264SampleFrames/frame-1423.h264 differ diff --git a/samples/h264SampleFrames/frame-1424.h264 b/samples/h264SampleFrames/frame-1424.h264 index aa8cdaa8c5..841035fb6e 100644 Binary files a/samples/h264SampleFrames/frame-1424.h264 and b/samples/h264SampleFrames/frame-1424.h264 differ diff --git a/samples/h264SampleFrames/frame-1425.h264 b/samples/h264SampleFrames/frame-1425.h264 index 1a5e6e0858..12a63a28d8 100644 Binary files a/samples/h264SampleFrames/frame-1425.h264 and b/samples/h264SampleFrames/frame-1425.h264 differ diff --git a/samples/h264SampleFrames/frame-1426.h264 b/samples/h264SampleFrames/frame-1426.h264 index a98ce577c5..a11988f4de 100644 Binary files a/samples/h264SampleFrames/frame-1426.h264 and b/samples/h264SampleFrames/frame-1426.h264 differ diff --git a/samples/h264SampleFrames/frame-1427.h264 b/samples/h264SampleFrames/frame-1427.h264 index 6ce083b017..e5f7d6e544 100644 Binary files a/samples/h264SampleFrames/frame-1427.h264 and b/samples/h264SampleFrames/frame-1427.h264 differ diff --git a/samples/h264SampleFrames/frame-1428.h264 b/samples/h264SampleFrames/frame-1428.h264 index b1bf9be79c..109880c501 100644 Binary files a/samples/h264SampleFrames/frame-1428.h264 and b/samples/h264SampleFrames/frame-1428.h264 differ diff --git a/samples/h264SampleFrames/frame-1429.h264 b/samples/h264SampleFrames/frame-1429.h264 index 42118b8ee4..989e05d96d 100644 Binary files a/samples/h264SampleFrames/frame-1429.h264 and b/samples/h264SampleFrames/frame-1429.h264 differ diff --git a/samples/h264SampleFrames/frame-1430.h264 b/samples/h264SampleFrames/frame-1430.h264 index 153da3b7cf..af1dbf3fa6 100644 Binary files a/samples/h264SampleFrames/frame-1430.h264 and b/samples/h264SampleFrames/frame-1430.h264 differ diff --git a/samples/h264SampleFrames/frame-1431.h264 b/samples/h264SampleFrames/frame-1431.h264 index 4bd561ca90..396728c3d1 100644 Binary files a/samples/h264SampleFrames/frame-1431.h264 and b/samples/h264SampleFrames/frame-1431.h264 differ diff --git a/samples/h264SampleFrames/frame-1432.h264 b/samples/h264SampleFrames/frame-1432.h264 index 5829a01a24..8311cb3854 100644 Binary files a/samples/h264SampleFrames/frame-1432.h264 and b/samples/h264SampleFrames/frame-1432.h264 differ diff --git a/samples/h264SampleFrames/frame-1433.h264 b/samples/h264SampleFrames/frame-1433.h264 index 3af6126ba0..cc0553f3e3 100644 Binary files a/samples/h264SampleFrames/frame-1433.h264 and b/samples/h264SampleFrames/frame-1433.h264 differ diff --git a/samples/h264SampleFrames/frame-1434.h264 b/samples/h264SampleFrames/frame-1434.h264 index 859039883d..b306431583 100644 Binary files a/samples/h264SampleFrames/frame-1434.h264 and b/samples/h264SampleFrames/frame-1434.h264 differ diff --git a/samples/h264SampleFrames/frame-1435.h264 b/samples/h264SampleFrames/frame-1435.h264 index 1cdce28b42..0ff318cfa9 100644 Binary files a/samples/h264SampleFrames/frame-1435.h264 and b/samples/h264SampleFrames/frame-1435.h264 differ diff --git a/samples/h264SampleFrames/frame-1436.h264 b/samples/h264SampleFrames/frame-1436.h264 index b7439b1a29..82288643d0 100644 Binary files a/samples/h264SampleFrames/frame-1436.h264 and b/samples/h264SampleFrames/frame-1436.h264 differ diff --git a/samples/h264SampleFrames/frame-1437.h264 b/samples/h264SampleFrames/frame-1437.h264 index daa2c6eed9..840c9a88a7 100644 Binary files a/samples/h264SampleFrames/frame-1437.h264 and b/samples/h264SampleFrames/frame-1437.h264 differ diff --git a/samples/h264SampleFrames/frame-1438.h264 b/samples/h264SampleFrames/frame-1438.h264 index 8c800b55dd..db94702929 100644 Binary files a/samples/h264SampleFrames/frame-1438.h264 and b/samples/h264SampleFrames/frame-1438.h264 differ diff --git a/samples/h264SampleFrames/frame-1439.h264 b/samples/h264SampleFrames/frame-1439.h264 index 4d94e1bee4..88ab160bd4 100644 Binary files a/samples/h264SampleFrames/frame-1439.h264 and b/samples/h264SampleFrames/frame-1439.h264 differ diff --git a/samples/h264SampleFrames/frame-1440.h264 b/samples/h264SampleFrames/frame-1440.h264 index def3ae8c91..96a99836bf 100644 Binary files a/samples/h264SampleFrames/frame-1440.h264 and b/samples/h264SampleFrames/frame-1440.h264 differ diff --git a/samples/h264SampleFrames/frame-1441.h264 b/samples/h264SampleFrames/frame-1441.h264 index 7d413e0190..222c15aee5 100644 Binary files a/samples/h264SampleFrames/frame-1441.h264 and b/samples/h264SampleFrames/frame-1441.h264 differ diff --git a/samples/h264SampleFrames/frame-1442.h264 b/samples/h264SampleFrames/frame-1442.h264 index fb8cc4da83..b4f522e66a 100644 Binary files a/samples/h264SampleFrames/frame-1442.h264 and b/samples/h264SampleFrames/frame-1442.h264 differ diff --git a/samples/h264SampleFrames/frame-1443.h264 b/samples/h264SampleFrames/frame-1443.h264 index 03657888da..665e6c4851 100644 Binary files a/samples/h264SampleFrames/frame-1443.h264 and b/samples/h264SampleFrames/frame-1443.h264 differ diff --git a/samples/h264SampleFrames/frame-1444.h264 b/samples/h264SampleFrames/frame-1444.h264 index b106ed95ca..78af745322 100644 Binary files a/samples/h264SampleFrames/frame-1444.h264 and b/samples/h264SampleFrames/frame-1444.h264 differ diff --git a/samples/h264SampleFrames/frame-1445.h264 b/samples/h264SampleFrames/frame-1445.h264 index 647c8ffbd9..d62af57599 100644 Binary files a/samples/h264SampleFrames/frame-1445.h264 and b/samples/h264SampleFrames/frame-1445.h264 differ diff --git a/samples/h264SampleFrames/frame-1446.h264 b/samples/h264SampleFrames/frame-1446.h264 index f39f8ebaec..9002c37bcd 100644 Binary files a/samples/h264SampleFrames/frame-1446.h264 and b/samples/h264SampleFrames/frame-1446.h264 differ diff --git a/samples/h264SampleFrames/frame-1447.h264 b/samples/h264SampleFrames/frame-1447.h264 index ea95bfb7d8..2402aadac8 100644 Binary files a/samples/h264SampleFrames/frame-1447.h264 and b/samples/h264SampleFrames/frame-1447.h264 differ diff --git a/samples/h264SampleFrames/frame-1448.h264 b/samples/h264SampleFrames/frame-1448.h264 index aabb106c88..6986c9d858 100644 Binary files a/samples/h264SampleFrames/frame-1448.h264 and b/samples/h264SampleFrames/frame-1448.h264 differ diff --git a/samples/h264SampleFrames/frame-1449.h264 b/samples/h264SampleFrames/frame-1449.h264 index 6f5fb0a10b..4ba524263f 100644 Binary files a/samples/h264SampleFrames/frame-1449.h264 and b/samples/h264SampleFrames/frame-1449.h264 differ diff --git a/samples/h264SampleFrames/frame-1450.h264 b/samples/h264SampleFrames/frame-1450.h264 index eb639fd821..2be5fa19ed 100644 Binary files a/samples/h264SampleFrames/frame-1450.h264 and b/samples/h264SampleFrames/frame-1450.h264 differ diff --git a/samples/h264SampleFrames/frame-1451.h264 b/samples/h264SampleFrames/frame-1451.h264 index baf729d309..2dfad65388 100644 Binary files a/samples/h264SampleFrames/frame-1451.h264 and b/samples/h264SampleFrames/frame-1451.h264 differ diff --git a/samples/h264SampleFrames/frame-1452.h264 b/samples/h264SampleFrames/frame-1452.h264 index 73b8546701..efc138c5fb 100644 Binary files a/samples/h264SampleFrames/frame-1452.h264 and b/samples/h264SampleFrames/frame-1452.h264 differ diff --git a/samples/h264SampleFrames/frame-1453.h264 b/samples/h264SampleFrames/frame-1453.h264 index 52b85202df..05b32741dc 100644 Binary files a/samples/h264SampleFrames/frame-1453.h264 and b/samples/h264SampleFrames/frame-1453.h264 differ diff --git a/samples/h264SampleFrames/frame-1454.h264 b/samples/h264SampleFrames/frame-1454.h264 index 541c19763a..cefa94c090 100644 Binary files a/samples/h264SampleFrames/frame-1454.h264 and b/samples/h264SampleFrames/frame-1454.h264 differ diff --git a/samples/h264SampleFrames/frame-1455.h264 b/samples/h264SampleFrames/frame-1455.h264 index b15b654aed..1043cd38c5 100644 Binary files a/samples/h264SampleFrames/frame-1455.h264 and b/samples/h264SampleFrames/frame-1455.h264 differ diff --git a/samples/h264SampleFrames/frame-1456.h264 b/samples/h264SampleFrames/frame-1456.h264 index 20a6e3541c..78bc4d57a1 100644 Binary files a/samples/h264SampleFrames/frame-1456.h264 and b/samples/h264SampleFrames/frame-1456.h264 differ diff --git a/samples/h264SampleFrames/frame-1457.h264 b/samples/h264SampleFrames/frame-1457.h264 index d09d6cdf3b..76bffef716 100644 Binary files a/samples/h264SampleFrames/frame-1457.h264 and b/samples/h264SampleFrames/frame-1457.h264 differ diff --git a/samples/h264SampleFrames/frame-1458.h264 b/samples/h264SampleFrames/frame-1458.h264 index fb782c8881..0f0ffa9816 100644 Binary files a/samples/h264SampleFrames/frame-1458.h264 and b/samples/h264SampleFrames/frame-1458.h264 differ diff --git a/samples/h264SampleFrames/frame-1459.h264 b/samples/h264SampleFrames/frame-1459.h264 index a8eda63e7b..571e2258f8 100644 Binary files a/samples/h264SampleFrames/frame-1459.h264 and b/samples/h264SampleFrames/frame-1459.h264 differ diff --git a/samples/h264SampleFrames/frame-1460.h264 b/samples/h264SampleFrames/frame-1460.h264 index aec7381681..e5b3be6467 100644 Binary files a/samples/h264SampleFrames/frame-1460.h264 and b/samples/h264SampleFrames/frame-1460.h264 differ diff --git a/samples/h264SampleFrames/frame-1461.h264 b/samples/h264SampleFrames/frame-1461.h264 index bc7b9ea861..75bed37dc9 100644 Binary files a/samples/h264SampleFrames/frame-1461.h264 and b/samples/h264SampleFrames/frame-1461.h264 differ diff --git a/samples/h264SampleFrames/frame-1462.h264 b/samples/h264SampleFrames/frame-1462.h264 index ddb94e9178..7fa180094a 100644 Binary files a/samples/h264SampleFrames/frame-1462.h264 and b/samples/h264SampleFrames/frame-1462.h264 differ diff --git a/samples/h264SampleFrames/frame-1463.h264 b/samples/h264SampleFrames/frame-1463.h264 index 96710e50e8..b141fa6dd0 100644 Binary files a/samples/h264SampleFrames/frame-1463.h264 and b/samples/h264SampleFrames/frame-1463.h264 differ diff --git a/samples/h264SampleFrames/frame-1464.h264 b/samples/h264SampleFrames/frame-1464.h264 index 3669a3ef77..4c0dd841fc 100644 Binary files a/samples/h264SampleFrames/frame-1464.h264 and b/samples/h264SampleFrames/frame-1464.h264 differ diff --git a/samples/h264SampleFrames/frame-1465.h264 b/samples/h264SampleFrames/frame-1465.h264 index 47ece8ffa1..f857cf46bd 100644 Binary files a/samples/h264SampleFrames/frame-1465.h264 and b/samples/h264SampleFrames/frame-1465.h264 differ diff --git a/samples/h264SampleFrames/frame-1466.h264 b/samples/h264SampleFrames/frame-1466.h264 index f486a79f77..e5cf24ce24 100644 Binary files a/samples/h264SampleFrames/frame-1466.h264 and b/samples/h264SampleFrames/frame-1466.h264 differ diff --git a/samples/h264SampleFrames/frame-1467.h264 b/samples/h264SampleFrames/frame-1467.h264 index 50712459d7..16846395d6 100644 Binary files a/samples/h264SampleFrames/frame-1467.h264 and b/samples/h264SampleFrames/frame-1467.h264 differ diff --git a/samples/h264SampleFrames/frame-1468.h264 b/samples/h264SampleFrames/frame-1468.h264 index 507e27e971..3908e4b5bc 100644 Binary files a/samples/h264SampleFrames/frame-1468.h264 and b/samples/h264SampleFrames/frame-1468.h264 differ diff --git a/samples/h264SampleFrames/frame-1469.h264 b/samples/h264SampleFrames/frame-1469.h264 index e99c595d83..119fd1a8c4 100644 Binary files a/samples/h264SampleFrames/frame-1469.h264 and b/samples/h264SampleFrames/frame-1469.h264 differ diff --git a/samples/h264SampleFrames/frame-1470.h264 b/samples/h264SampleFrames/frame-1470.h264 index f4b02b41e0..2368fc37a0 100644 Binary files a/samples/h264SampleFrames/frame-1470.h264 and b/samples/h264SampleFrames/frame-1470.h264 differ diff --git a/samples/h264SampleFrames/frame-1471.h264 b/samples/h264SampleFrames/frame-1471.h264 index 504edabab1..0980853e3b 100644 Binary files a/samples/h264SampleFrames/frame-1471.h264 and b/samples/h264SampleFrames/frame-1471.h264 differ diff --git a/samples/h264SampleFrames/frame-1472.h264 b/samples/h264SampleFrames/frame-1472.h264 index b279ea02ab..b3623b7914 100644 Binary files a/samples/h264SampleFrames/frame-1472.h264 and b/samples/h264SampleFrames/frame-1472.h264 differ diff --git a/samples/h264SampleFrames/frame-1473.h264 b/samples/h264SampleFrames/frame-1473.h264 index c6dc94e720..ad8ffd5c92 100644 Binary files a/samples/h264SampleFrames/frame-1473.h264 and b/samples/h264SampleFrames/frame-1473.h264 differ diff --git a/samples/h264SampleFrames/frame-1474.h264 b/samples/h264SampleFrames/frame-1474.h264 index a8676ee705..4b1a701fe9 100644 Binary files a/samples/h264SampleFrames/frame-1474.h264 and b/samples/h264SampleFrames/frame-1474.h264 differ diff --git a/samples/h264SampleFrames/frame-1475.h264 b/samples/h264SampleFrames/frame-1475.h264 index f5bcdf240b..ba350045ed 100644 Binary files a/samples/h264SampleFrames/frame-1475.h264 and b/samples/h264SampleFrames/frame-1475.h264 differ diff --git a/samples/h264SampleFrames/frame-1476.h264 b/samples/h264SampleFrames/frame-1476.h264 index 9ebc9cd34e..6d13d7a84e 100644 Binary files a/samples/h264SampleFrames/frame-1476.h264 and b/samples/h264SampleFrames/frame-1476.h264 differ diff --git a/samples/h264SampleFrames/frame-1477.h264 b/samples/h264SampleFrames/frame-1477.h264 index 26da6e31b7..4915bb3c4e 100644 Binary files a/samples/h264SampleFrames/frame-1477.h264 and b/samples/h264SampleFrames/frame-1477.h264 differ diff --git a/samples/h264SampleFrames/frame-1478.h264 b/samples/h264SampleFrames/frame-1478.h264 index 8466c3df40..0fe23968b0 100644 Binary files a/samples/h264SampleFrames/frame-1478.h264 and b/samples/h264SampleFrames/frame-1478.h264 differ diff --git a/samples/h264SampleFrames/frame-1479.h264 b/samples/h264SampleFrames/frame-1479.h264 index 020a2f16d3..7c6bb688d6 100644 Binary files a/samples/h264SampleFrames/frame-1479.h264 and b/samples/h264SampleFrames/frame-1479.h264 differ diff --git a/samples/h264SampleFrames/frame-1480.h264 b/samples/h264SampleFrames/frame-1480.h264 index 7c9d24e67f..5ca1f82def 100644 Binary files a/samples/h264SampleFrames/frame-1480.h264 and b/samples/h264SampleFrames/frame-1480.h264 differ diff --git a/samples/h264SampleFrames/frame-1481.h264 b/samples/h264SampleFrames/frame-1481.h264 index ad123eaae9..39edbf1306 100644 Binary files a/samples/h264SampleFrames/frame-1481.h264 and b/samples/h264SampleFrames/frame-1481.h264 differ diff --git a/samples/h264SampleFrames/frame-1482.h264 b/samples/h264SampleFrames/frame-1482.h264 index e6ca9e9836..a74ec431d2 100644 Binary files a/samples/h264SampleFrames/frame-1482.h264 and b/samples/h264SampleFrames/frame-1482.h264 differ diff --git a/samples/h264SampleFrames/frame-1483.h264 b/samples/h264SampleFrames/frame-1483.h264 index e0273b1507..6ff5ca1e7f 100644 Binary files a/samples/h264SampleFrames/frame-1483.h264 and b/samples/h264SampleFrames/frame-1483.h264 differ diff --git a/samples/h264SampleFrames/frame-1484.h264 b/samples/h264SampleFrames/frame-1484.h264 index 7900fbd45b..74502b648c 100644 Binary files a/samples/h264SampleFrames/frame-1484.h264 and b/samples/h264SampleFrames/frame-1484.h264 differ diff --git a/samples/h264SampleFrames/frame-1485.h264 b/samples/h264SampleFrames/frame-1485.h264 index 66e73c91c5..61184655ef 100644 Binary files a/samples/h264SampleFrames/frame-1485.h264 and b/samples/h264SampleFrames/frame-1485.h264 differ diff --git a/samples/h264SampleFrames/frame-1486.h264 b/samples/h264SampleFrames/frame-1486.h264 index e240a5f5a6..ea9e3196f6 100644 Binary files a/samples/h264SampleFrames/frame-1486.h264 and b/samples/h264SampleFrames/frame-1486.h264 differ diff --git a/samples/h264SampleFrames/frame-1487.h264 b/samples/h264SampleFrames/frame-1487.h264 index 02e20df06e..95788e10a3 100644 Binary files a/samples/h264SampleFrames/frame-1487.h264 and b/samples/h264SampleFrames/frame-1487.h264 differ diff --git a/samples/h264SampleFrames/frame-1488.h264 b/samples/h264SampleFrames/frame-1488.h264 index 197590cd92..bc5b108382 100644 Binary files a/samples/h264SampleFrames/frame-1488.h264 and b/samples/h264SampleFrames/frame-1488.h264 differ diff --git a/samples/h264SampleFrames/frame-1489.h264 b/samples/h264SampleFrames/frame-1489.h264 index b99693ceb7..e66cdd2e5f 100644 Binary files a/samples/h264SampleFrames/frame-1489.h264 and b/samples/h264SampleFrames/frame-1489.h264 differ diff --git a/samples/h264SampleFrames/frame-1490.h264 b/samples/h264SampleFrames/frame-1490.h264 index 8d3085d9e3..684772b510 100644 Binary files a/samples/h264SampleFrames/frame-1490.h264 and b/samples/h264SampleFrames/frame-1490.h264 differ diff --git a/samples/h264SampleFrames/frame-1491.h264 b/samples/h264SampleFrames/frame-1491.h264 index 2d235b8b47..69a8fdb7a9 100644 Binary files a/samples/h264SampleFrames/frame-1491.h264 and b/samples/h264SampleFrames/frame-1491.h264 differ diff --git a/samples/h264SampleFrames/frame-1492.h264 b/samples/h264SampleFrames/frame-1492.h264 index 7616a7e767..f8830effd5 100644 Binary files a/samples/h264SampleFrames/frame-1492.h264 and b/samples/h264SampleFrames/frame-1492.h264 differ diff --git a/samples/h264SampleFrames/frame-1493.h264 b/samples/h264SampleFrames/frame-1493.h264 index 658e2f17a9..b53a1a67d8 100644 Binary files a/samples/h264SampleFrames/frame-1493.h264 and b/samples/h264SampleFrames/frame-1493.h264 differ diff --git a/samples/h264SampleFrames/frame-1494.h264 b/samples/h264SampleFrames/frame-1494.h264 index 87983b1683..d57e20382f 100644 Binary files a/samples/h264SampleFrames/frame-1494.h264 and b/samples/h264SampleFrames/frame-1494.h264 differ diff --git a/samples/h264SampleFrames/frame-1495.h264 b/samples/h264SampleFrames/frame-1495.h264 index fc830146c1..a3d73d3173 100644 Binary files a/samples/h264SampleFrames/frame-1495.h264 and b/samples/h264SampleFrames/frame-1495.h264 differ diff --git a/samples/h264SampleFrames/frame-1496.h264 b/samples/h264SampleFrames/frame-1496.h264 index 7af552cace..8a0cd0fc3c 100644 Binary files a/samples/h264SampleFrames/frame-1496.h264 and b/samples/h264SampleFrames/frame-1496.h264 differ diff --git a/samples/h264SampleFrames/frame-1497.h264 b/samples/h264SampleFrames/frame-1497.h264 index 0dbb886037..9e59e59568 100644 Binary files a/samples/h264SampleFrames/frame-1497.h264 and b/samples/h264SampleFrames/frame-1497.h264 differ diff --git a/samples/h264SampleFrames/frame-1498.h264 b/samples/h264SampleFrames/frame-1498.h264 index b1b1cb0ea0..bdf8a1397d 100644 Binary files a/samples/h264SampleFrames/frame-1498.h264 and b/samples/h264SampleFrames/frame-1498.h264 differ diff --git a/samples/h264SampleFrames/frame-1499.h264 b/samples/h264SampleFrames/frame-1499.h264 index 58d4f8020b..47d870b5e4 100644 Binary files a/samples/h264SampleFrames/frame-1499.h264 and b/samples/h264SampleFrames/frame-1499.h264 differ diff --git a/samples/h264SampleFrames/frame-1500.h264 b/samples/h264SampleFrames/frame-1500.h264 index 7f568e68af..0366072051 100644 Binary files a/samples/h264SampleFrames/frame-1500.h264 and b/samples/h264SampleFrames/frame-1500.h264 differ diff --git a/samples/kvsWebRTCClientMaster.c b/samples/kvsWebRTCClientMaster.c index a8a4348ec2..1913401f18 100644 --- a/samples/kvsWebRTCClientMaster.c +++ b/samples/kvsWebRTCClientMaster.c @@ -2,170 +2,90 @@ extern PSampleConfiguration gSampleConfiguration; -// #define VERBOSE - INT32 main(INT32 argc, CHAR* argv[]) { STATUS retStatus = STATUS_SUCCESS; UINT32 frameSize; PSampleConfiguration pSampleConfiguration = NULL; - SignalingClientMetrics signalingClientMetrics; PCHAR pChannelName; + SignalingClientMetrics signalingClientMetrics; signalingClientMetrics.version = SIGNALING_CLIENT_METRICS_CURRENT_VERSION; SET_INSTRUMENTED_ALLOCATORS(); + UINT32 logLevel = setLogLevel(); #ifndef _WIN32 signal(SIGINT, sigintHandler); #endif - // do trickleIce by default - printf("[KVS Master] Using trickleICE by default\n"); - #ifdef IOT_CORE_ENABLE_CREDENTIALS CHK_ERR((pChannelName = getenv(IOT_CORE_THING_NAME)) != NULL, STATUS_INVALID_OPERATION, "AWS_IOT_CORE_THING_NAME must be set"); #else pChannelName = argc > 1 ? argv[1] : SAMPLE_CHANNEL_NAME; #endif - retStatus = createSampleConfiguration(pChannelName, SIGNALING_CHANNEL_ROLE_TYPE_MASTER, TRUE, TRUE, &pSampleConfiguration); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Master] createSampleConfiguration(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } - - printf("[KVS Master] Created signaling channel %s\n", pChannelName); - - if (pSampleConfiguration->enableFileLogging) { - retStatus = - createFileLogger(FILE_LOGGING_BUFFER_SIZE, MAX_NUMBER_OF_LOG_FILES, (PCHAR) FILE_LOGGER_LOG_FILE_DIRECTORY_PATH, TRUE, TRUE, NULL); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Master] createFileLogger(): operation returned status code: 0x%08x \n", retStatus); - pSampleConfiguration->enableFileLogging = FALSE; - } - } + CHK_STATUS(createSampleConfiguration(pChannelName, SIGNALING_CHANNEL_ROLE_TYPE_MASTER, TRUE, TRUE, logLevel, &pSampleConfiguration)); // Set the audio and video handlers pSampleConfiguration->audioSource = sendAudioPackets; pSampleConfiguration->videoSource = sendVideoPackets; - pSampleConfiguration->receiveAudioVideoSource = sampleReceiveVideoFrame; + pSampleConfiguration->receiveAudioVideoSource = sampleReceiveAudioVideoFrame; pSampleConfiguration->onDataChannel = onDataChannel; pSampleConfiguration->mediaType = SAMPLE_STREAMING_AUDIO_VIDEO; - printf("[KVS Master] Finished setting audio and video handlers\n"); + DLOGI("[KVS Master] Finished setting handlers"); // Check if the samples are present - retStatus = readFrameFromDisk(NULL, &frameSize, "./h264SampleFrames/frame-0001.h264"); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Master] readFrameFromDisk(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } - printf("[KVS Master] Checked sample video frame availability....available\n"); + CHK_STATUS(readFrameFromDisk(NULL, &frameSize, "./h264SampleFrames/frame-0001.h264")); + DLOGI("[KVS Master] Checked sample video frame availability....available"); - retStatus = readFrameFromDisk(NULL, &frameSize, "./opusSampleFrames/sample-001.opus"); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Master] readFrameFromDisk(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } - printf("[KVS Master] Checked sample audio frame availability....available\n"); + CHK_STATUS(readFrameFromDisk(NULL, &frameSize, "./opusSampleFrames/sample-001.opus")); + DLOGI("[KVS Master] Checked sample audio frame availability....available"); // Initialize KVS WebRTC. This must be done before anything else, and must only be done once. - retStatus = initKvsWebRtc(); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Master] initKvsWebRtc(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } - printf("[KVS Master] KVS WebRTC initialization completed successfully\n"); - - pSampleConfiguration->signalingClientCallbacks.messageReceivedFn = signalingMessageReceived; + CHK_STATUS(initKvsWebRtc()); + DLOGI("[KVS Master] KVS WebRTC initialization completed successfully"); - strcpy(pSampleConfiguration->clientInfo.clientId, SAMPLE_MASTER_CLIENT_ID); - - retStatus = createSignalingClientSync(&pSampleConfiguration->clientInfo, &pSampleConfiguration->channelInfo, - &pSampleConfiguration->signalingClientCallbacks, pSampleConfiguration->pCredentialProvider, - &pSampleConfiguration->signalingClientHandle); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Master] createSignalingClientSync(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } - printf("[KVS Master] Signaling client created successfully\n"); - - // Enable the processing of the messages - retStatus = signalingClientFetchSync(pSampleConfiguration->signalingClientHandle); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Master] signalingClientFetchSync(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } - - retStatus = signalingClientConnectSync(pSampleConfiguration->signalingClientHandle); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Master] signalingClientConnectSync(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } - printf("[KVS Master] Signaling client connection to socket established\n"); - - gSampleConfiguration = pSampleConfiguration; - - printf("[KVS Master] Channel %s set up done \n", pChannelName); + CHK_STATUS(initSignaling(pSampleConfiguration, SAMPLE_MASTER_CLIENT_ID)); + DLOGI("[KVS Master] Channel %s set up done ", pChannelName); // Checking for termination - retStatus = sessionCleanupWait(pSampleConfiguration); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Master] sessionCleanupWait(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } - - printf("[KVS Master] Streaming session terminated\n"); + CHK_STATUS(sessionCleanupWait(pSampleConfiguration)); + DLOGI("[KVS Master] Streaming session terminated"); CleanUp: if (retStatus != STATUS_SUCCESS) { - printf("[KVS Master] Terminated with status code 0x%08x\n", retStatus); + DLOGE("[KVS Master] Terminated with status code 0x%08x", retStatus); } - printf("[KVS Master] Cleaning up....\n"); + DLOGI("[KVS Master] Cleaning up...."); if (pSampleConfiguration != NULL) { // Kick of the termination sequence ATOMIC_STORE_BOOL(&pSampleConfiguration->appTerminateFlag, TRUE); - if (IS_VALID_MUTEX_VALUE(pSampleConfiguration->sampleConfigurationObjLock)) { - MUTEX_LOCK(pSampleConfiguration->sampleConfigurationObjLock); - } - - // Cancel the media thread - if (pSampleConfiguration->mediaThreadStarted) { - DLOGD("Canceling media thread"); - THREAD_CANCEL(pSampleConfiguration->mediaSenderTid); - } - - if (IS_VALID_MUTEX_VALUE(pSampleConfiguration->sampleConfigurationObjLock)) { - MUTEX_UNLOCK(pSampleConfiguration->sampleConfigurationObjLock); - } - if (pSampleConfiguration->mediaSenderTid != INVALID_TID_VALUE) { THREAD_JOIN(pSampleConfiguration->mediaSenderTid, NULL); } - if (pSampleConfiguration->enableFileLogging) { - freeFileLogger(); - } retStatus = signalingClientGetMetrics(pSampleConfiguration->signalingClientHandle, &signalingClientMetrics); if (retStatus == STATUS_SUCCESS) { logSignalingClientStats(&signalingClientMetrics); } else { - printf("[KVS Master] signalingClientGetMetrics() operation returned status code: 0x%08x\n", retStatus); + DLOGE("[KVS Master] signalingClientGetMetrics() operation returned status code: 0x%08x", retStatus); } retStatus = freeSignalingClient(&pSampleConfiguration->signalingClientHandle); if (retStatus != STATUS_SUCCESS) { - printf("[KVS Master] freeSignalingClient(): operation returned status code: 0x%08x", retStatus); + DLOGE("[KVS Master] freeSignalingClient(): operation returned status code: 0x%08x", retStatus); } retStatus = freeSampleConfiguration(&pSampleConfiguration); if (retStatus != STATUS_SUCCESS) { - printf("[KVS Master] freeSampleConfiguration(): operation returned status code: 0x%08x", retStatus); + DLOGE("[KVS Master] freeSampleConfiguration(): operation returned status code: 0x%08x", retStatus); } } - printf("[KVS Master] Cleanup done\n"); + DLOGI("[KVS Master] Cleanup done"); + CHK_LOG_ERR(retStatus); RESET_INSTRUMENTED_ALLOCATORS(); @@ -181,21 +101,10 @@ STATUS readFrameFromDisk(PBYTE pFrame, PUINT32 pSize, PCHAR frameFilePath) { STATUS retStatus = STATUS_SUCCESS; UINT64 size = 0; - - if (pSize == NULL) { - printf("[KVS Master] readFrameFromDisk(): operation returned status code: 0x%08x \n", STATUS_NULL_ARG); - goto CleanUp; - } - + CHK_ERR(pSize != NULL, STATUS_NULL_ARG, "[KVS Master] Invalid file size"); size = *pSize; - // Get the size and read into frame - retStatus = readFile(frameFilePath, TRUE, pFrame, &size); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Master] readFile(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } - + CHK_STATUS(readFile(frameFilePath, TRUE, pFrame, &size)); CleanUp: if (pSize != NULL) { @@ -217,11 +126,7 @@ PVOID sendVideoPackets(PVOID args) UINT32 i; UINT64 startTime, lastFrameTime, elapsed; MEMSET(&encoderStats, 0x00, SIZEOF(RtcEncoderStats)); - - if (pSampleConfiguration == NULL) { - printf("[KVS Master] sendVideoPackets(): operation returned status code: 0x%08x \n", STATUS_NULL_ARG); - goto CleanUp; - } + CHK_ERR(pSampleConfiguration != NULL, STATUS_NULL_ARG, "[KVS Master] Streaming session is NULL"); frame.presentationTs = 0; startTime = GETTIME(); @@ -229,51 +134,39 @@ PVOID sendVideoPackets(PVOID args) while (!ATOMIC_LOAD_BOOL(&pSampleConfiguration->appTerminateFlag)) { fileIndex = fileIndex % NUMBER_OF_H264_FRAME_FILES + 1; - snprintf(filePath, MAX_PATH_LEN, "./h264SampleFrames/frame-%04d.h264", fileIndex); + SNPRINTF(filePath, MAX_PATH_LEN, "./h264SampleFrames/frame-%04d.h264", fileIndex); - retStatus = readFrameFromDisk(NULL, &frameSize, filePath); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Master] readFrameFromDisk(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } + CHK_STATUS(readFrameFromDisk(NULL, &frameSize, filePath)); // Re-alloc if needed if (frameSize > pSampleConfiguration->videoBufferSize) { pSampleConfiguration->pVideoFrameBuffer = (PBYTE) MEMREALLOC(pSampleConfiguration->pVideoFrameBuffer, frameSize); - if (pSampleConfiguration->pVideoFrameBuffer == NULL) { - printf("[KVS Master] Video frame Buffer reallocation failed...%s (code %d)\n", strerror(errno), errno); - printf("[KVS Master] MEMREALLOC(): operation returned status code: 0x%08x \n", STATUS_NOT_ENOUGH_MEMORY); - goto CleanUp; - } - + CHK_ERR(pSampleConfiguration->pVideoFrameBuffer != NULL, STATUS_NOT_ENOUGH_MEMORY, "[KVS Master] Failed to allocate video frame buffer"); pSampleConfiguration->videoBufferSize = frameSize; } frame.frameData = pSampleConfiguration->pVideoFrameBuffer; frame.size = frameSize; - retStatus = readFrameFromDisk(frame.frameData, &frameSize, filePath); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Master] readFrameFromDisk(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } + CHK_STATUS(readFrameFromDisk(frame.frameData, &frameSize, filePath)); // based on bitrate of samples/h264SampleFrames/frame-* encoderStats.width = 640; encoderStats.height = 480; encoderStats.targetBitrate = 262000; frame.presentationTs += SAMPLE_VIDEO_FRAME_DURATION; - MUTEX_LOCK(pSampleConfiguration->streamingSessionListReadLock); for (i = 0; i < pSampleConfiguration->streamingSessionCount; ++i) { status = writeFrame(pSampleConfiguration->sampleStreamingSessionList[i]->pVideoRtcRtpTransceiver, &frame); + if (pSampleConfiguration->sampleStreamingSessionList[i]->firstFrame && status == STATUS_SUCCESS) { + PROFILE_WITH_START_TIME(pSampleConfiguration->sampleStreamingSessionList[i]->offerReceiveTime, "Time to first frame"); + pSampleConfiguration->sampleStreamingSessionList[i]->firstFrame = FALSE; + } encoderStats.encodeTimeMsec = 4; // update encode time to an arbitrary number to demonstrate stats update updateEncoderStats(pSampleConfiguration->sampleStreamingSessionList[i]->pVideoRtcRtpTransceiver, &encoderStats); if (status != STATUS_SRTP_NOT_READY_YET) { if (status != STATUS_SUCCESS) { -#ifdef VERBOSE - printf("writeFrame() failed with 0x%08x\n", status); -#endif + DLOGV("writeFrame() failed with 0x%08x", status); } } } @@ -289,7 +182,7 @@ PVOID sendVideoPackets(PVOID args) } CleanUp: - + DLOGI("[KVS Master] Closing video thread"); CHK_LOG_ERR(retStatus); return (PVOID) (ULONG_PTR) retStatus; @@ -305,41 +198,26 @@ PVOID sendAudioPackets(PVOID args) UINT32 i; STATUS status; - if (pSampleConfiguration == NULL) { - printf("[KVS Master] sendAudioPackets(): operation returned status code: 0x%08x \n", STATUS_NULL_ARG); - goto CleanUp; - } - + CHK_ERR(pSampleConfiguration != NULL, STATUS_NULL_ARG, "[KVS Master] Streaming session is NULL"); frame.presentationTs = 0; while (!ATOMIC_LOAD_BOOL(&pSampleConfiguration->appTerminateFlag)) { fileIndex = fileIndex % NUMBER_OF_OPUS_FRAME_FILES + 1; - snprintf(filePath, MAX_PATH_LEN, "./opusSampleFrames/sample-%03d.opus", fileIndex); + SNPRINTF(filePath, MAX_PATH_LEN, "./opusSampleFrames/sample-%03d.opus", fileIndex); - retStatus = readFrameFromDisk(NULL, &frameSize, filePath); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Master] readFrameFromDisk(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } + CHK_STATUS(readFrameFromDisk(NULL, &frameSize, filePath)); // Re-alloc if needed if (frameSize > pSampleConfiguration->audioBufferSize) { pSampleConfiguration->pAudioFrameBuffer = (UINT8*) MEMREALLOC(pSampleConfiguration->pAudioFrameBuffer, frameSize); - if (pSampleConfiguration->pAudioFrameBuffer == NULL) { - printf("[KVS Master] Audio frame Buffer reallocation failed...%s (code %d)\n", strerror(errno), errno); - printf("[KVS Master] MEMREALLOC(): operation returned status code: 0x%08x \n", STATUS_NOT_ENOUGH_MEMORY); - goto CleanUp; - } + CHK_ERR(pSampleConfiguration->pAudioFrameBuffer != NULL, STATUS_NOT_ENOUGH_MEMORY, "[KVS Master] Failed to allocate audio frame buffer"); + pSampleConfiguration->audioBufferSize = frameSize; } frame.frameData = pSampleConfiguration->pAudioFrameBuffer; frame.size = frameSize; - retStatus = readFrameFromDisk(frame.frameData, &frameSize, filePath); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Master] readFrameFromDisk(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } + CHK_STATUS(readFrameFromDisk(frame.frameData, &frameSize, filePath)); frame.presentationTs += SAMPLE_AUDIO_FRAME_DURATION; @@ -348,9 +226,10 @@ PVOID sendAudioPackets(PVOID args) status = writeFrame(pSampleConfiguration->sampleStreamingSessionList[i]->pAudioRtcRtpTransceiver, &frame); if (status != STATUS_SRTP_NOT_READY_YET) { if (status != STATUS_SUCCESS) { -#ifdef VERBOSE - printf("writeFrame() failed with 0x%08x\n", status); -#endif + DLOGV("writeFrame() failed with 0x%08x", status); + } else if (pSampleConfiguration->sampleStreamingSessionList[i]->firstFrame && status == STATUS_SUCCESS) { + PROFILE_WITH_START_TIME(pSampleConfiguration->sampleStreamingSessionList[i]->offerReceiveTime, "Time to first frame"); + pSampleConfiguration->sampleStreamingSessionList[i]->firstFrame = FALSE; } } } @@ -359,24 +238,17 @@ PVOID sendAudioPackets(PVOID args) } CleanUp: - + DLOGI("[KVS Master] closing audio thread"); return (PVOID) (ULONG_PTR) retStatus; } -PVOID sampleReceiveVideoFrame(PVOID args) +PVOID sampleReceiveAudioVideoFrame(PVOID args) { STATUS retStatus = STATUS_SUCCESS; PSampleStreamingSession pSampleStreamingSession = (PSampleStreamingSession) args; - if (pSampleStreamingSession == NULL) { - printf("[KVS Master] sampleReceiveVideoFrame(): operation returned status code: 0x%08x \n", STATUS_NULL_ARG); - goto CleanUp; - } - - retStatus = transceiverOnFrame(pSampleStreamingSession->pVideoRtcRtpTransceiver, (UINT64) pSampleStreamingSession, sampleFrameHandler); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Master] transceiverOnFrame(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } + CHK_ERR(pSampleStreamingSession != NULL, STATUS_NULL_ARG, "[KVS Master] Streaming session is NULL"); + CHK_STATUS(transceiverOnFrame(pSampleStreamingSession->pVideoRtcRtpTransceiver, (UINT64) pSampleStreamingSession, sampleVideoFrameHandler)); + CHK_STATUS(transceiverOnFrame(pSampleStreamingSession->pAudioRtcRtpTransceiver, (UINT64) pSampleStreamingSession, sampleAudioFrameHandler)); CleanUp: diff --git a/samples/kvsWebRTCClientViewer.c b/samples/kvsWebRTCClientViewer.c index 218f920426..7ed9a3c4ba 100644 --- a/samples/kvsWebRTCClientViewer.c +++ b/samples/kvsWebRTCClientViewer.c @@ -12,7 +12,7 @@ VOID dataChannelOnMessageCallback(UINT64 customData, PRtcDataChannel pDataChanne if (isBinary) { DLOGI("DataChannel Binary Message"); } else { - DLOGI("DataChannel String Message: %.*s\n", pMessageLen, pMessage); + DLOGI("DataChannel String Message: %.*s", pMessageLen, pMessage); } } @@ -20,13 +20,13 @@ VOID dataChannelOnMessageCallback(UINT64 customData, PRtcDataChannel pDataChanne VOID dataChannelOnOpenCallback(UINT64 customData, PRtcDataChannel pDataChannel) { STATUS retStatus = STATUS_SUCCESS; - DLOGI("New DataChannel has been opened %s \n", pDataChannel->name); + DLOGI("New DataChannel has been opened %s ", pDataChannel->name); dataChannelOnMessage(pDataChannel, customData, dataChannelOnMessageCallback); ATOMIC_INCREMENT((PSIZE_T) customData); // Sending first message to the master over the data channel retStatus = dataChannelSend(pDataChannel, FALSE, (PBYTE) VIEWER_DATA_CHANNEL_MESSAGE, STRLEN(VIEWER_DATA_CHANNEL_MESSAGE)); if (retStatus != STATUS_SUCCESS) { - DLOGI("[KVS Viewer] dataChannelSend(): operation returned status code: 0x%08x \n", retStatus); + DLOGI("[KVS Viewer] dataChannelSend(): operation returned status code: 0x%08x ", retStatus); } } #endif @@ -41,109 +41,50 @@ INT32 main(INT32 argc, CHAR* argv[]) PSampleStreamingSession pSampleStreamingSession = NULL; BOOL locked = FALSE; PCHAR pChannelName; + CHAR clientId[256]; SET_INSTRUMENTED_ALLOCATORS(); + UINT32 logLevel = setLogLevel(); #ifndef _WIN32 signal(SIGINT, sigintHandler); #endif - // do trickle-ice by default - printf("[KVS Master] Using trickleICE by default\n"); - #ifdef IOT_CORE_ENABLE_CREDENTIALS CHK_ERR((pChannelName = getenv(IOT_CORE_THING_NAME)) != NULL, STATUS_INVALID_OPERATION, "AWS_IOT_CORE_THING_NAME must be set"); #else pChannelName = argc > 1 ? argv[1] : SAMPLE_CHANNEL_NAME; #endif - retStatus = createSampleConfiguration(pChannelName, SIGNALING_CHANNEL_ROLE_TYPE_VIEWER, TRUE, TRUE, &pSampleConfiguration); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Viewer] createSampleConfiguration(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } - gSampleConfiguration = pSampleConfiguration; - - printf("[KVS Viewer] Created signaling channel %s\n", pChannelName); - - if (pSampleConfiguration->enableFileLogging) { - retStatus = - createFileLogger(FILE_LOGGING_BUFFER_SIZE, MAX_NUMBER_OF_LOG_FILES, (PCHAR) FILE_LOGGER_LOG_FILE_DIRECTORY_PATH, TRUE, TRUE, NULL); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Master] createFileLogger(): operation returned status code: 0x%08x \n", retStatus); - pSampleConfiguration->enableFileLogging = FALSE; - } - } + CHK_STATUS(createSampleConfiguration(pChannelName, SIGNALING_CHANNEL_ROLE_TYPE_VIEWER, TRUE, TRUE, logLevel, &pSampleConfiguration)); // Initialize KVS WebRTC. This must be done before anything else, and must only be done once. - retStatus = initKvsWebRtc(); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Viewer] initKvsWebRtc(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } - - printf("[KVS Viewer] KVS WebRTC initialization completed successfully\n"); - - pSampleConfiguration->signalingClientCallbacks.messageReceivedFn = signalingMessageReceived; + CHK_STATUS(initKvsWebRtc()); + DLOGI("[KVS Viewer] KVS WebRTC initialization completed successfully"); - sprintf(pSampleConfiguration->clientInfo.clientId, "%s_%u", SAMPLE_VIEWER_CLIENT_ID, RAND() % MAX_UINT32); - - retStatus = createSignalingClientSync(&pSampleConfiguration->clientInfo, &pSampleConfiguration->channelInfo, - &pSampleConfiguration->signalingClientCallbacks, pSampleConfiguration->pCredentialProvider, - &pSampleConfiguration->signalingClientHandle); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Viewer] createSignalingClientSync(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } - - printf("[KVS Viewer] Signaling client created successfully\n"); - - // Enable the processing of the messages - retStatus = signalingClientFetchSync(pSampleConfiguration->signalingClientHandle); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Master] signalingClientFetchSync(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } - - retStatus = signalingClientConnectSync(pSampleConfiguration->signalingClientHandle); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Viewer] signalingClientConnectSync(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } - - printf("[KVS Viewer] Signaling client connection to socket established\n"); + SPRINTF(clientId, "%s_%u", SAMPLE_VIEWER_CLIENT_ID, RAND() % MAX_UINT32); + CHK_STATUS(initSignaling(pSampleConfiguration, clientId)); + DLOGI("[KVS Viewer] Signaling client connection established"); // Initialize streaming session MUTEX_LOCK(pSampleConfiguration->sampleConfigurationObjLock); locked = TRUE; - retStatus = createSampleStreamingSession(pSampleConfiguration, NULL, FALSE, &pSampleStreamingSession); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Viewer] createSampleStreamingSession(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } - printf("[KVS Viewer] Creating streaming session...completed\n"); + CHK_STATUS(createSampleStreamingSession(pSampleConfiguration, NULL, FALSE, &pSampleStreamingSession)); + DLOGI("[KVS Viewer] Creating streaming session...completed"); pSampleConfiguration->sampleStreamingSessionList[pSampleConfiguration->streamingSessionCount++] = pSampleStreamingSession; MUTEX_UNLOCK(pSampleConfiguration->sampleConfigurationObjLock); locked = FALSE; - memset(&offerSessionDescriptionInit, 0x00, SIZEOF(RtcSessionDescriptionInit)); + MEMSET(&offerSessionDescriptionInit, 0x00, SIZEOF(RtcSessionDescriptionInit)); - retStatus = setLocalDescription(pSampleStreamingSession->pPeerConnection, &offerSessionDescriptionInit); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Viewer] setLocalDescription(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } - printf("[KVS Viewer] Completed setting local description\n"); + CHK_STATUS(setLocalDescription(pSampleStreamingSession->pPeerConnection, &offerSessionDescriptionInit)); + DLOGI("[KVS Viewer] Completed setting local description"); - retStatus = transceiverOnFrame(pSampleStreamingSession->pAudioRtcRtpTransceiver, (UINT64) pSampleStreamingSession, sampleFrameHandler); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Viewer] transceiverOnFrame(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } + CHK_STATUS(transceiverOnFrame(pSampleStreamingSession->pAudioRtcRtpTransceiver, (UINT64) pSampleStreamingSession, sampleAudioFrameHandler)); if (!pSampleConfiguration->trickleIce) { - printf("[KVS Viewer] Non trickle ice. Wait for Candidate collection to complete\n"); + DLOGI("[KVS Viewer] Non trickle ice. Wait for Candidate collection to complete"); MUTEX_LOCK(pSampleConfiguration->sampleConfigurationObjLock); locked = TRUE; @@ -156,35 +97,22 @@ INT32 main(INT32 argc, CHAR* argv[]) MUTEX_UNLOCK(pSampleConfiguration->sampleConfigurationObjLock); locked = FALSE; - printf("[KVS Viewer] Candidate collection completed\n"); + DLOGI("[KVS Viewer] Candidate collection completed"); } - retStatus = createOffer(pSampleStreamingSession->pPeerConnection, &offerSessionDescriptionInit); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Viewer] createOffer(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } - printf("[KVS Viewer] Offer creation successful\n"); + CHK_STATUS(createOffer(pSampleStreamingSession->pPeerConnection, &offerSessionDescriptionInit)); + DLOGI("[KVS Viewer] Offer creation successful"); + + DLOGI("[KVS Viewer] Generating JSON of session description...."); + CHK_STATUS(serializeSessionDescriptionInit(&offerSessionDescriptionInit, NULL, &buffLen)); - printf("[KVS Viewer] Generating JSON of session description...."); - retStatus = serializeSessionDescriptionInit(&offerSessionDescriptionInit, NULL, &buffLen); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Viewer] serializeSessionDescriptionInit(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } if (buffLen >= SIZEOF(message.payload)) { - printf("[KVS Viewer] serializeSessionDescriptionInit(): operation returned status code: 0x%08x \n", STATUS_INVALID_OPERATION); + DLOGE("[KVS Viewer] serializeSessionDescriptionInit(): operation returned status code: 0x%08x ", STATUS_INVALID_OPERATION); retStatus = STATUS_INVALID_OPERATION; goto CleanUp; } - retStatus = serializeSessionDescriptionInit(&offerSessionDescriptionInit, message.payload, &buffLen); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Viewer] serializeSessionDescriptionInit(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } - - printf("Completed\n"); + CHK_STATUS(serializeSessionDescriptionInit(&offerSessionDescriptionInit, message.payload, &buffLen)); message.version = SIGNALING_MESSAGE_CURRENT_VERSION; message.messageType = SIGNALING_MESSAGE_TYPE_OFFER; @@ -192,32 +120,19 @@ INT32 main(INT32 argc, CHAR* argv[]) message.payloadLen = (buffLen / SIZEOF(CHAR)) - 1; message.correlationId[0] = '\0'; - retStatus = signalingClientSendMessageSync(pSampleConfiguration->signalingClientHandle, &message); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Viewer] signalingClientSendMessageSync(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } - + CHK_STATUS(signalingClientSendMessageSync(pSampleConfiguration->signalingClientHandle, &message)); #ifdef ENABLE_DATA_CHANNEL PRtcDataChannel pDataChannel = NULL; PRtcPeerConnection pPeerConnection = pSampleStreamingSession->pPeerConnection; SIZE_T datachannelLocalOpenCount = 0; // Creating a new datachannel on the peer connection of the existing sample streaming session - retStatus = createDataChannel(pPeerConnection, pChannelName, NULL, &pDataChannel); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Viewer] createDataChannel(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } - printf("[KVS Viewer] Creating data channel...completed\n"); + CHK_STATUS(createDataChannel(pPeerConnection, pChannelName, NULL, &pDataChannel)); + DLOGI("[KVS Viewer] Creating data channel...completed"); // Setting a callback for when the data channel is open - retStatus = dataChannelOnOpen(pDataChannel, (UINT64) &datachannelLocalOpenCount, dataChannelOnOpenCallback); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Viewer] dataChannelOnOpen(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } - printf("[KVS Viewer] Data Channel open now...\n"); + CHK_STATUS(dataChannelOnOpen(pDataChannel, (UINT64) &datachannelLocalOpenCount, dataChannelOnOpenCallback)); + DLOGI("[KVS Viewer] Data Channel open now..."); #endif // Block until interrupted @@ -228,10 +143,10 @@ INT32 main(INT32 argc, CHAR* argv[]) CleanUp: if (retStatus != STATUS_SUCCESS) { - printf("[KVS Viewer] Terminated with status code 0x%08x", retStatus); + DLOGE("[KVS Viewer] Terminated with status code 0x%08x", retStatus); } - printf("[KVS Viewer] Cleaning up....\n"); + DLOGI("[KVS Viewer] Cleaning up...."); if (locked) { MUTEX_UNLOCK(pSampleConfiguration->sampleConfigurationObjLock); @@ -243,15 +158,15 @@ INT32 main(INT32 argc, CHAR* argv[]) if (pSampleConfiguration != NULL) { retStatus = freeSignalingClient(&pSampleConfiguration->signalingClientHandle); if (retStatus != STATUS_SUCCESS) { - printf("[KVS Master] freeSignalingClient(): operation returned status code: 0x%08x \n", retStatus); + DLOGE("[KVS Master] freeSignalingClient(): operation returned status code: 0x%08x ", retStatus); } retStatus = freeSampleConfiguration(&pSampleConfiguration); if (retStatus != STATUS_SUCCESS) { - printf("[KVS Master] freeSampleConfiguration(): operation returned status code: 0x%08x \n", retStatus); + DLOGE("[KVS Master] freeSampleConfiguration(): operation returned status code: 0x%08x ", retStatus); } } - printf("[KVS Viewer] Cleanup done\n"); + DLOGI("[KVS Viewer] Cleanup done"); RESET_INSTRUMENTED_ALLOCATORS(); diff --git a/samples/kvsWebRTCClientMasterGstreamerSample.c b/samples/kvsWebrtcClientMasterGstSample.c similarity index 50% rename from samples/kvsWebRTCClientMasterGstreamerSample.c rename to samples/kvsWebrtcClientMasterGstSample.c index 185859bd57..1fac4cd78a 100644 --- a/samples/kvsWebRTCClientMasterGstreamerSample.c +++ b/samples/kvsWebrtcClientMasterGstSample.c @@ -9,6 +9,7 @@ extern PSampleConfiguration gSampleConfiguration; GstFlowReturn on_new_sample(GstElement* sink, gpointer data, UINT64 trackid) { GstBuffer* buffer; + STATUS retStatus = STATUS_SUCCESS; BOOL isDroppable, delta; GstFlowReturn ret = GST_FLOW_OK; GstSample* sample = NULL; @@ -22,10 +23,7 @@ GstFlowReturn on_new_sample(GstElement* sink, gpointer data, UINT64 trackid) PRtcRtpTransceiver pRtcRtpTransceiver = NULL; UINT32 i; - if (pSampleConfiguration == NULL) { - printf("[KVS GStreamer Master] on_new_sample(): operation returned status code: 0x%08x \n", STATUS_NULL_ARG); - goto CleanUp; - } + CHK_ERR(pSampleConfiguration != NULL, STATUS_NULL_ARG, "NULL sample configuration"); info.data = NULL; sample = gst_app_sink_pull_sample(GST_APP_SINK(sink)); @@ -46,11 +44,11 @@ GstFlowReturn on_new_sample(GstElement* sink, gpointer data, UINT64 trackid) segment = gst_sample_get_segment(sample); buf_pts = gst_segment_to_running_time(segment, GST_FORMAT_TIME, buffer->pts); if (!GST_CLOCK_TIME_IS_VALID(buf_pts)) { - printf("[KVS GStreamer Master] Frame contains invalid PTS dropping the frame. \n"); + DLOGE("[KVS GStreamer Master] Frame contains invalid PTS dropping the frame"); } if (!(gst_buffer_map(buffer, &info, GST_MAP_READ))) { - printf("[KVS GStreamer Master] on_new_sample(): Gst buffer mapping failed\n"); + DLOGE("[KVS GStreamer Master] on_new_sample(): Gst buffer mapping failed"); goto CleanUp; } @@ -75,13 +73,16 @@ GstFlowReturn on_new_sample(GstElement* sink, gpointer data, UINT64 trackid) pRtcRtpTransceiver = pSampleStreamingSession->pVideoRtcRtpTransceiver; frame.presentationTs = pSampleStreamingSession->videoTimestamp; frame.decodingTs = frame.presentationTs; - pSampleStreamingSession->videoTimestamp += SAMPLE_VIDEO_FRAME_DURATION; // assume video fps is 30 + pSampleStreamingSession->videoTimestamp += SAMPLE_VIDEO_FRAME_DURATION; // assume video fps is 25 } status = writeFrame(pRtcRtpTransceiver, &frame); if (status != STATUS_SRTP_NOT_READY_YET && status != STATUS_SUCCESS) { #ifdef VERBOSE - printf("writeFrame() failed with 0x%08x", status); + DLOGE("writeFrame() failed with 0x%08x", status); #endif + } else if (status == STATUS_SUCCESS && pSampleStreamingSession->firstFrame) { + PROFILE_WITH_START_TIME(pSampleStreamingSession->offerReceiveTime, "Time to first frame"); + pSampleStreamingSession->firstFrame = FALSE; } } MUTEX_UNLOCK(pSampleConfiguration->streamingSessionListReadLock); @@ -123,10 +124,7 @@ PVOID sendGstreamerAudioVideo(PVOID args) GError* error = NULL; PSampleConfiguration pSampleConfiguration = (PSampleConfiguration) args; - if (pSampleConfiguration == NULL) { - printf("[KVS GStreamer Master] sendGstreamerAudioVideo(): operation returned status code: 0x%08x \n", STATUS_NULL_ARG); - goto CleanUp; - } + CHK_ERR(pSampleConfiguration != NULL, STATUS_NULL_ARG, "[KVS Gstreamer Master] Streaming session is NULL"); /** * Use x264enc as its available on mac, pi, ubuntu and windows @@ -140,52 +138,106 @@ PVOID sendGstreamerAudioVideo(PVOID args) * videotestsrc is-live=TRUE ! video/x-raw,width=1280,height=720,framerate=30/1 ! * vp8enc error-resilient=partitions keyframe-max-dist=10 auto-alt-ref=true cpu-used=5 deadline=1 ! * appsink sync=TRUE emit-signals=TRUE name=appsink-video + * + * Raspberry Pi Hardware Encode Example + * "v4l2src device=\"/dev/video0\" ! queue ! v4l2convert ! " + * "video/x-raw,format=I420,width=640,height=480,framerate=30/1 ! " + * "v4l2h264enc ! " + * "h264parse ! " + * "video/x-h264,stream-format=byte-stream,alignment=au,width=640,height=480,framerate=30/1,profile=baseline,level=(string)4 ! " + * "appsink sync=TRUE emit-signals=TRUE name=appsink-video" */ + CHAR rtspPipeLineBuffer[RTSP_PIPELINE_MAX_CHAR_COUNT]; + switch (pSampleConfiguration->mediaType) { case SAMPLE_STREAMING_VIDEO_ONLY: - if (pSampleConfiguration->useTestSrc) { - pipeline = gst_parse_launch( - "videotestsrc is-live=TRUE ! queue ! videoconvert ! video/x-raw,width=1280,height=720,framerate=30/1 ! " - "x264enc bframes=0 speed-preset=veryfast bitrate=512 byte-stream=TRUE tune=zerolatency ! " - "video/x-h264,stream-format=byte-stream,alignment=au,profile=baseline ! appsink sync=TRUE emit-signals=TRUE name=appsink-video", - &error); - } else { - pipeline = gst_parse_launch( - "autovideosrc ! queue ! videoconvert ! video/x-raw,width=1280,height=720,framerate=[30/1,10000000/333333] ! " - "x264enc bframes=0 speed-preset=veryfast bitrate=512 byte-stream=TRUE tune=zerolatency ! " - "video/x-h264,stream-format=byte-stream,alignment=au,profile=baseline ! appsink sync=TRUE emit-signals=TRUE name=appsink-video", - &error); + switch (pSampleConfiguration->srcType) { + case TEST_SOURCE: { + pipeline = + gst_parse_launch("videotestsrc is-live=TRUE ! queue ! videoconvert ! video/x-raw,width=1280,height=720,framerate=25/1 ! " + "x264enc bframes=0 speed-preset=veryfast bitrate=512 byte-stream=TRUE tune=zerolatency ! " + "video/x-h264,stream-format=byte-stream,alignment=au,profile=baseline ! appsink sync=TRUE emit-signals=TRUE " + "name=appsink-video", + &error); + break; + } + case DEVICE_SOURCE: { + pipeline = gst_parse_launch("autovideosrc ! queue ! videoconvert ! video/x-raw,width=1280,height=720,framerate=25/1 ! " + "x264enc bframes=0 speed-preset=veryfast bitrate=512 byte-stream=TRUE tune=zerolatency ! " + "video/x-h264,stream-format=byte-stream,alignment=au,profile=baseline ! appsink sync=TRUE " + "emit-signals=TRUE name=appsink-video", + &error); + break; + } + case RTSP_SOURCE: { + UINT16 stringOutcome = snprintf(rtspPipeLineBuffer, RTSP_PIPELINE_MAX_CHAR_COUNT, + "uridecodebin uri=%s ! " + "videoconvert ! " + "x264enc bframes=0 speed-preset=veryfast bitrate=512 byte-stream=TRUE tune=zerolatency ! " + "video/x-h264,stream-format=byte-stream,alignment=au,profile=baseline ! queue ! " + "appsink sync=TRUE emit-signals=TRUE name=appsink-video ", + pSampleConfiguration->rtspUri); + + if (stringOutcome > RTSP_PIPELINE_MAX_CHAR_COUNT) { + printf("[KVS GStreamer Master] ERROR: rtsp uri entered exceeds maximum allowed length set by RTSP_PIPELINE_MAX_CHAR_COUNT\n"); + goto CleanUp; + } + pipeline = gst_parse_launch(rtspPipeLineBuffer, &error); + + break; + } } break; case SAMPLE_STREAMING_AUDIO_VIDEO: - if (pSampleConfiguration->useTestSrc) { - pipeline = gst_parse_launch("videotestsrc is-live=TRUE ! queue ! videoconvert ! video/x-raw,width=1280,height=720,framerate=30/1 ! " - "x264enc bframes=0 speed-preset=veryfast bitrate=512 byte-stream=TRUE tune=zerolatency ! " - "video/x-h264,stream-format=byte-stream,alignment=au,profile=baseline ! appsink sync=TRUE " - "emit-signals=TRUE name=appsink-video audiotestsrc is-live=TRUE ! " - "queue leaky=2 max-size-buffers=400 ! audioconvert ! audioresample ! opusenc ! " - "audio/x-opus,rate=48000,channels=2 ! appsink sync=TRUE emit-signals=TRUE name=appsink-audio", - &error); - } else { - pipeline = - gst_parse_launch("autovideosrc ! queue ! videoconvert ! video/x-raw,width=1280,height=720,framerate=[30/1,10000000/333333] ! " - "x264enc bframes=0 speed-preset=veryfast bitrate=512 byte-stream=TRUE tune=zerolatency ! " - "video/x-h264,stream-format=byte-stream,alignment=au,profile=baseline ! appsink sync=TRUE emit-signals=TRUE " - "name=appsink-video autoaudiosrc ! " - "queue leaky=2 max-size-buffers=400 ! audioconvert ! audioresample ! opusenc ! " - "audio/x-opus,rate=48000,channels=2 ! appsink sync=TRUE emit-signals=TRUE name=appsink-audio", - &error); + switch (pSampleConfiguration->srcType) { + case TEST_SOURCE: { + pipeline = + gst_parse_launch("videotestsrc is-live=TRUE ! queue ! videoconvert ! video/x-raw,width=1280,height=720,framerate=25/1 ! " + "x264enc bframes=0 speed-preset=veryfast bitrate=512 byte-stream=TRUE tune=zerolatency ! " + "video/x-h264,stream-format=byte-stream,alignment=au,profile=baseline ! appsink sync=TRUE " + "emit-signals=TRUE name=appsink-video audiotestsrc is-live=TRUE ! " + "queue leaky=2 max-size-buffers=400 ! audioconvert ! audioresample ! opusenc ! " + "audio/x-opus,rate=48000,channels=2 ! appsink sync=TRUE emit-signals=TRUE name=appsink-audio", + &error); + break; + } + case DEVICE_SOURCE: { + pipeline = + gst_parse_launch("autovideosrc ! queue ! videoconvert ! video/x-raw,width=1280,height=720,framerate=25/1 ! " + "x264enc bframes=0 speed-preset=veryfast bitrate=512 byte-stream=TRUE tune=zerolatency ! " + "video/x-h264,stream-format=byte-stream,alignment=au,profile=baseline ! appsink sync=TRUE emit-signals=TRUE " + "name=appsink-video autoaudiosrc ! " + "queue leaky=2 max-size-buffers=400 ! audioconvert ! audioresample ! opusenc ! " + "audio/x-opus,rate=48000,channels=2 ! appsink sync=TRUE emit-signals=TRUE name=appsink-audio", + &error); + break; + } + case RTSP_SOURCE: { + UINT16 stringOutcome = snprintf(rtspPipeLineBuffer, RTSP_PIPELINE_MAX_CHAR_COUNT, + "uridecodebin uri=%s name=src ! videoconvert ! " + "x264enc bframes=0 speed-preset=veryfast bitrate=512 byte-stream=TRUE tune=zerolatency ! " + "video/x-h264,stream-format=byte-stream,alignment=au,profile=baseline ! queue ! " + "appsink sync=TRUE emit-signals=TRUE name=appsink-video " + "src. ! audioconvert ! " + "audioresample ! opusenc ! audio/x-opus,rate=48000,channels=2 ! queue ! " + "appsink sync=TRUE emit-signals=TRUE name=appsink-audio", + pSampleConfiguration->rtspUri); + + if (stringOutcome > RTSP_PIPELINE_MAX_CHAR_COUNT) { + printf("[KVS GStreamer Master] ERROR: rtsp uri entered exceeds maximum allowed length set by RTSP_PIPELINE_MAX_CHAR_COUNT\n"); + goto CleanUp; + } + pipeline = gst_parse_launch(rtspPipeLineBuffer, &error); + + break; + } } break; } - if (pipeline == NULL) { - printf("[KVS GStreamer Master] sendGstreamerAudioVideo(): Failed to launch gstreamer, operation returned status code: 0x%08x \n", - STATUS_INTERNAL_ERROR); - goto CleanUp; - } + CHK_ERR(pipeline != NULL, STATUS_NULL_ARG, "[KVS Gstreamer Master] Pipeline is NULL"); appsinkVideo = gst_bin_get_by_name(GST_BIN(pipeline), "appsink-video"); appsinkAudio = gst_bin_get_by_name(GST_BIN(pipeline), "appsink-audio"); @@ -199,11 +251,9 @@ PVOID sendGstreamerAudioVideo(PVOID args) if (appsinkVideo != NULL) { g_signal_connect(appsinkVideo, "new-sample", G_CALLBACK(on_new_sample_video), (gpointer) pSampleConfiguration); } - if (appsinkAudio != NULL) { g_signal_connect(appsinkAudio, "new-sample", G_CALLBACK(on_new_sample_audio), (gpointer) pSampleConfiguration); } - gst_element_set_state(pipeline, GST_STATE_PLAYING); /* block until error or EOS */ @@ -214,14 +264,24 @@ PVOID sendGstreamerAudioVideo(PVOID args) if (msg != NULL) { gst_message_unref(msg); } - gst_object_unref(bus); + if (bus != NULL) { + gst_object_unref(bus); + } gst_element_set_state(pipeline, GST_STATE_NULL); - gst_object_unref(pipeline); + if (pipeline != NULL) { + gst_object_unref(pipeline); + } + if (appsinkAudio != NULL) { + gst_object_unref(appsinkAudio); + } + if (appsinkVideo != NULL) { + gst_object_unref(appsinkVideo); + } CleanUp: if (error != NULL) { - printf("%s", error->message); + DLOGE("%s", error->message); g_clear_error(&error); } @@ -264,13 +324,9 @@ PVOID receiveGstreamerAudioVideo(PVOID args) PSampleStreamingSession pSampleStreamingSession = (PSampleStreamingSession) args; gchar *videoDescription = "", *audioDescription = "", *audioVideoDescription; - if (pSampleStreamingSession == NULL) { - printf("[KVS GStreamer Master] receiveGstreamerAudioVideo(): operation returned status code: 0x%08x \n", STATUS_NULL_ARG); - goto CleanUp; - } - - // TODO: Wire video up with gstreamer pipeline + CHK_ERR(pSampleStreamingSession != NULL, STATUS_NULL_ARG, "[KVS Gstreamer Master] Sample streaming session is NULL"); + // TODO: For video switch (pSampleStreamingSession->pAudioRtcRtpTransceiver->receiver.track.codec) { case RTC_CODEC_OPUS: audioDescription = "appsrc name=appsrc-audio ! opusparse ! decodebin ! autoaudiosink"; @@ -289,26 +345,14 @@ PVOID receiveGstreamerAudioVideo(PVOID args) pipeline = gst_parse_launch(audioVideoDescription, &error); appsrcAudio = gst_bin_get_by_name(GST_BIN(pipeline), "appsrc-audio"); - if (appsrcAudio == NULL) { - printf("[KVS GStreamer Master] gst_bin_get_by_name(): cant find appsrc, operation returned status code: 0x%08x \n", STATUS_INTERNAL_ERROR); - goto CleanUp; - } + CHK_ERR(appsrcAudio != NULL, STATUS_INTERNAL_ERROR, "[KVS Gstreamer Master] Cannot find appsrc"); - transceiverOnFrame(pSampleStreamingSession->pAudioRtcRtpTransceiver, (UINT64) appsrcAudio, onGstAudioFrameReady); - - retStatus = streamingSessionOnShutdown(pSampleStreamingSession, (UINT64) appsrcAudio, onSampleStreamingSessionShutdown); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS GStreamer Master] streamingSessionOnShutdown(): operation returned status code: 0x%08x \n", STATUS_INTERNAL_ERROR); - goto CleanUp; - } + CHK_STATUS(transceiverOnFrame(pSampleStreamingSession->pAudioRtcRtpTransceiver, (UINT64) appsrcAudio, onGstAudioFrameReady)); + CHK_STATUS(streamingSessionOnShutdown(pSampleStreamingSession, (UINT64) appsrcAudio, onSampleStreamingSessionShutdown)); g_free(audioVideoDescription); - if (pipeline == NULL) { - printf("[KVS GStreamer Master] receiveGstreamerAudioVideo(): Failed to launch gstreamer, operation returned status code: 0x%08x \n", - STATUS_INTERNAL_ERROR); - goto CleanUp; - } + CHK_ERR(pipeline != NULL, STATUS_INTERNAL_ERROR, "[KVS Gstreamer Master] Pipeline is NULL"); gst_element_set_state(pipeline, GST_STATE_PLAYING); @@ -320,13 +364,20 @@ PVOID receiveGstreamerAudioVideo(PVOID args) if (msg != NULL) { gst_message_unref(msg); } - gst_object_unref(bus); - gst_element_set_state(pipeline, GST_STATE_NULL); - gst_object_unref(pipeline); + if (bus != NULL) { + gst_object_unref(bus); + } + if (pipeline != NULL) { + gst_element_set_state(pipeline, GST_STATE_NULL); + gst_object_unref(pipeline); + } + if (appsrcAudio != NULL) { + gst_object_unref(appsrcAudio); + } CleanUp: if (error != NULL) { - printf("%s", error->message); + DLOGE("%s", error->message); g_clear_error(&error); } @@ -340,129 +391,94 @@ INT32 main(INT32 argc, CHAR* argv[]) PCHAR pChannelName; SET_INSTRUMENTED_ALLOCATORS(); + UINT32 logLevel = setLogLevel(); signal(SIGINT, sigintHandler); - // do trickle-ice by default - printf("[KVS GStreamer Master] Using trickleICE by default\n"); - #ifdef IOT_CORE_ENABLE_CREDENTIALS CHK_ERR((pChannelName = getenv(IOT_CORE_THING_NAME)) != NULL, STATUS_INVALID_OPERATION, "AWS_IOT_CORE_THING_NAME must be set"); #else pChannelName = argc > 1 ? argv[1] : SAMPLE_CHANNEL_NAME; #endif - retStatus = createSampleConfiguration(pChannelName, SIGNALING_CHANNEL_ROLE_TYPE_MASTER, TRUE, TRUE, &pSampleConfiguration); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS GStreamer Master] createSampleConfiguration(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } - - printf("[KVS GStreamer Master] Created signaling channel %s\n", pChannelName); - - if (pSampleConfiguration->enableFileLogging) { - retStatus = - createFileLogger(FILE_LOGGING_BUFFER_SIZE, MAX_NUMBER_OF_LOG_FILES, (PCHAR) FILE_LOGGER_LOG_FILE_DIRECTORY_PATH, TRUE, TRUE, NULL); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Master] createFileLogger(): operation returned status code: 0x%08x \n", retStatus); - pSampleConfiguration->enableFileLogging = FALSE; - } - } + CHK_STATUS(createSampleConfiguration(pChannelName, SIGNALING_CHANNEL_ROLE_TYPE_MASTER, TRUE, TRUE, logLevel, &pSampleConfiguration)); pSampleConfiguration->videoSource = sendGstreamerAudioVideo; pSampleConfiguration->mediaType = SAMPLE_STREAMING_VIDEO_ONLY; pSampleConfiguration->receiveAudioVideoSource = receiveGstreamerAudioVideo; pSampleConfiguration->onDataChannel = onDataChannel; pSampleConfiguration->customData = (UINT64) pSampleConfiguration; - pSampleConfiguration->useTestSrc = FALSE; + pSampleConfiguration->srcType = DEVICE_SOURCE; // Default to device source (autovideosrc and autoaudiosrc) /* Initialize GStreamer */ gst_init(&argc, &argv); - printf("[KVS Gstreamer Master] Finished initializing GStreamer\n"); + DLOGI("[KVS Gstreamer Master] Finished initializing GStreamer and handlers"); if (argc > 2) { if (STRCMP(argv[2], "video-only") == 0) { pSampleConfiguration->mediaType = SAMPLE_STREAMING_VIDEO_ONLY; - printf("[KVS Gstreamer Master] Streaming video only\n"); + DLOGI("[KVS Gstreamer Master] Streaming video only"); } else if (STRCMP(argv[2], "audio-video") == 0) { pSampleConfiguration->mediaType = SAMPLE_STREAMING_AUDIO_VIDEO; - printf("[KVS Gstreamer Master] Streaming audio and video\n"); + DLOGI("[KVS Gstreamer Master] Streaming audio and video"); } else { - printf("[KVS Gstreamer Master] Unrecognized streaming type. Default to video-only\n"); + DLOGI("[KVS Gstreamer Master] Unrecognized streaming type. Default to video-only"); } } else { - printf("[KVS Gstreamer Master] Streaming video only\n"); + DLOGI("[KVS Gstreamer Master] Streaming video only"); } if (argc > 3) { if (STRCMP(argv[3], "testsrc") == 0) { - printf("[KVS GStreamer Master] Using test source in GStreamer\n"); - pSampleConfiguration->useTestSrc = TRUE; + DLOGI("[KVS GStreamer Master] Using test source in GStreamer"); + pSampleConfiguration->srcType = TEST_SOURCE; + } else if (STRCMP(argv[3], "devicesrc") == 0) { + DLOGI("[KVS GStreamer Master] Using device source in GStreamer"); + pSampleConfiguration->srcType = DEVICE_SOURCE; + } else if (STRCMP(argv[3], "rtspsrc") == 0) { + DLOGI("[KVS GStreamer Master] Using RTSP source in GStreamer"); + if (argc < 5) { + printf("[KVS GStreamer Master] No RTSP source URI included. Defaulting to device source"); + printf("[KVS GStreamer Master] Usage: ./kvsWebrtcClientMasterGstSample audio-video rtspsrc rtsp://\n" + "or ./kvsWebrtcClientMasterGstSample video-only rtspsrc "); + pSampleConfiguration->srcType = DEVICE_SOURCE; + } else { + pSampleConfiguration->srcType = RTSP_SOURCE; + pSampleConfiguration->rtspUri = argv[4]; + } + } else { + DLOGI("[KVS Gstreamer Master] Unrecognized source type. Defaulting to device source in GStreamer"); } + } else { + printf("[KVS GStreamer Master] Using device source in GStreamer\n"); } switch (pSampleConfiguration->mediaType) { case SAMPLE_STREAMING_VIDEO_ONLY: - printf("[KVS GStreamer Master] streaming type video-only"); + DLOGI("[KVS GStreamer Master] streaming type video-only"); break; case SAMPLE_STREAMING_AUDIO_VIDEO: - printf("[KVS GStreamer Master] streaming type audio-video"); + DLOGI("[KVS GStreamer Master] streaming type audio-video"); break; } // Initalize KVS WebRTC. This must be done before anything else, and must only be done once. - retStatus = initKvsWebRtc(); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS GStreamer Master] initKvsWebRtc(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } - printf("[KVS GStreamer Master] KVS WebRTC initialization completed successfully\n"); - - pSampleConfiguration->signalingClientCallbacks.messageReceivedFn = signalingMessageReceived; + CHK_STATUS(initKvsWebRtc()); + DLOGI("[KVS GStreamer Master] KVS WebRTC initialization completed successfully"); - strcpy(pSampleConfiguration->clientInfo.clientId, SAMPLE_MASTER_CLIENT_ID); - - retStatus = createSignalingClientSync(&pSampleConfiguration->clientInfo, &pSampleConfiguration->channelInfo, - &pSampleConfiguration->signalingClientCallbacks, pSampleConfiguration->pCredentialProvider, - &pSampleConfiguration->signalingClientHandle); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS GStreamer Master] createSignalingClientSync(): operation returned status code: 0x%08x \n", retStatus); - } - printf("[KVS GStreamer Master] Signaling client created successfully\n"); - - // Enable the processing of the messages - retStatus = signalingClientFetchSync(pSampleConfiguration->signalingClientHandle); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS Master] signalingClientFetchSync(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } - - retStatus = signalingClientConnectSync(pSampleConfiguration->signalingClientHandle); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS GStreamer Master] signalingClientConnectSync(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } - printf("[KVS GStreamer Master] Signaling client connection to socket established\n"); - - printf("[KVS Gstreamer Master] Beginning streaming...check the stream over channel %s\n", pChannelName); - - gSampleConfiguration = pSampleConfiguration; + CHK_STATUS(initSignaling(pSampleConfiguration, SAMPLE_MASTER_CLIENT_ID)); + DLOGI("[KVS GStreamer Master] Channel %s set up done ", pChannelName); // Checking for termination - retStatus = sessionCleanupWait(pSampleConfiguration); - if (retStatus != STATUS_SUCCESS) { - printf("[KVS GStreamer Master] sessionCleanupWait(): operation returned status code: 0x%08x \n", retStatus); - goto CleanUp; - } - - printf("[KVS GStreamer Master] Streaming session terminated\n"); + CHK_STATUS(sessionCleanupWait(pSampleConfiguration)); + DLOGI("[KVS GStreamer Master] Streaming session terminated"); CleanUp: if (retStatus != STATUS_SUCCESS) { - printf("[KVS GStreamer Master] Terminated with status code 0x%08x", retStatus); + DLOGE("[KVS GStreamer Master] Terminated with status code 0x%08x", retStatus); } - printf("[KVS GStreamer Master] Cleaning up....\n"); + DLOGI("[KVS GStreamer Master] Cleaning up...."); if (pSampleConfiguration != NULL) { // Kick of the termination sequence @@ -477,15 +493,15 @@ INT32 main(INT32 argc, CHAR* argv[]) } retStatus = freeSignalingClient(&pSampleConfiguration->signalingClientHandle); if (retStatus != STATUS_SUCCESS) { - printf("[KVS GStreamer Master] freeSignalingClient(): operation returned status code: 0x%08x \n", retStatus); + DLOGE("[KVS GStreamer Master] freeSignalingClient(): operation returned status code: 0x%08x", retStatus); } retStatus = freeSampleConfiguration(&pSampleConfiguration); if (retStatus != STATUS_SUCCESS) { - printf("[KVS GStreamer Master] freeSampleConfiguration(): operation returned status code: 0x%08x \n", retStatus); + DLOGE("[KVS GStreamer Master] freeSampleConfiguration(): operation returned status code: 0x%08x", retStatus); } } - printf("[KVS Gstreamer Master] Cleanup done\n"); + DLOGI("[KVS Gstreamer Master] Cleanup done"); RESET_INSTRUMENTED_ALLOCATORS(); diff --git a/scripts/parse_status.py b/scripts/parse_status.py index 28a32e2d13..5114b8c781 100755 --- a/scripts/parse_status.py +++ b/scripts/parse_status.py @@ -20,7 +20,7 @@ print(example_sums) # {'STATUS_CHILD': "0x5", 'STATUS_PARENT': "0x4"} ''' -pattern = re.compile("#define *(STATUS\_[A-Z_]*) *(([A-Z_]*) *\+ *)?0x([0-9]*)") +pattern = re.compile("#define *(STATUS\_[A-Z_]*) *(([A-Z_]*) *\+ *)?0x([0-9a-fA-F]*)") def operands_by_name(paragraph): matches = filter(None, [pattern.match(line) for line in paragraph.splitlines()]) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0d215f5fb7..8ac842d59a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8) +cmake_minimum_required(VERSION 3.6.3) project(KinesisVideoWebRTCClient LANGUAGES C) diff --git a/src/include/com/amazonaws/kinesis/video/webrtcclient/Include.h b/src/include/com/amazonaws/kinesis/video/webrtcclient/Include.h index 6baa03a278..0df3022f5d 100644 --- a/src/include/com/amazonaws/kinesis/video/webrtcclient/Include.h +++ b/src/include/com/amazonaws/kinesis/video/webrtcclient/Include.h @@ -25,6 +25,33 @@ extern "C" { #pragma clang diagnostic pop #endif +/* TODO: Potentially move these call to PIC instead. Moving to PIC in the future would not cause any backward compatibility issues */ +#define PROFILE_CALL(f, msg) \ + do { \ + startTimeInMacro = GETTIME(); \ + f; \ + DLOGP("[%s] Time taken: %" PRIu64 " ms", (msg), (GETTIME() - startTimeInMacro) / HUNDREDS_OF_NANOS_IN_A_MILLISECOND); \ + } while (FALSE) + +#define PROFILE_CALL_WITH_T_OBJ(f, t, msg) \ + do { \ + startTimeInMacro = GETTIME(); \ + f; \ + t = (GETTIME() - startTimeInMacro) / HUNDREDS_OF_NANOS_IN_A_MILLISECOND; \ + DLOGP("[%s] Time taken: %" PRIu64 " ms", (msg), (t)); \ + } while (FALSE) + +#define PROFILE_WITH_START_TIME(t, msg) \ + do { \ + DLOGP("[%s] Time taken: %" PRIu64 " ms", msg, (GETTIME() - (t)) / HUNDREDS_OF_NANOS_IN_A_MILLISECOND); \ + } while (FALSE) + +#define PROFILE_WITH_START_TIME_OBJ(t1, t2, msg) \ + do { \ + t2 = (GETTIME() - (t1)) / HUNDREDS_OF_NANOS_IN_A_MILLISECOND; \ + DLOGP("[%s] Time taken: %" PRIu64 " ms", (msg), t2); \ + } while (FALSE) + /*! \addtogroup StatusCodes * WEBRTC related status codes. Each value is an positive integer formed by adding * a base integer inticating the category to an index. Users may run scripts/parse_status.py @@ -143,6 +170,10 @@ extern "C" { #define STATUS_GET_SOCKET_FLAG_FAILED STATUS_NETWORKING_BASE + 0x00000024 #define STATUS_SET_SOCKET_FLAG_FAILED STATUS_NETWORKING_BASE + 0x00000025 #define STATUS_CLOSE_SOCKET_FAILED STATUS_NETWORKING_BASE + 0x00000026 +#define STATUS_CREATE_SOCKET_PAIR_FAILED STATUS_NETWORKING_BASE + 0x00000027 +#define STATUS_SOCKET_WRITE_FAILED STATUS_NETWORKING_BASE + 0X00000028 +#define STATUS_INVALID_ADDRESS_LENGTH STATUS_NETWORKING_BASE + 0X00000029 + /*!@} */ ///////////////////////////////////////////////////// @@ -205,6 +236,7 @@ extern "C" { #define STATUS_TURN_CONNECTION_PEER_NOT_USABLE STATUS_ICE_BASE + 0x00000027 #define STATUS_ICE_SERVER_INDEX_INVALID STATUS_ICE_BASE + 0x00000028 #define STATUS_ICE_CANDIDATE_STRING_MISSING_TYPE STATUS_ICE_BASE + 0x00000029 +#define STATUS_TURN_CONNECTION_ALLOCAITON_FAILED STATUS_ICE_BASE + 0x0000002a /*!@} */ ///////////////////////////////////////////////////// @@ -323,7 +355,7 @@ extern "C" { ///////////////////////////////////////////////////// /*! \addtogroup SCTPStatusCodes - * WEBRTC SCTP related codes. Values are derived from STATUS_STUN_BASE (0x5f000000) + * WEBRTC SCTP related codes. Values are derived from STATUS_SCTP_BASE (0x5f000000) * @{ */ #define STATUS_SCTP_BASE STATUS_PEERCONNECTION_BASE + 0x01000000 @@ -486,7 +518,7 @@ extern "C" { /** * Version of SignalingClientInfo structure */ -#define SIGNALING_CLIENT_INFO_CURRENT_VERSION 1 +#define SIGNALING_CLIENT_INFO_CURRENT_VERSION 2 /** * Version of SignalingClientCallbacks structure @@ -526,7 +558,17 @@ extern "C" { /** * Version of SignalingClientMetrics structure */ -#define SIGNALING_CLIENT_METRICS_CURRENT_VERSION 0 +#define SIGNALING_CLIENT_METRICS_CURRENT_VERSION 1 + +/** + * Version of PeerConnectionMetrics structure + */ +#define PEER_CONNECTION_METRICS_CURRENT_VERSION 0 + +/** + * Version of KvsIceAgentMetrics structure + */ +#define ICE_AGENT_METRICS_CURRENT_VERSION 0 /*!@} */ @@ -589,11 +631,17 @@ extern "C" { */ #define SIGNALING_CONNECT_TIMEOUT (5 * HUNDREDS_OF_NANOS_IN_A_SECOND) +#ifdef _WIN32 +/** + * Default timeout for sending data + */ +#define SIGNALING_SEND_TIMEOUT (15 * HUNDREDS_OF_NANOS_IN_A_SECOND) +#else /** * Default timeout for sending data */ #define SIGNALING_SEND_TIMEOUT (5 * HUNDREDS_OF_NANOS_IN_A_SECOND) - +#endif /** * Default timeout for deleting a channel */ @@ -618,7 +666,12 @@ extern "C" { /** * Maximum sequence number in rtp packet/jitter buffer */ -#define MAX_SEQUENCE_NUM ((UINT32) MAX_UINT16) +#define MAX_RTP_SEQUENCE_NUM ((UINT32) MAX_UINT16) + +/** + * Maximum timestamp in rtp packet/jitter buffer + */ +#define MAX_RTP_TIMESTAMP ((UINT32) MAX_UINT32) /** * Parameterized string for KVS STUN Server @@ -729,6 +782,7 @@ typedef enum { RTC_CODEC_VP8 = 3, //!< VP8 video codec. RTC_CODEC_MULAW = 4, //!< MULAW audio codec RTC_CODEC_ALAW = 5, //!< ALAW audio codec + RTC_CODEC_UNKNOWN = 6, } RTC_CODEC; /** @@ -1197,6 +1251,8 @@ typedef struct { INT32 signalingClientCreationMaxRetryAttempts; //!< Max attempts to create signaling client before returning error to the caller UINT32 stateMachineRetryCountReadOnly; //!< Retry count of state machine. Note that this **MUST NOT** be modified by the user. It is a read only //!< field + UINT32 signalingMessagesMinimumThreads; + UINT32 signalingMessagesMaximumThreads; } SignalingClientInfo, *PSignalingClientInfo; /** @@ -1430,6 +1486,22 @@ typedef struct { SignalingClientStats signalingClientStats; //!< Signaling client metrics stats. Reference in Stats.h } SignalingClientMetrics, *PSignalingClientMetrics; +/** + * @brief KVS ICE Agent Collection of ICE agent related stats. Can be expanded in the future + */ +typedef struct { + UINT32 version; //!< Structure version + KvsIceAgentStats kvsIceAgentStats; //!< ICE agent metrics. Reference in Stats.h +} KvsIceAgentMetrics, *PKvsIceAgentMetrics; + +/** + * @brief SignalingStats Collection of signaling related stats. Can be expanded in the future + */ +typedef struct { + UINT32 version; //!< Structure version + PeerConnectionStats peerConnectionStats; //!< Peer connection metrics stats. Reference in Stats.h +} PeerConnectionMetrics, *PPeerConnectionMetrics; + /** * @brief The stats object is populated based on RTCStatsType request * @@ -2012,6 +2084,22 @@ PUBLIC_API STATUS signalingClientDeleteSync(SIGNALING_CLIENT_HANDLE); */ PUBLIC_API STATUS signalingClientGetMetrics(SIGNALING_CLIENT_HANDLE, PSignalingClientMetrics); +/** + * @brief Get peer connection related metrics + * + * @param[in] PRtcPeerConnection Peer connection object + * @param[in,out] PPeerConnectionMetrics Peer connection stats object + */ +PUBLIC_API STATUS peerConnectionGetMetrics(PRtcPeerConnection, PPeerConnectionMetrics); + +/** + * @brief Get peer connection related metrics + * + * @param[in] PRtcPeerConnection Peer connection object + * @param[in,out] PKvsIceAgentMetrics KVS ICE agent stats object + */ +PUBLIC_API STATUS iceAgentGetMetrics(PRtcPeerConnection, PKvsIceAgentMetrics); + /** * @brief Get the relevant/all metrics based on the RTCStatsType field. This does not include * any signaling related metrics. The caller of the API is expected to populate requestedTypeOfStats diff --git a/src/include/com/amazonaws/kinesis/video/webrtcclient/Stats.h b/src/include/com/amazonaws/kinesis/video/webrtcclient/Stats.h index a8294fd699..39ac7cc438 100644 --- a/src/include/com/amazonaws/kinesis/video/webrtcclient/Stats.h +++ b/src/include/com/amazonaws/kinesis/video/webrtcclient/Stats.h @@ -243,6 +243,21 @@ typedef struct { UINT64 totalRoundTripTime; //!< Sum of RTTs of all the requests for which response has been received } RtcIceServerStats, *PRtcIceServerStats; +/** + * @brief: IceAgent profiling Stats related to the KVS ICE Agent + * + */ +typedef struct { + UINT64 localCandidateGatheringTime; + UINT64 hostCandidateSetUpTime; + UINT64 srflxCandidateSetUpTime; + UINT64 relayCandidateSetUpTime; + UINT64 iceServerParsingTime; + UINT64 iceCandidatePairNominationTime; + UINT64 candidateGatheringTime; + UINT64 iceAgentSetUpTime; +} KvsIceAgentStats, *PKvsIceAgentStats; + /** * @brief: RtcIceCandidateStats Stats related to a specific candidate in a pair * @@ -578,7 +593,26 @@ typedef struct { //!< In all of these cases the error callback (if specified) will be called. UINT32 numberOfReconnects; //!< Number of reconnects in the session UINT32 apiCallRetryCount; //!< Number of retries due to API call failures in the state machine -} SignalingClientStats, PSignalingClientStats; + UINT64 getTokenCallTime; //!< Time (ms) taken to get credentials for signaling + UINT64 describeCallTime; //!< Time (ms) taken to execute describeChannel call + UINT64 createCallTime; //!< Time (ms) taken to execute createChannel call + UINT64 getEndpointCallTime; //!< Time (ms) taken to execute getEndpoint call + UINT64 getIceConfigCallTime; //!< Time (ms) taken to execute getIceServerConfig call + UINT64 connectCallTime; //!< Time (ms) taken to execute connectChannel call + UINT64 createClientTime; //!< Total time (ms) taken to create signaling client which includes getting credentials + UINT64 + fetchClientTime; //!< Total time (ms) taken to fetch signaling client which includes describe, create, get endpoint and get ICE server config + UINT64 connectClientTime; //!< Total time (ms) taken to connect the signaling client which includes connecting to the signaling channel + UINT64 offerToAnswerTime; +} SignalingClientStats, *PSignalingClientStats; + +typedef struct { + UINT64 peerConnectionCreationTime; //!< Time taken (ms) for peer connection object creation time + UINT64 dtlsSessionSetupTime; //!< Time taken (ms) for DTLS handshake to complete + UINT64 iceHolePunchingTime; //!< Time taken (ms) for ICE agent set up to complete + UINT64 closePeerConnectionTime; //!< Time taken (ms) to close the peer connection + UINT64 freePeerConnectionTime; //!< Time taken (ms) to free the peer connection object +} PeerConnectionStats, *PPeerConnectionStats; /** * @brief RTCStatsObject Represents an object passed in by the application developer which will diff --git a/src/source/Crypto/Crypto.c b/src/source/Crypto/Crypto.c index 28ad657ec4..c98ef648dc 100644 --- a/src/source/Crypto/Crypto.c +++ b/src/source/Crypto/Crypto.c @@ -5,6 +5,7 @@ STATUS createRtcCertificate(PRtcCertificate* ppRtcCertificate) { ENTERS(); STATUS retStatus = STATUS_SUCCESS; + UINT64 startTimeInMacro = 0; PRtcCertificate pRtcCertificate = NULL; CHK(ppRtcCertificate != NULL, STATUS_NULL_ARG); @@ -12,16 +13,18 @@ STATUS createRtcCertificate(PRtcCertificate* ppRtcCertificate) CHK(NULL != (pRtcCertificate = (PRtcCertificate) MEMCALLOC(1, SIZEOF(RtcCertificate))), STATUS_NOT_ENOUGH_MEMORY); #ifdef KVS_USE_OPENSSL - CHK_STATUS(createCertificateAndKey(GENERATED_CERTIFICATE_BITS, FALSE, (X509**) &pRtcCertificate->pCertificate, - (EVP_PKEY**) &pRtcCertificate->pPrivateKey)); + PROFILE_CALL(CHK_STATUS(createCertificateAndKey(GENERATED_CERTIFICATE_BITS, FALSE, (X509**) &pRtcCertificate->pCertificate, + (EVP_PKEY**) &pRtcCertificate->pPrivateKey)), + "Certificate creation time"); #elif KVS_USE_MBEDTLS // Need to allocate space for the cert and the key for mbedTLS CHK(NULL != (pRtcCertificate->pCertificate = (PBYTE) MEMCALLOC(1, SIZEOF(mbedtls_x509_crt))), STATUS_NOT_ENOUGH_MEMORY); CHK(NULL != (pRtcCertificate->pPrivateKey = (PBYTE) MEMCALLOC(1, SIZEOF(mbedtls_pk_context))), STATUS_NOT_ENOUGH_MEMORY); pRtcCertificate->certificateSize = SIZEOF(mbedtls_x509_crt); pRtcCertificate->privateKeySize = SIZEOF(mbedtls_pk_context); - CHK_STATUS(createCertificateAndKey(GENERATED_CERTIFICATE_BITS, FALSE, (mbedtls_x509_crt*) pRtcCertificate->pCertificate, - (mbedtls_pk_context*) pRtcCertificate->pPrivateKey)); + PROFILE_CALL(CHK_STATUS(createCertificateAndKey(GENERATED_CERTIFICATE_BITS, FALSE, (mbedtls_x509_crt*) pRtcCertificate->pCertificate, + (mbedtls_pk_context*) pRtcCertificate->pPrivateKey)), + "Certificate creation time"); #else #error "A Crypto implementation is required." #endif diff --git a/src/source/Crypto/Dtls.c b/src/source/Crypto/Dtls.c index 58f557714e..615b2b01fe 100644 --- a/src/source/Crypto/Dtls.c +++ b/src/source/Crypto/Dtls.c @@ -68,8 +68,11 @@ STATUS dtlsSessionChangeState(PDtlsSession pDtlsSession, RTC_DTLS_TRANSPORT_STAT CHK(pDtlsSession->state != newState, retStatus); if (pDtlsSession->state == RTC_DTLS_TRANSPORT_STATE_CONNECTING && newState == RTC_DTLS_TRANSPORT_STATE_CONNECTED) { - DLOGD("DTLS init completed. Time taken %" PRIu64 " ms", - (GETTIME() - pDtlsSession->dtlsSessionStartTime) / HUNDREDS_OF_NANOS_IN_A_MILLISECOND); + // Need to set this so that we do not calculate the time taken again. We set the new state in 2 different places + if (pDtlsSession->dtlsSessionStartTime != 0) { + PROFILE_WITH_START_TIME_OBJ(pDtlsSession->dtlsSessionStartTime, pDtlsSession->dtlsSessionSetupTime, "DTLS initialization completion"); + pDtlsSession->dtlsSessionStartTime = 0; + } } pDtlsSession->state = newState; if (pDtlsSession->dtlsSessionCallbacks.stateChangeFn != NULL) { diff --git a/src/source/Crypto/Dtls.h b/src/source/Crypto/Dtls.h index 434cc5c304..f932a8c37c 100644 --- a/src/source/Crypto/Dtls.h +++ b/src/source/Crypto/Dtls.h @@ -104,6 +104,7 @@ struct __DtlsSession { TIMER_QUEUE_HANDLE timerQueueHandle; UINT32 timerId; UINT64 dtlsSessionStartTime; + UINT64 dtlsSessionSetupTime; RTC_DTLS_TRANSPORT_STATE state; MUTEX sslLock; diff --git a/src/source/Crypto/Dtls_openssl.c b/src/source/Crypto/Dtls_openssl.c index b124cb00e1..d1fcb1b788 100644 --- a/src/source/Crypto/Dtls_openssl.c +++ b/src/source/Crypto/Dtls_openssl.c @@ -48,15 +48,15 @@ STATUS dtlsTransmissionTimerCallback(UINT32 timerID, UINT64 currentTime, UINT64 MUTEX_LOCK(pDtlsSession->sslLock); locked = TRUE; - /* In case we need to initiate the handshake */ - CHK_STATUS(dtlsCheckOutgoingDataBuffer(pDtlsSession)); - if (SSL_is_init_finished(pDtlsSession->pSsl)) { CHK_STATUS(dtlsSessionChangeState(pDtlsSession, RTC_DTLS_TRANSPORT_STATE_CONNECTED)); ATOMIC_STORE_BOOL(&pDtlsSession->sslInitFinished, TRUE); CHK(FALSE, STATUS_TIMER_QUEUE_STOP_SCHEDULING); } + /* In case we need to initiate the handshake */ + CHK_STATUS(dtlsCheckOutgoingDataBuffer(pDtlsSession)); + /* https://commondatastorage.googleapis.com/chromium-boringssl-docs/ssl.h.html#DTLSv1_get_timeout */ dtlsTimeoutRet = DTLSv1_get_timeout(pDtlsSession->pSsl, &timeout); if (dtlsTimeoutRet == 0) { @@ -70,7 +70,7 @@ STATUS dtlsTransmissionTimerCallback(UINT32 timerID, UINT64 currentTime, UINT64 (UINT64) timeout.tv_sec * HUNDREDS_OF_NANOS_IN_A_SECOND + (UINT64) timeout.tv_usec * HUNDREDS_OF_NANOS_IN_A_MICROSECOND; if (timeoutValDefaultTimeUnit == 0) { - DLOGD("DTLS handshake timeout event"); + DLOGD("DTLS handshake timeout event, retransmit"); /* Retransmit the packet */ DTLSv1_handle_timeout(pDtlsSession->pSsl); CHK_STATUS(dtlsCheckOutgoingDataBuffer(pDtlsSession)); @@ -81,7 +81,6 @@ STATUS dtlsTransmissionTimerCallback(UINT32 timerID, UINT64 currentTime, UINT64 if (locked) { MUTEX_UNLOCK(pDtlsSession->sslLock); } - return retStatus; } @@ -160,12 +159,16 @@ STATUS createSslCtx(PDtlsSessionCertificateInfo pCertificates, UINT32 certCount, CHK(pCertificates != NULL && ppSslCtx != NULL, STATUS_NULL_ARG); CHK(certCount > 0, STATUS_INTERNAL_ERROR); + // Version less than 1.0.2 #if (OPENSSL_VERSION_NUMBER < 0x10002000L) EC_KEY* ecdh = NULL; #endif + // Version greater than or equal to 1.1.0 #if (OPENSSL_VERSION_NUMBER >= 0x10100000L) pSslCtx = SSL_CTX_new(DTLS_method()); + + // Version greater than or equal to 1.0.1 #elif (OPENSSL_VERSION_NUMBER >= 0x10001000L) pSslCtx = SSL_CTX_new(DTLSv1_method()); #else @@ -174,6 +177,7 @@ STATUS createSslCtx(PDtlsSessionCertificateInfo pCertificates, UINT32 certCount, CHK(pSslCtx != NULL, STATUS_SSL_CTX_CREATION_FAILED); + // Version greater than or equal to 1.0.2 #if (OPENSSL_VERSION_NUMBER >= 0x10002000L) SSL_CTX_set_ecdh_auto(pSslCtx, TRUE); #else @@ -190,7 +194,6 @@ STATUS createSslCtx(PDtlsSessionCertificateInfo pCertificates, UINT32 certCount, } CHK(SSL_CTX_set_cipher_list(pSslCtx, "HIGH:!aNULL:!MD5:!RC4") == 1, STATUS_SSL_CTX_CREATION_FAILED); - *ppSslCtx = pSslCtx; CleanUp: @@ -272,6 +275,7 @@ STATUS createDtlsSession(PDtlsSessionCallbacks pDtlsSessionCallbacks, TIMER_QUEU STATUS retStatus = STATUS_SUCCESS; PDtlsSession pDtlsSession = NULL; UINT32 i, certCount; + UINT64 startTimeInMacro = 0; DtlsSessionCertificateInfo certInfos[MAX_RTCCONFIGURATION_CERTIFICATES]; MEMSET(certInfos, 0x00, SIZEOF(certInfos)); @@ -295,7 +299,8 @@ STATUS createDtlsSession(PDtlsSessionCallbacks pDtlsSessionCallbacks, TIMER_QUEU } if (certCount == 0) { - CHK_STATUS(createCertificateAndKey(certificateBits, generateRSACertificate, &certInfos[0].pCert, &certInfos[0].pKey)); + PROFILE_CALL(CHK_STATUS(createCertificateAndKey(certificateBits, generateRSACertificate, &certInfos[0].pCert, &certInfos[0].pKey)), + "Certificate creation time"); certInfos[0].created = TRUE; pDtlsSession->certificateCount = 1; } else { @@ -414,10 +419,10 @@ STATUS freeDtlsSession(PDtlsSession* ppDtlsSession) } if (pDtlsSession->pSsl != NULL) { - SSL_CTX_free(pDtlsSession->pSslCtx); + SSL_free(pDtlsSession->pSsl); } if (pDtlsSession->pSslCtx != NULL) { - SSL_free(pDtlsSession->pSsl); + SSL_CTX_free(pDtlsSession->pSslCtx); } if (IS_VALID_MUTEX_VALUE(pDtlsSession->sslLock)) { MUTEX_FREE(pDtlsSession->sslLock); @@ -456,7 +461,7 @@ STATUS dtlsSessionProcessPacket(PDtlsSession pDtlsSession, PBYTE pData, PINT32 p sslRet = SSL_read(pDtlsSession->pSsl, pData, *pDataLen); if (sslRet == 0 && SSL_get_error(pDtlsSession->pSsl, sslRet) == SSL_ERROR_ZERO_RETURN) { - DLOGD("Detected DTLS close_notify alert"); + DLOGI("Detected DTLS close_notify alert"); isClosed = TRUE; } else if (sslRet <= 0) { LOG_OPENSSL_ERROR("SSL_read"); @@ -575,7 +580,6 @@ STATUS dtlsCheckOutgoingDataBuffer(PDtlsSession pDtlsSession) } CleanUp: - LEAVES(); return retStatus; } @@ -590,9 +594,15 @@ STATUS dtlsSessionIsInitFinished(PDtlsSession pDtlsSession, PBOOL pIsConnected) MUTEX_LOCK(pDtlsSession->sslLock); locked = TRUE; - *pIsConnected = SSL_is_init_finished(pDtlsSession->pSsl); + // The state change happens in the timer callback anyways. But the callback is invoked every + // 200 ms, hence by the time the state change occurs, it could be 200ms later worst case. + // This does not reduce any start up timing, but it helps in getting the accurate DTLS setup time + if (*pIsConnected) { + dtlsSessionChangeState(pDtlsSession, RTC_DTLS_TRANSPORT_STATE_CONNECTED); + } + CleanUp: if (locked) { MUTEX_UNLOCK(pDtlsSession->sslLock); diff --git a/src/source/Ice/ConnectionListener.c b/src/source/Ice/ConnectionListener.c index 39ebaab8aa..33eb21a37e 100644 --- a/src/source/Ice/ConnectionListener.c +++ b/src/source/Ice/ConnectionListener.c @@ -26,6 +26,13 @@ STATUS createConnectionListener(PConnectionListener* ppConnectionListener) pConnectionListener->pBuffer = (PBYTE) (pConnectionListener + 1); pConnectionListener->bufferLen = MAX_UDP_PACKET_SIZE; + // TODO add support for windows socketpair +#ifndef _WIN32 + pConnectionListener->kickSocket[CONNECTION_LISTENER_KICK_SOCKET_LISTEN] = -1; + pConnectionListener->kickSocket[CONNECTION_LISTENER_KICK_SOCKET_WRITE] = -1; + CHK_STATUS(createSocketPair(&(pConnectionListener->kickSocket))); +#endif + CleanUp: if (STATUS_FAILED(retStatus) && pConnectionListener != NULL) { @@ -44,9 +51,8 @@ STATUS freeConnectionListener(PConnectionListener* ppConnectionListener) { STATUS retStatus = STATUS_SUCCESS; PConnectionListener pConnectionListener = NULL; - UINT64 timeToWait; TID threadId; - BOOL threadTerminated = FALSE; + const char* msg = "1"; CHK(ppConnectionListener != NULL, STATUS_NULL_ARG); CHK(*ppConnectionListener != NULL, retStatus); @@ -56,31 +62,35 @@ STATUS freeConnectionListener(PConnectionListener* ppConnectionListener) ATOMIC_STORE_BOOL(&pConnectionListener->terminate, TRUE); if (IS_VALID_MUTEX_VALUE(pConnectionListener->lock)) { - // Try to await for the thread to finish up - // NOTE: As TID is not atomic we need to wrap the read in locks - timeToWait = GETTIME() + CONNECTION_LISTENER_SHUTDOWN_TIMEOUT; - - do { - MUTEX_LOCK(pConnectionListener->lock); - threadId = pConnectionListener->receiveDataRoutine; - MUTEX_UNLOCK(pConnectionListener->lock); - if (!IS_VALID_TID_VALUE(threadId)) { - threadTerminated = TRUE; - } + MUTEX_LOCK(pConnectionListener->lock); + threadId = pConnectionListener->receiveDataRoutine; + MUTEX_UNLOCK(pConnectionListener->lock); - // Allow the thread to finish and exit - if (!threadTerminated) { - THREAD_SLEEP(KVS_ICE_SHORT_CHECK_DELAY); - } - } while (!threadTerminated && GETTIME() < timeToWait); + // TODO add support for windows socketpair + // This writes to the socketpair, kicking the POLL() out early, + // otherwise wait for the POLL to timeout +#ifndef _WIN32 + socketWrite(pConnectionListener->kickSocket[CONNECTION_LISTENER_KICK_SOCKET_WRITE], msg, STRLEN(msg)); +#endif - if (!threadTerminated) { - DLOGW("Connection listener handler thread shutdown timed out"); + // wait for thread to finish. + if (IS_VALID_TID_VALUE(threadId)) { + THREAD_JOIN(pConnectionListener->receiveDataRoutine, NULL); } MUTEX_FREE(pConnectionListener->lock); } + // TODO add support for windows socketpair +#ifndef _WIN32 + if (pConnectionListener->kickSocket[CONNECTION_LISTENER_KICK_SOCKET_LISTEN] != -1) { + closeSocket(pConnectionListener->kickSocket[CONNECTION_LISTENER_KICK_SOCKET_LISTEN]); + } + if (pConnectionListener->kickSocket[CONNECTION_LISTENER_KICK_SOCKET_WRITE] != -1) { + closeSocket(pConnectionListener->kickSocket[CONNECTION_LISTENER_KICK_SOCKET_WRITE]); + } +#endif + MEMFREE(pConnectionListener); *ppConnectionListener = NULL; @@ -205,7 +215,6 @@ STATUS connectionListenerStart(PConnectionListener pConnectionListener) CHK(!IS_VALID_TID_VALUE(pConnectionListener->receiveDataRoutine), retStatus); CHK_STATUS(THREAD_CREATE(&pConnectionListener->receiveDataRoutine, connectionListenerReceiveDataRoutine, (PVOID) pConnectionListener)); - CHK_STATUS(THREAD_DETACH(pConnectionListener->receiveDataRoutine)); CleanUp: @@ -237,7 +246,8 @@ PVOID connectionListenerReceiveDataRoutine(PVOID arg) UINT32 i, socketCount; INT32 nfds = 0; - struct pollfd rfds[CONNECTION_LISTENER_DEFAULT_MAX_LISTENING_CONNECTION]; + //+1 added for the pipe() to kickout poll() + struct pollfd rfds[CONNECTION_LISTENER_DEFAULT_MAX_LISTENING_CONNECTION + 1]; INT32 retval, localSocket; INT64 readLen; // the source address is put here. sockaddr_storage can hold either sockaddr_in or sockaddr_in6 @@ -273,6 +283,9 @@ PVOID connectionListenerReceiveDataRoutine(PVOID arg) MUTEX_UNLOCK(pSocketConnection->lock); rfds[nfds].fd = localSocket; rfds[nfds].events = POLLIN | POLLPRI; +#ifdef _WIN32 + rfds[nfds].events &= ~POLLPRI; +#endif rfds[nfds].revents = 0; nfds++; @@ -289,9 +302,20 @@ PVOID connectionListenerReceiveDataRoutine(PVOID arg) // Need to unlock the mutex to ensure other racing threads unblock MUTEX_UNLOCK(pConnectionListener->lock); - - // blocking call until resolves as a timeout, an error, a signal or data received - retval = POLL(rfds, nfds, CONNECTION_LISTENER_SOCKET_WAIT_FOR_DATA_TIMEOUT / HUNDREDS_OF_NANOS_IN_A_MILLISECOND); + retval = 0; + if (nfds != 0) { + // TODO add support for socketpair() in windows + // This end of the socketpair has been added to the list of sockets polled + // in order to have a way to end the poll early from the destructor +#ifndef _WIN32 + rfds[nfds].fd = pConnectionListener->kickSocket[CONNECTION_LISTENER_KICK_SOCKET_LISTEN]; + rfds[nfds].events = POLLIN; + rfds[nfds].revents = 0; + nfds++; +#endif + // blocking call until resolves as a timeout, an error, a signal or data received + retval = POLL(rfds, nfds, CONNECTION_LISTENER_SOCKET_WAIT_FOR_DATA_TIMEOUT / HUNDREDS_OF_NANOS_IN_A_MILLISECOND); + } // In case of 0 we have a timeout and should re-lock to allow for other // interlocking operations to proceed. A positive return means we received data @@ -374,16 +398,6 @@ PVOID connectionListenerReceiveDataRoutine(PVOID arg) CleanUp: - // The check for valid mutex is necessary because when we're in freeConnectionListener - // we may free the mutex in another thread so by the time we get here accessing the lock - // will result in accessing a resource after it has been freed - if (pConnectionListener != NULL && IS_VALID_MUTEX_VALUE(pConnectionListener->lock)) { - // As TID is 64 bit we can't atomically update it and need to do it under the lock - MUTEX_LOCK(pConnectionListener->lock); - pConnectionListener->receiveDataRoutine = INVALID_TID_VALUE; - MUTEX_UNLOCK(pConnectionListener->lock); - } - CHK_LOG_ERR(retStatus); return (PVOID) (ULONG_PTR) retStatus; diff --git a/src/source/Ice/ConnectionListener.h b/src/source/Ice/ConnectionListener.h index 86596910af..207465f1ad 100644 --- a/src/source/Ice/ConnectionListener.h +++ b/src/source/Ice/ConnectionListener.h @@ -13,6 +13,8 @@ extern "C" { #define CONNECTION_LISTENER_SOCKET_WAIT_FOR_DATA_TIMEOUT (200 * HUNDREDS_OF_NANOS_IN_A_MILLISECOND) #define CONNECTION_LISTENER_SHUTDOWN_TIMEOUT (1000 * HUNDREDS_OF_NANOS_IN_A_MILLISECOND) #define CONNECTION_LISTENER_DEFAULT_MAX_LISTENING_CONNECTION 64 +#define CONNECTION_LISTENER_KICK_SOCKET_LISTEN 0 +#define CONNECTION_LISTENER_KICK_SOCKET_WRITE 1 typedef struct { volatile ATOMIC_BOOL terminate; @@ -22,6 +24,9 @@ typedef struct { TID receiveDataRoutine; PBYTE pBuffer; UINT64 bufferLen; +#ifndef _WIN32 + INT32 kickSocket[2]; +#endif } ConnectionListener, *PConnectionListener; /** diff --git a/src/source/Ice/IceAgent.c b/src/source/Ice/IceAgent.c index 3747b956cc..2eaa49a2b1 100644 --- a/src/source/Ice/IceAgent.c +++ b/src/source/Ice/IceAgent.c @@ -29,6 +29,7 @@ STATUS createIceAgent(PCHAR username, PCHAR password, PIceAgentCallbacks pIceAge STATUS retStatus = STATUS_SUCCESS; PIceAgent pIceAgent = NULL; UINT32 i; + UINT64 startTimeInMacro = 0; CHK(ppIceAgent != NULL && username != NULL && password != NULL && pConnectionListener != NULL, STATUS_NULL_ARG); CHK(STRNLEN(username, MAX_ICE_CONFIG_USER_NAME_LEN + 1) <= MAX_ICE_CONFIG_USER_NAME_LEN && @@ -75,6 +76,7 @@ STATUS createIceAgent(PCHAR username, PCHAR password, PIceAgentCallbacks pIceAge pIceAgent->disconnectionGracePeriodEndTime = INVALID_TIMESTAMP_VALUE; pIceAgent->pConnectionListener = pConnectionListener; pIceAgent->pDataSendingIceCandidatePair = NULL; + pIceAgent->iceAgentState = ICE_AGENT_STATE_NEW; CHK_STATUS(createTransactionIdStore(DEFAULT_MAX_STORED_TRANSACTION_ID_COUNT, &pIceAgent->pStunBindingRequestTransactionIdStore)); pIceAgent->relayCandidateCount = 0; @@ -92,23 +94,28 @@ STATUS createIceAgent(PCHAR username, PCHAR password, PIceAgentCallbacks pIceAge pIceAgent->iceServersCount = 0; for (i = 0; i < MAX_ICE_SERVERS_COUNT; i++) { - if (pRtcConfiguration->iceServers[i].urls[0] != '\0' && - STATUS_SUCCEEDED(parseIceServer(&pIceAgent->iceServers[pIceAgent->iceServersCount], (PCHAR) pRtcConfiguration->iceServers[i].urls, - (PCHAR) pRtcConfiguration->iceServers[i].username, - (PCHAR) pRtcConfiguration->iceServers[i].credential))) { - pIceAgent->rtcIceServerDiagnostics[i].port = (INT32) getInt16(pIceAgent->iceServers[i].ipAddress.port); - switch (pIceAgent->iceServers[pIceAgent->iceServersCount].transport) { - case KVS_SOCKET_PROTOCOL_UDP: - STRCPY(pIceAgent->rtcIceServerDiagnostics[i].protocol, ICE_TRANSPORT_TYPE_UDP); - break; - case KVS_SOCKET_PROTOCOL_TCP: - STRCPY(pIceAgent->rtcIceServerDiagnostics[i].protocol, ICE_TRANSPORT_TYPE_TCP); - break; - default: - MEMSET(pIceAgent->rtcIceServerDiagnostics[i].protocol, 0, SIZEOF(pIceAgent->rtcIceServerDiagnostics[i].protocol)); + if (pRtcConfiguration->iceServers[i].urls[0] != '\0') { + PROFILE_CALL_WITH_T_OBJ( + retStatus = parseIceServer(&pIceAgent->iceServers[pIceAgent->iceServersCount], (PCHAR) pRtcConfiguration->iceServers[i].urls, + (PCHAR) pRtcConfiguration->iceServers[i].username, (PCHAR) pRtcConfiguration->iceServers[i].credential), + pIceAgent->iceAgentProfileDiagnostics.iceServerParsingTime[i], "ICE server parsing"); + if (STATUS_SUCCEEDED(retStatus)) { + pIceAgent->rtcIceServerDiagnostics[i].port = (INT32) getInt16(pIceAgent->iceServers[i].ipAddress.port); + switch (pIceAgent->iceServers[pIceAgent->iceServersCount].transport) { + case KVS_SOCKET_PROTOCOL_UDP: + STRCPY(pIceAgent->rtcIceServerDiagnostics[i].protocol, ICE_TRANSPORT_TYPE_UDP); + break; + case KVS_SOCKET_PROTOCOL_TCP: + STRCPY(pIceAgent->rtcIceServerDiagnostics[i].protocol, ICE_TRANSPORT_TYPE_TCP); + break; + default: + MEMSET(pIceAgent->rtcIceServerDiagnostics[i].protocol, 0, SIZEOF(pIceAgent->rtcIceServerDiagnostics[i].protocol)); + } + STRCPY(pIceAgent->rtcIceServerDiagnostics[i].url, pRtcConfiguration->iceServers[i].urls); + pIceAgent->iceServersCount++; + } else { + DLOGE("Failed to parse ICE servers"); } - STRCPY(pIceAgent->rtcIceServerDiagnostics[i].url, pRtcConfiguration->iceServers[i].urls); - pIceAgent->iceServersCount++; } } @@ -444,8 +451,10 @@ STATUS iceAgentAddRemoteCandidate(PIceAgent pIceAgent, PCHAR pIceCandidateString if (STATUS_FAILED(retStatus) && freeIceCandidateIfFail) { SAFE_MEMFREE(pIceCandidate); } - - CHK_LOG_ERR(retStatus); + // Parsing TCP candidates is not an error, so do not log as error because that is misleading + if (retStatus != STATUS_ICE_CANDIDATE_STRING_IS_TCP) { + CHK_LOG_ERR(retStatus); + } LEAVES(); return retStatus; @@ -508,7 +517,6 @@ STATUS iceAgentInitHostCandidate(PIceAgent pIceAgent) CHK_STATUS(connectionListenerAddConnection(pIceAgent->pConnectionListener, pNewIceCandidate->pSocketConnection)); } } - CHK(localCandidateCount != 0, STATUS_ICE_NO_LOCAL_HOST_CANDIDATE_AVAILABLE); CleanUp: @@ -578,22 +586,29 @@ STATUS iceAgentStartAgent(PIceAgent pIceAgent, PCHAR remoteUsername, PCHAR remot STATUS iceAgentStartGathering(PIceAgent pIceAgent) { STATUS retStatus = STATUS_SUCCESS; + UINT64 startTimeInMacro = 0; CHK(pIceAgent != NULL, STATUS_NULL_ARG); CHK(!ATOMIC_LOAD_BOOL(&pIceAgent->agentStartGathering), retStatus); ATOMIC_STORE_BOOL(&pIceAgent->agentStartGathering, TRUE); - - CHK_STATUS(getLocalhostIpAddresses(pIceAgent->localNetworkInterfaces, &pIceAgent->localNetworkInterfaceCount, - pIceAgent->kvsRtcConfiguration.iceSetInterfaceFilterFunc, pIceAgent->kvsRtcConfiguration.filterCustomData)); + pIceAgent->candidateGatheringStartTime = GETTIME(); // skip gathering host candidate and srflx candidate if relay only if (pIceAgent->iceTransportPolicy != ICE_TRANSPORT_POLICY_RELAY) { - CHK_STATUS(iceAgentInitHostCandidate(pIceAgent)); - CHK_STATUS(iceAgentInitSrflxCandidate(pIceAgent)); + // Skip getting local host candidates if transport policy is relay only + PROFILE_CALL_WITH_T_OBJ(CHK_STATUS(getLocalhostIpAddresses(pIceAgent->localNetworkInterfaces, &pIceAgent->localNetworkInterfaceCount, + pIceAgent->kvsRtcConfiguration.iceSetInterfaceFilterFunc, + pIceAgent->kvsRtcConfiguration.filterCustomData)), + pIceAgent->iceAgentProfileDiagnostics.localCandidateGatheringTime, "Host candidate gathering from local interfaces"); + PROFILE_CALL_WITH_T_OBJ(CHK_STATUS(iceAgentInitHostCandidate(pIceAgent)), pIceAgent->iceAgentProfileDiagnostics.hostCandidateSetUpTime, + "Host candidates setup time"); + PROFILE_CALL_WITH_T_OBJ(CHK_STATUS(iceAgentInitSrflxCandidate(pIceAgent)), pIceAgent->iceAgentProfileDiagnostics.srflxCandidateSetUpTime, + "Srflx candidates setup time"); } - CHK_STATUS(iceAgentInitRelayCandidates(pIceAgent)); + PROFILE_CALL_WITH_T_OBJ(CHK_STATUS(iceAgentInitRelayCandidates(pIceAgent)), pIceAgent->iceAgentProfileDiagnostics.relayCandidateSetUpTime, + "Relay candidates setup time"); // start listening for incoming data CHK_STATUS(connectionListenerStart(pIceAgent->pConnectionListener)); @@ -638,6 +653,8 @@ STATUS iceAgentSendPacket(PIceAgent pIceAgent, PBYTE pBuffer, UINT32 bufferLen) CHK_WARN(pIceAgent->pDataSendingIceCandidatePair->state == ICE_CANDIDATE_PAIR_STATE_SUCCEEDED, retStatus, "Invalid state for data sending candidate pair."); + CHK_WARN(pIceAgent->pDataSendingIceCandidatePair->local != NULL, retStatus, "Local ice candidate is invalid"); + isRelay = IS_CANN_PAIR_SENDING_FROM_RELAYED(pIceAgent->pDataSendingIceCandidatePair); if (isRelay) { CHK_ERR(pIceAgent->pDataSendingIceCandidatePair->local->pTurnConnection != NULL, STATUS_NULL_ARG, @@ -1051,11 +1068,13 @@ STATUS createIceCandidatePairs(PIceAgent pIceAgent, PIceCandidate pIceCandidate, CHK(pIceCandidatePair != NULL, STATUS_NOT_ENOUGH_MEMORY); if (isRemoteCandidate) { - pIceCandidatePair->local = (PIceCandidate) data; + // Since we pick local candidate list + pIceCandidatePair->local = pCurrentIceCandidate; pIceCandidatePair->remote = pIceCandidate; } else { pIceCandidatePair->local = pIceCandidate; - pIceCandidatePair->remote = (PIceCandidate) data; + // Since we pick remote candidate list + pIceCandidatePair->remote = pCurrentIceCandidate; } pIceCandidatePair->nominated = FALSE; @@ -1229,6 +1248,7 @@ STATUS iceCandidatePairCheckConnection(PStunPacket pStunBindingRequest, PIceAgen UINT32 checkSum = 0; CHK(pStunBindingRequest != NULL && pIceAgent != NULL && pIceCandidatePair != NULL, STATUS_NULL_ARG); + CHK(pIceCandidatePair->local != NULL && pIceCandidatePair->remote != NULL, STATUS_NULL_ARG); CHK_STATUS(getStunAttribute(pStunBindingRequest, STUN_ATTRIBUTE_TYPE_PRIORITY, (PStunAttributeHeader*) &pStunAttributePriority)); CHK(pStunAttributePriority != NULL, STATUS_INVALID_ARG); @@ -1236,10 +1256,10 @@ STATUS iceCandidatePairCheckConnection(PStunPacket pStunBindingRequest, PIceAgen if (pIceCandidatePair->local->ipAddress.family == KVS_IP_FAMILY_TYPE_IPV4) { DLOGD("remote ip:%u.%u.%u.%u, port:%u, local ip:%u.%u.%u.%u, port:%u", pIceCandidatePair->remote->ipAddress.address[0], pIceCandidatePair->remote->ipAddress.address[1], pIceCandidatePair->remote->ipAddress.address[2], - pIceCandidatePair->remote->ipAddress.address[3], pIceCandidatePair->remote->ipAddress.address[0], - pIceCandidatePair->remote->ipAddress.port, pIceCandidatePair->local->ipAddress.address[1], + pIceCandidatePair->remote->ipAddress.address[3], (UINT16) getInt16(pIceCandidatePair->remote->ipAddress.port), + pIceCandidatePair->local->ipAddress.address[0], pIceCandidatePair->local->ipAddress.address[1], pIceCandidatePair->local->ipAddress.address[2], pIceCandidatePair->local->ipAddress.address[3], - pIceCandidatePair->local->ipAddress.address[0], pIceCandidatePair->local->ipAddress.port); + (UINT16) getInt16(pIceCandidatePair->local->ipAddress.port)); } // update priority and transaction id @@ -1249,10 +1269,10 @@ STATUS iceCandidatePairCheckConnection(PStunPacket pStunBindingRequest, PIceAgen transactionIdStoreInsert(pIceCandidatePair->pTransactionIdStore, pStunBindingRequest->header.transactionId); checkSum = COMPUTE_CRC32(pStunBindingRequest->header.transactionId, ARRAY_SIZE(pStunBindingRequest->header.transactionId)); CHK_STATUS(hashTableUpsert(pIceCandidatePair->requestSentTime, checkSum, GETTIME())); + CHK_STATUS(hashTableUpsert(pIceAgent->requestTimestampDiagnostics, checkSum, GETTIME())); if (pIceCandidatePair->local->iceCandidateType == ICE_CANDIDATE_TYPE_RELAYED) { pIceAgent->rtcIceServerDiagnostics[pIceCandidatePair->local->iceServerIndex].totalRequestsSent++; - CHK_STATUS(hashTableUpsert(pIceAgent->requestTimestampDiagnostics, checkSum, GETTIME())); } CHK_STATUS(iceAgentSendStunPacket(pStunBindingRequest, (PBYTE) pIceAgent->remotePassword, @@ -1358,7 +1378,6 @@ STATUS iceAgentSendSrflxCandidateRequest(PIceAgent pIceAgent) PIceServer pIceServer = NULL; PStunPacket pBindingRequest = NULL; UINT64 checkSum = 0; - CHK(pIceAgent != NULL, STATUS_NULL_ARG); // Assume holding pIceAgent->lock @@ -1449,7 +1468,6 @@ STATUS iceAgentCheckCandidatePairConnection(PIceAgent pIceAgent) } CleanUp: - CHK_LOG_ERR(retStatus); if (locked) { @@ -1544,6 +1562,17 @@ STATUS iceAgentGatherCandidateTimerCallback(UINT32 timerId, UINT64 currentTime, CHK_STATUS(createIceCandidatePairs(pIceAgent, pIceCandidate, FALSE)); } } + + // If the candidate has moved to valid state, then we can report it and start creating pairs with + // srflx candidates. + else if (pIceCandidate->state == ICE_CANDIDATE_STATE_VALID && !pIceCandidate->reported) { + newLocalCandidates[newLocalCandidateCount++] = *pIceCandidate; + pIceCandidate->reported = TRUE; + + if (pIceCandidate->iceCandidateType == ICE_CANDIDATE_TYPE_SERVER_REFLEXIVE) { + CHK_STATUS(createIceCandidatePairs(pIceAgent, pIceCandidate, FALSE)); + } + } } /* keep sending binding request if there is still pending srflx candidate */ @@ -1553,27 +1582,11 @@ STATUS iceAgentGatherCandidateTimerCallback(UINT32 timerId, UINT64 currentTime, /* stop scheduling if there is no more pending candidate or if timeout is reached. */ if ((totalCandidateCount > 0 && pendingCandidateCount == 0) || currentTime >= pIceAgent->candidateGatheringEndTime) { - DLOGD("Candidate gathering completed."); + DLOGI("Candidate gathering completed."); stopScheduling = TRUE; pIceAgent->iceCandidateGatheringTimerTask = MAX_UINT32; } - CHK_STATUS(doubleListGetHeadNode(pIceAgent->localCandidates, &pCurNode)); - while (pCurNode != NULL && newLocalCandidateCount < ARRAY_SIZE(newLocalCandidates)) { - CHK_STATUS(doubleListGetNodeData(pCurNode, &data)); - pCurNode = pCurNode->pNext; - pIceCandidate = (PIceCandidate) data; - - if (pIceCandidate->state == ICE_CANDIDATE_STATE_VALID && !pIceCandidate->reported) { - newLocalCandidates[newLocalCandidateCount++] = *pIceCandidate; - pIceCandidate->reported = TRUE; - - if (pIceCandidate->iceCandidateType == ICE_CANDIDATE_TYPE_SERVER_REFLEXIVE) { - CHK_STATUS(createIceCandidatePairs(pIceAgent, pIceCandidate, FALSE)); - } - } - } - MUTEX_UNLOCK(pIceAgent->lock); locked = FALSE; @@ -1585,6 +1598,8 @@ STATUS iceAgentGatherCandidateTimerCallback(UINT32 timerId, UINT64 currentTime, if (stopScheduling) { ATOMIC_STORE_BOOL(&pIceAgent->candidateGatheringFinished, TRUE); + PROFILE_WITH_START_TIME_OBJ(pIceAgent->candidateGatheringStartTime, pIceAgent->iceAgentProfileDiagnostics.candidateGatheringTime, + "Candidate gathering time"); /* notify that candidate gathering is finished. */ if (pIceAgent->iceAgentCallbacks.newLocalCandidateFn != NULL) { pIceAgent->iceAgentCallbacks.newLocalCandidateFn(pIceAgent->iceAgentCallbacks.customData, NULL); @@ -1658,7 +1673,7 @@ STATUS iceAgentInitSrflxCandidate(PIceAgent pIceAgent) PIceCandidate pCandidate = NULL, pNewCandidate = NULL; UINT32 j, srflxCount = 0; BOOL locked = FALSE; - PIceCandidate srflsCandidates[KVS_ICE_MAX_LOCAL_CANDIDATE_COUNT]; + PIceCandidate srflxCandidates[KVS_ICE_MAX_LOCAL_CANDIDATE_COUNT]; CHK(pIceAgent != NULL, STATUS_NULL_ARG); @@ -1694,7 +1709,7 @@ STATUS iceAgentInitSrflxCandidate(PIceAgent pIceAgent) CHK_STATUS(doubleListInsertItemHead(pIceAgent->localCandidates, (UINT64) pNewCandidate)); // Store the pointer so we can start the connection listener outside the locks - srflsCandidates[srflxCount++] = pNewCandidate; + srflxCandidates[srflxCount++] = pNewCandidate; pNewCandidate = NULL; } @@ -1707,15 +1722,21 @@ STATUS iceAgentInitSrflxCandidate(PIceAgent pIceAgent) // Create and start the connection listener outside of the locks for (j = 0; j < srflxCount; j++) { - pCandidate = srflsCandidates[j]; - // open up a new socket at host candidate's ip address for server reflex candidate. - // the new port will be stored in pNewCandidate->ipAddress.port. And the Ip address will later be updated - // with the correct ip address once the STUN response is received. - CHK_STATUS(createSocketConnection(pCandidate->ipAddress.family, KVS_SOCKET_PROTOCOL_UDP, &pCandidate->ipAddress, NULL, (UINT64) pIceAgent, - incomingDataHandler, pIceAgent->kvsRtcConfiguration.sendBufSize, &pCandidate->pSocketConnection)); - ATOMIC_STORE_BOOL(&pCandidate->pSocketConnection->receiveData, TRUE); - // connectionListener will free the pSocketConnection at the end. - CHK_STATUS(connectionListenerAddConnection(pIceAgent->pConnectionListener, pCandidate->pSocketConnection)); + pCandidate = srflxCandidates[j]; + // TODO: IPv6 STUN is not supported at the moment. Remove this check if the support is added in the future + if (IS_IPV4_ADDR(&(pCandidate->ipAddress))) { + // open up a new socket at host candidate's ip address for server reflex candidate. + // the new port will be stored in pNewCandidate->ipAddress.port. And the Ip address will later be updated + // with the correct ip address once the STUN response is received. + CHK_STATUS(createSocketConnection(pCandidate->ipAddress.family, KVS_SOCKET_PROTOCOL_UDP, &pCandidate->ipAddress, NULL, (UINT64) pIceAgent, + incomingDataHandler, pIceAgent->kvsRtcConfiguration.sendBufSize, &pCandidate->pSocketConnection)); + ATOMIC_STORE_BOOL(&pCandidate->pSocketConnection->receiveData, TRUE); + // connectionListener will free the pSocketConnection at the end. + CHK_STATUS(connectionListenerAddConnection(pIceAgent->pConnectionListener, pCandidate->pSocketConnection)); + + } else { + DLOGW("IPv6 candidate detected, ignoring...."); + } } CleanUp: @@ -1766,6 +1787,23 @@ STATUS iceAgentInitRelayCandidates(PIceAgent pIceAgent) return retStatus; } +STATUS turnStateFailedFn(PSocketConnection pSocketConnection, UINT64 data) +{ + UNUSED_PARAM(pSocketConnection); + + STATUS retStatus = STATUS_SUCCESS; + + PIceCandidate pNewCandidate = (PIceCandidate) data; + CHK(pNewCandidate != NULL, STATUS_NULL_ARG); + + if (pNewCandidate->state == ICE_CANDIDATE_STATE_NEW) { + pNewCandidate->state = ICE_CANDIDATE_STATE_INVALID; + } + +CleanUp: + return retStatus; +} + STATUS iceAgentInitRelayCandidate(PIceAgent pIceAgent, UINT32 iceServerIndex, KVS_SOCKET_PROTOCOL protocol) { STATUS retStatus = STATUS_SUCCESS; @@ -1801,8 +1839,13 @@ STATUS iceAgentInitRelayCandidate(PIceAgent pIceAgent, UINT32 iceServerIndex, KV pNewCandidate->foundation = pIceAgent->foundationCounter++; // we dont generate candidates that have the same foundation. pNewCandidate->priority = computeCandidatePriority(pNewCandidate); + TurnConnectionCallbacks callback = {0}; + callback.customData = (UINT64) pNewCandidate; + callback.relayAddressAvailableFn = NULL; + callback.turnStateFailedFn = turnStateFailedFn; + CHK_STATUS(createTurnConnection(&pIceAgent->iceServers[iceServerIndex], pIceAgent->timerQueueHandle, - TURN_CONNECTION_DATA_TRANSFER_MODE_SEND_INDIDATION, protocol, NULL, pNewCandidate->pSocketConnection, + TURN_CONNECTION_DATA_TRANSFER_MODE_SEND_INDIDATION, protocol, &callback, pNewCandidate->pSocketConnection, pIceAgent->pConnectionListener, &pTurnConnection)); pNewCandidate->pIceAgent = pIceAgent; pNewCandidate->pTurnConnection = pTurnConnection; @@ -2109,9 +2152,11 @@ STATUS iceAgentReadyStateSetup(PIceAgent pIceAgent) pIceAgent->pDataSendingIceCandidatePair = pNominatedAndValidCandidatePair; CHK_STATUS(getIpAddrStr(&pIceAgent->pDataSendingIceCandidatePair->local->ipAddress, ipAddrStr, ARRAY_SIZE(ipAddrStr))); - DLOGD("Selected pair %s_%s, local candidate type: %s. Round trip time %u ms. Local candidate priority: %u, ice candidate pair priority: %" PRIu64, + DLOGP("Selected pair %s_%s, local candidate type: %s. remote candidate type: %s. Round trip time %u ms. Local candidate priority: %u, ice " + "candidate pair priority: %" PRIu64, pIceAgent->pDataSendingIceCandidatePair->local->id, pIceAgent->pDataSendingIceCandidatePair->remote->id, iceAgentGetCandidateTypeStr(pIceAgent->pDataSendingIceCandidatePair->local->iceCandidateType), + iceAgentGetCandidateTypeStr(pIceAgent->pDataSendingIceCandidatePair->remote->iceCandidateType), pIceAgent->pDataSendingIceCandidatePair->roundTripTime / HUNDREDS_OF_NANOS_IN_A_MILLISECOND, pIceAgent->pDataSendingIceCandidatePair->local->priority, pIceAgent->pDataSendingIceCandidatePair->priority); @@ -2387,6 +2432,7 @@ STATUS handleStunPacket(PIceAgent pIceAgent, PBYTE pBuffer, UINT32 bufferLen, PS UINT64 connectivityCheckRequestsReceived = 0; UINT64 connectivityCheckResponsesSent = 0; UINT64 connectivityCheckResponsesReceived = 0; + UINT32 count = 0; // need to determine stunPacketType before deserializing because different password should be used depending on the packet type stunPacketType = (UINT16) getInt16(*((PUINT16) pBuffer)); @@ -2450,14 +2496,12 @@ STATUS handleStunPacket(PIceAgent pIceAgent, PBYTE pBuffer, UINT32 bufferLen, PS // Update round trip time for serial reflexive candidate pIceAgent->rtcIceServerDiagnostics[pIceCandidate->iceServerIndex].totalResponsesReceived++; - retStatus = hashTableGet(pIceAgent->requestTimestampDiagnostics, checkSum, &requestSentTime); - if (retStatus != STATUS_SUCCESS) { - DLOGW("Unable to fetch request Timestamp from the hash table. No update to totalRoundTripTime (error code: 0x%08x), " - "stunBindingRequest", - retStatus); - } else { + // Transaction ID count be same for candidates coming from same interface, which means there would only + // be one entry. It is not necessary to update a return sttaus since it is not indicative of a failure + if ((hashTableGet(pIceAgent->requestTimestampDiagnostics, checkSum, &requestSentTime)) == STATUS_SUCCESS) { pIceAgent->rtcIceServerDiagnostics[pIceCandidate->iceServerIndex].totalRoundTripTime += GETTIME() - requestSentTime; CHK_STATUS(hashTableRemove(pIceAgent->requestTimestampDiagnostics, checkSum)); + hashTableGetCount(pIceAgent->requestTimestampDiagnostics, &count); } CHK_STATUS(deserializeStunPacket(pBuffer, bufferLen, NULL, 0, &pStunPacket)); @@ -2483,13 +2527,12 @@ STATUS handleStunPacket(PIceAgent pIceAgent, PBYTE pBuffer, UINT32 bufferLen, PS ipAddrStr2, ipAddrStr); } DLOGV("Pair binding response! %s %s", pIceCandidatePair->local->id, pIceCandidatePair->remote->id); - retStatus = hashTableGet(pIceCandidatePair->requestSentTime, checkSum, &requestSentTime); - if (retStatus != STATUS_SUCCESS) { - DLOGW("Unable to fetch request Timestamp from the hash table. No update to RTT for the pair (error code: 0x%08x)", retStatus); - } else { + if (hashTableGet(pIceCandidatePair->requestSentTime, checkSum, &requestSentTime) == STATUS_SUCCESS) { pIceCandidatePair->roundTripTime = GETTIME() - requestSentTime; pIceCandidatePair->rtcIceCandidatePairDiagnostics.currentRoundTripTime = (DOUBLE) (pIceCandidatePair->roundTripTime) / HUNDREDS_OF_NANOS_IN_A_SECOND; + } else { + DLOGW("Unable to fetch request Timestamp from the hash table. No update to RTT for the pair (error code: 0x%08x)", retStatus); } CHK_WARN(transactionIdStoreHasId(pIceCandidatePair->pTransactionIdStore, pBuffer + STUN_PACKET_TRANSACTION_ID_OFFSET), retStatus, "Dropping response packet because transaction id does not match"); @@ -2498,10 +2541,7 @@ STATUS handleStunPacket(PIceAgent pIceAgent, PBYTE pBuffer, UINT32 bufferLen, PS if (pIceCandidatePair->local->iceCandidateType == ICE_CANDIDATE_TYPE_RELAYED) { pIceAgent->rtcIceServerDiagnostics[pIceCandidatePair->local->iceServerIndex].totalResponsesReceived++; retStatus = hashTableGet(pIceAgent->requestTimestampDiagnostics, checkSum, &requestSentTime); - if (retStatus != STATUS_SUCCESS) { - DLOGW("Unable to fetch request Timestamp from the hash table. No update to totalRoundTripTime (error code: 0x%08x), typeRelayed", - retStatus); - } else { + if (hashTableGet(pIceAgent->requestTimestampDiagnostics, checkSum, &requestSentTime) == STATUS_SUCCESS) { pIceAgent->rtcIceServerDiagnostics[pIceCandidatePair->local->iceServerIndex].totalRoundTripTime += GETTIME() - requestSentTime; CHK_STATUS(hashTableRemove(pIceAgent->requestTimestampDiagnostics, checkSum)); } @@ -2513,7 +2553,9 @@ STATUS handleStunPacket(PIceAgent pIceAgent, PBYTE pBuffer, UINT32 bufferLen, PS pStunAttributeAddress = (PStunAttributeAddress) pStunAttr; - if (!isSameIpAddress(&pStunAttributeAddress->address, &pIceCandidatePair->local->ipAddress, FALSE)) { + if (pIceCandidatePair->local->iceCandidateType == ICE_CANDIDATE_TYPE_SERVER_REFLEXIVE && + pIceCandidatePair->remote->iceCandidateType == ICE_CANDIDATE_TYPE_SERVER_REFLEXIVE && + !isSameIpAddress(&pStunAttributeAddress->address, &pIceCandidatePair->local->ipAddress, FALSE)) { // this can happen for host and server reflexive candidates. If the peer // is in the same subnet, server reflexive candidate's binding response's xor mapped ip address will be // the host candidate ip address. In this case we will ignore the packet since the host candidate will @@ -2523,19 +2565,13 @@ STATUS handleStunPacket(PIceAgent pIceAgent, PBYTE pBuffer, UINT32 bufferLen, PS // we have a peer reflexive local candidate CHK_STATUS(iceAgentCheckPeerReflexiveCandidate(pIceAgent, &pStunAttributeAddress->address, pIceCandidatePair->local->priority, FALSE, pSocketConnection)); - - CHK(FALSE, retStatus); } if (pIceCandidatePair->state != ICE_CANDIDATE_PAIR_STATE_SUCCEEDED) { - DLOGV("Pair succeeded! %s %s", pIceCandidatePair->local->id, pIceCandidatePair->remote->id); + DLOGD("Pair succeeded! %s %s", pIceCandidatePair->local->id, pIceCandidatePair->remote->id); pIceCandidatePair->state = ICE_CANDIDATE_PAIR_STATE_SUCCEEDED; retStatus = hashTableGet(pIceCandidatePair->requestSentTime, checkSum, &requestSentTime); - if (retStatus != STATUS_SUCCESS) { - DLOGW( - "Unable to fetch request Timestamp from the hash table. No update to totalRoundTripTime (error code: 0x%08x), stateSucceeded", - retStatus); - } else { + if (hashTableGet(pIceCandidatePair->requestSentTime, checkSum, &requestSentTime) == STATUS_SUCCESS) { pIceCandidatePair->roundTripTime = GETTIME() - requestSentTime; DLOGD("Ice candidate pair %s_%s is connected. Round trip time: %" PRIu64 "ms", pIceCandidatePair->local->id, pIceCandidatePair->remote->id, pIceCandidatePair->roundTripTime / HUNDREDS_OF_NANOS_IN_A_MILLISECOND); @@ -2543,6 +2579,8 @@ STATUS handleStunPacket(PIceAgent pIceAgent, PBYTE pBuffer, UINT32 bufferLen, PS (DOUBLE) (pIceCandidatePair->roundTripTime) / HUNDREDS_OF_NANOS_IN_A_SECOND; CHK_STATUS(hashTableRemove(pIceCandidatePair->requestSentTime, checkSum)); + } else { + DLOGW("Unable to fetch request Timestamp from the hash table. No update to RTT for the pair (error code: 0x%08x)", retStatus); } } @@ -2746,6 +2784,7 @@ UINT64 computeCandidatePairPriority(PIceCandidatePair pIceCandidatePair, BOOL is UINT64 controllingAgentCandidatePri = pIceCandidatePair->local->priority; UINT64 controlledAgentCandidatePri = pIceCandidatePair->remote->priority; + // Swap if SDK is used as master peer if (!isLocalControlling) { controllingAgentCandidatePri = controlledAgentCandidatePri; controlledAgentCandidatePri = pIceCandidatePair->local->priority; @@ -2776,3 +2815,22 @@ UINT64 iceAgentGetCurrentTime(UINT64 customData) UNUSED_PARAM(customData); return GETTIME(); } + +STATUS getIceAgentStats(PIceAgent pIceAgent, PKvsIceAgentMetrics pKvsIceAgentMetrics) +{ + STATUS retStatus = STATUS_SUCCESS; + UINT32 i = 0; + CHK(pIceAgent != NULL && pKvsIceAgentMetrics != NULL, STATUS_NULL_ARG); + pKvsIceAgentMetrics->kvsIceAgentStats.localCandidateGatheringTime = pIceAgent->iceAgentProfileDiagnostics.localCandidateGatheringTime; + pKvsIceAgentMetrics->kvsIceAgentStats.hostCandidateSetUpTime = pIceAgent->iceAgentProfileDiagnostics.hostCandidateSetUpTime; + pKvsIceAgentMetrics->kvsIceAgentStats.srflxCandidateSetUpTime = pIceAgent->iceAgentProfileDiagnostics.srflxCandidateSetUpTime; + pKvsIceAgentMetrics->kvsIceAgentStats.relayCandidateSetUpTime = pIceAgent->iceAgentProfileDiagnostics.relayCandidateSetUpTime; + for (i = 0; i < MAX_ICE_SERVERS_COUNT; i++) { + pKvsIceAgentMetrics->kvsIceAgentStats.iceServerParsingTime += pIceAgent->iceAgentProfileDiagnostics.iceServerParsingTime[i]; + } + pKvsIceAgentMetrics->kvsIceAgentStats.iceCandidatePairNominationTime = pIceAgent->iceAgentProfileDiagnostics.iceCandidatePairNominationTime; + pKvsIceAgentMetrics->kvsIceAgentStats.candidateGatheringTime = pIceAgent->iceAgentProfileDiagnostics.candidateGatheringTime; + pKvsIceAgentMetrics->kvsIceAgentStats.iceAgentSetUpTime = pIceAgent->iceAgentProfileDiagnostics.iceAgentSetUpTime; +CleanUp: + return retStatus; +} diff --git a/src/source/Ice/IceAgent.h b/src/source/Ice/IceAgent.h index 0b02b87848..5d0d9e4933 100644 --- a/src/source/Ice/IceAgent.h +++ b/src/source/Ice/IceAgent.h @@ -178,6 +178,17 @@ typedef struct { RtcIceCandidatePairDiagnostics rtcIceCandidatePairDiagnostics; } IceCandidatePair, *PIceCandidatePair; +typedef struct { + UINT64 localCandidateGatheringTime; + UINT64 hostCandidateSetUpTime; + UINT64 srflxCandidateSetUpTime; + UINT64 relayCandidateSetUpTime; + UINT64 iceServerParsingTime[MAX_ICE_SERVERS_COUNT]; + UINT64 iceCandidatePairNominationTime; + UINT64 candidateGatheringTime; + UINT64 iceAgentSetUpTime; +} IceAgentProfileDiagnostics, *PIceAgentProfileDiagnostics; + struct __IceAgent { volatile ATOMIC_BOOL agentStartGathering; volatile ATOMIC_BOOL remoteCredentialReceived; @@ -195,6 +206,7 @@ struct __IceAgent { RtcIceServerDiagnostics rtcIceServerDiagnostics[MAX_ICE_SERVERS_COUNT]; RtcIceCandidateDiagnostics rtcSelectedLocalIceCandidateDiagnostics; RtcIceCandidateDiagnostics rtcSelectedRemoteIceCandidateDiagnostics; + IceAgentProfileDiagnostics iceAgentProfileDiagnostics; PHashTable requestTimestampDiagnostics; @@ -250,6 +262,9 @@ struct __IceAgent { // store transaction ids for stun binding request. PTransactionIdStore pStunBindingRequestTransactionIdStore; + + UINT64 candidateGatheringStartTime; + UINT64 iceAgentStartTime; }; ////////////////////////////////////////////// @@ -430,6 +445,8 @@ UINT64 computeCandidatePairPriority(PIceCandidatePair, BOOL); PCHAR iceAgentGetCandidateTypeStr(ICE_CANDIDATE_TYPE); STATUS updateSelectedLocalRemoteCandidateStats(PIceAgent); +STATUS getIceAgentStats(PIceAgent, PKvsIceAgentMetrics); + #ifdef __cplusplus } #endif diff --git a/src/source/Ice/IceAgentStateMachine.c b/src/source/Ice/IceAgentStateMachine.c index b9c2c293fa..54b48a7980 100644 --- a/src/source/Ice/IceAgentStateMachine.c +++ b/src/source/Ice/IceAgentStateMachine.c @@ -48,7 +48,7 @@ STATUS stepIceAgentStateMachine(PIceAgent pIceAgent) if (oldState != pIceAgent->iceAgentState) { if (pIceAgent->iceAgentCallbacks.connectionStateChangedFn != NULL) { - DLOGD("Ice agent state changed from %s to %s.", iceAgentStateToString(oldState), iceAgentStateToString(pIceAgent->iceAgentState)); + DLOGI("Ice agent state changed from %s to %s.", iceAgentStateToString(oldState), iceAgentStateToString(pIceAgent->iceAgentState)); pIceAgent->iceAgentCallbacks.connectionStateChangedFn(pIceAgent->iceAgentCallbacks.customData, pIceAgent->iceAgentState); } } else { @@ -286,6 +286,10 @@ STATUS executeCheckConnectionIceAgentState(UINT64 customData, UINT64 time) retStatus = STATUS_SUCCESS; } + if (pIceAgent->iceAgentStartTime == 0) { + pIceAgent->iceAgentStartTime = GETTIME(); + } + LEAVES(); return retStatus; } @@ -427,6 +431,7 @@ STATUS executeNominatingIceAgentState(UINT64 customData, UINT64 time) UNUSED_PARAM(time); STATUS retStatus = STATUS_SUCCESS; PIceAgent pIceAgent = (PIceAgent) customData; + UINT64 startTimeInMacro = 0; CHK(pIceAgent != NULL, STATUS_NULL_ARG); @@ -436,7 +441,8 @@ STATUS executeNominatingIceAgentState(UINT64 customData, UINT64 time) } if (pIceAgent->isControlling) { - CHK_STATUS(iceAgentSendCandidateNomination(pIceAgent)); + PROFILE_CALL_WITH_T_OBJ(CHK_STATUS(iceAgentSendCandidateNomination(pIceAgent)), + pIceAgent->iceAgentProfileDiagnostics.iceCandidatePairNominationTime, "ICE candidate pair nomination"); } else { // if not controlling, keep sending connection checks and wait for peer // to nominate a pair. @@ -524,7 +530,6 @@ STATUS executeReadyIceAgentState(UINT64 customData, UINT64 time) PIceAgent pIceAgent = (PIceAgent) customData; CHK(pIceAgent != NULL, STATUS_NULL_ARG); - if (pIceAgent->iceAgentState != ICE_AGENT_STATE_READY) { CHK_STATUS(iceAgentReadyStateSetup(pIceAgent)); pIceAgent->iceAgentState = ICE_AGENT_STATE_READY; @@ -539,6 +544,12 @@ STATUS executeReadyIceAgentState(UINT64 customData, UINT64 time) retStatus = STATUS_SUCCESS; } + if (pIceAgent->iceAgentStartTime != 0) { + PROFILE_WITH_START_TIME_OBJ(pIceAgent->iceAgentStartTime, pIceAgent->iceAgentProfileDiagnostics.iceAgentSetUpTime, + "Time taken to get ICE Agent ready for media exchange"); + pIceAgent->iceAgentStartTime = 0; + } + LEAVES(); return retStatus; } diff --git a/src/source/Ice/IceUtils.c b/src/source/Ice/IceUtils.c index d269cdb91f..cc8176d505 100644 --- a/src/source/Ice/IceUtils.c +++ b/src/source/Ice/IceUtils.c @@ -68,6 +68,7 @@ VOID transactionIdStoreInsert(PTransactionIdStore pTransactionIdStore, PBYTE tra if (pTransactionIdStore->nextTransactionIdIndex == pTransactionIdStore->earliestTransactionIdIndex) { pTransactionIdStore->earliestTransactionIdIndex = (pTransactionIdStore->earliestTransactionIdIndex + 1) % pTransactionIdStore->maxTransactionIdsCount; + return; } pTransactionIdStore->transactionIdCount = MIN(pTransactionIdStore->transactionIdCount + 1, pTransactionIdStore->maxTransactionIdsCount); diff --git a/src/source/Ice/Network.c b/src/source/Ice/Network.c index b5ec9b8722..8656f15dfc 100644 --- a/src/source/Ice/Network.c +++ b/src/source/Ice/Network.c @@ -90,7 +90,7 @@ STATUS getLocalhostIpAddresses(PKvsIpAddress destIpList, PUINT32 pDestIpListLen, destIpList[ipCount].isPointToPoint = ((ifa->ifa_flags & IFF_POINTOPOINT) != 0); if (filter != NULL) { - // The callback evaluates to a FALSE if the application is interested in black listing an interface + // The callback evaluates to a FALSE if the application is interested in disallowing an interface if (filter(customData, ifa->ifa_name) == FALSE) { filterSet = FALSE; } else { @@ -110,7 +110,7 @@ STATUS getLocalhostIpAddresses(PKvsIpAddress destIpList, PUINT32 pDestIpListLen, destIpList[ipCount].family = KVS_IP_FAMILY_TYPE_IPV6; destIpList[ipCount].port = 0; pIpv6Addr = (struct sockaddr_in6*) ifa->ifa_addr; - // Ignore unspecified addres: the other peer can't use this address + // Ignore unspecified address: the other peer can't use this address // Ignore link local: not very useful and will add work unnecessarily // Ignore site local: https://tools.ietf.org/html/rfc8445#section-5.1.1.1 if (IN6_IS_ADDR_UNSPECIFIED(&pIpv6Addr->sin6_addr) || IN6_IS_ADDR_LINKLOCAL(&pIpv6Addr->sin6_addr) || @@ -147,6 +147,21 @@ STATUS getLocalhostIpAddresses(PKvsIpAddress destIpList, PUINT32 pDestIpListLen, return retStatus; } +// TODO add support for windows socketpair +#ifndef _WIN32 +STATUS createSocketPair(INT32 (*pSocketPair)[2]) +{ + STATUS retStatus = STATUS_SUCCESS; + CHK(pSocketPair != NULL, STATUS_NULL_ARG); + if (socketpair(AF_UNIX, SOCK_STREAM, 0, *pSocketPair) == -1) { + DLOGE("socketpair() failed to create a pair of sockets with errno %s", getErrorString(getErrorCode())); + CHK(FALSE, STATUS_CREATE_SOCKET_PAIR_FAILED); + } +CleanUp: + return retStatus; +} +#endif + STATUS createSocket(KVS_IP_FAMILY_TYPE familyType, KVS_SOCKET_PROTOCOL protocol, UINT32 sendBufSize, PINT32 pOutSockFd) { STATUS retStatus = STATUS_SUCCESS; @@ -302,45 +317,144 @@ STATUS socketConnect(PKvsIpAddress pPeerAddress, INT32 sockfd) return retStatus; } +STATUS socketWrite(INT32 sockfd, const void* pBuffer, SIZE_T length) +{ + STATUS retStatus = STATUS_SUCCESS; + ssize_t ret = (ssize_t) length; +#ifndef _WIN32 + if (ret != write(sockfd, pBuffer, length)) { + DLOGW("write() failed to write over socket with errno %s", getErrorString(getErrorCode())); + CHK(FALSE, STATUS_SOCKET_WRITE_FAILED); + } +#endif +CleanUp: + return retStatus; +} + +BOOL isIpAddr(PCHAR hostname, UINT16 length) +{ + BOOL status = TRUE; + UINT32 ip_1, ip_2, ip_3, ip_4, ip_5, ip_6, ip_7, ip_8; + if (hostname == NULL || length > MAX_ICE_CONFIG_URI_LEN) { + DLOGW("Provided NULL hostname"); + status = FALSE; + } else { + status = (SSCANF(hostname, IPV4_TEMPLATE, &ip_1, &ip_2, &ip_3, &ip_4) == 4 && ip_1 >= 0 && ip_1 <= 255 && ip_2 >= 0 && ip_2 <= 255 && + ip_3 >= 0 && ip_3 <= 255 && ip_4 >= 0 && ip_4 <= 255) || + (SSCANF(hostname, IPV6_TEMPLATE, &ip_1, &ip_2, &ip_3, &ip_4, &ip_5, &ip_6, &ip_7, &ip_8) == 8); + } + return status; +} + +STATUS getIpAddrFromDnsHostname(PCHAR hostname, PCHAR address, UINT16 lengthSrc, UINT16 maxLenDst) +{ + STATUS retStatus = STATUS_SUCCESS; + UINT8 i = 0, j = 0; + UINT16 hostNameLen = lengthSrc; + CHK(hostname != NULL && address != NULL, STATUS_NULL_ARG); + CHK(hostNameLen > 0 && hostNameLen < MAX_ICE_CONFIG_URI_LEN, STATUS_INVALID_ARG); + + // TURN server URLs conform with the public IPv4 DNS hostname format defined here: + // https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html#vpc-dns-hostnames + // So, we first try to parse the IP from the hostname if it conforms to this format + // For example: 35-90-63-38.t-ae7dd61a.kinesisvideo.us-west-2.amazonaws.com + // Note: public IPv6 DNS hostnames are not available + while (hostNameLen > 0 && hostname[i] != '.') { + if (hostname[i] >= '0' && hostname[i] <= '9') { + if (j > maxLenDst) { + DLOGW("Generated address is past allowed size"); + retStatus = STATUS_INVALID_ADDRESS_LENGTH; + break; + } + address[j] = hostname[i]; + } else if (hostname[i] == '-') { + if (j > maxLenDst) { + DLOGW("Generated address is past allowed size"); + retStatus = STATUS_INVALID_ADDRESS_LENGTH; + break; + } + address[j] = '.'; + } else { + DLOGW("Received unexpected hostname format: %s", hostname); + break; + } + j++; + i++; + hostNameLen--; + } + + address[j] = '\0'; + +CleanUp: + return retStatus; +} + STATUS getIpWithHostName(PCHAR hostname, PKvsIpAddress destIp) { STATUS retStatus = STATUS_SUCCESS; INT32 errCode; + UINT16 hostnameLen, addrLen; PCHAR errStr; struct addrinfo *res, *rp; BOOL resolved = FALSE; struct sockaddr_in* ipv4Addr; struct sockaddr_in6* ipv6Addr; + struct in_addr inaddr; + + CHAR addr[KVS_IP_ADDRESS_STRING_BUFFER_LEN + 1] = {'\0'}; + CHAR addressResolved[KVS_IP_ADDRESS_STRING_BUFFER_LEN + 1] = {'\0'}; CHK(hostname != NULL, STATUS_NULL_ARG); + DLOGI("ICE SERVER Hostname received: %s", hostname); + + hostnameLen = STRLEN(hostname); + addrLen = SIZEOF(addr); - errCode = getaddrinfo(hostname, NULL, NULL, &res); - if (errCode != 0) { - errStr = errCode == EAI_SYSTEM ? strerror(errno) : (PCHAR) gai_strerror(errCode); - CHK_ERR(FALSE, STATUS_RESOLVE_HOSTNAME_FAILED, "getaddrinfo() with errno %s", errStr); + // Adding this check in case we directly get an IP address. With the current usage pattern, + // there is no way this function would receive an address directly, but having this check + // in place anyways + if (isIpAddr(hostname, hostnameLen)) { + MEMCPY(addr, hostname, hostnameLen); + } else { + retStatus = getIpAddrFromDnsHostname(hostname, addr, hostnameLen, addrLen); } - for (rp = res; rp != NULL && !resolved; rp = rp->ai_next) { - if (rp->ai_family == AF_INET) { - ipv4Addr = (struct sockaddr_in*) rp->ai_addr; - destIp->family = KVS_IP_FAMILY_TYPE_IPV4; - MEMCPY(destIp->address, &ipv4Addr->sin_addr, IPV4_ADDRESS_LENGTH); - resolved = TRUE; - } else if (rp->ai_family == AF_INET6) { - ipv6Addr = (struct sockaddr_in6*) rp->ai_addr; - destIp->family = KVS_IP_FAMILY_TYPE_IPV6; - MEMCPY(destIp->address, &ipv6Addr->sin6_addr, IPV6_ADDRESS_LENGTH); - resolved = TRUE; + // Verify the generated address has the format x.x.x.x + if (!isIpAddr(addr, hostnameLen) || retStatus != STATUS_SUCCESS) { + DLOGW("Parsing for address failed for %s, fallback to getaddrinfo", hostname); + errCode = getaddrinfo(hostname, NULL, NULL, &res); + if (errCode != 0) { + errStr = errCode == EAI_SYSTEM ? (strerror(errno)) : ((PCHAR) gai_strerror(errCode)); + CHK_ERR(FALSE, STATUS_RESOLVE_HOSTNAME_FAILED, "getaddrinfo() with errno %s", errStr); } + for (rp = res; rp != NULL && !resolved; rp = rp->ai_next) { + if (rp->ai_family == AF_INET) { + ipv4Addr = (struct sockaddr_in*) rp->ai_addr; + destIp->family = KVS_IP_FAMILY_TYPE_IPV4; + MEMCPY(destIp->address, &ipv4Addr->sin_addr, IPV4_ADDRESS_LENGTH); + resolved = TRUE; + } else if (rp->ai_family == AF_INET6) { + ipv6Addr = (struct sockaddr_in6*) rp->ai_addr; + destIp->family = KVS_IP_FAMILY_TYPE_IPV6; + MEMCPY(destIp->address, &ipv6Addr->sin6_addr, IPV6_ADDRESS_LENGTH); + resolved = TRUE; + } + } + freeaddrinfo(res); + CHK_ERR(resolved, STATUS_HOSTNAME_NOT_FOUND, "Could not find network address of %s", hostname); + getIpAddrStr(destIp, addressResolved, ARRAY_SIZE(addressResolved)); + DLOGP("ICE Server address for %s with getaddrinfo: %s", hostname, addressResolved); } - freeaddrinfo(res); - CHK_ERR(resolved, STATUS_HOSTNAME_NOT_FOUND, "could not find network address of %s", hostname); + else { + DLOGP("ICE Server address for %s: %s", hostname, addr); + inet_pton(AF_INET, addr, &inaddr); + destIp->family = KVS_IP_FAMILY_TYPE_IPV4; + MEMCPY(destIp->address, &inaddr, IPV4_ADDRESS_LENGTH); + } CleanUp: - CHK_LOG_ERR(retStatus); - return retStatus; } diff --git a/src/source/Ice/Network.h b/src/source/Ice/Network.h index a88acabb98..93d1f79678 100644 --- a/src/source/Ice/Network.h +++ b/src/source/Ice/Network.h @@ -22,6 +22,9 @@ extern "C" { #define KVS_GET_IP_ADDRESS_PORT(a) ((UINT16) getInt16((a)->port)) +#define IPV4_TEMPLATE "%d.%d.%d.%d" +#define IPV6_TEMPLATE "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x" + #if defined(__MACH__) #define NO_SIGNAL SO_NOSIGPIPE #else @@ -59,6 +62,16 @@ typedef enum { */ STATUS getLocalhostIpAddresses(PKvsIpAddress, PUINT32, IceSetInterfaceFilterFunc, UINT64); +// TODO add support for windows socketpair +#ifndef _WIN32 +/** + * @param - INT32 (*)[2] - OUT - Array for the socket pair fds + * + * @return - STATUS status of execution + */ +STATUS createSocketPair(INT32 (*)[2]); +#endif + /** * @param - KVS_IP_FAMILY_TYPE - IN - Family for the socket. Must be one of KVS_IP_FAMILY_TYPE * @param - KVS_SOCKET_PROTOCOL - IN - either tcp or udp @@ -92,6 +105,15 @@ STATUS socketBind(PKvsIpAddress, INT32); */ STATUS socketConnect(PKvsIpAddress, INT32); +/** + * @param - INT32 - Socket to write to + * @param - const void * - buffer of data to write + * @param - SIZE_T - length of buffer + * + * @return - STATUS status of execution + */ +STATUS socketWrite(INT32, const void*, SIZE_T); + /** * @param - PCHAR - IN - hostname to resolve * @@ -101,6 +123,17 @@ STATUS socketConnect(PKvsIpAddress, INT32); */ STATUS getIpWithHostName(PCHAR, PKvsIpAddress); +/** + * @param - PCHAR - IN - IP address string to verify if it is IPv4 or IPv6 format + * + * @param - UINT16 - IN - Length of string + * + * @param - BOOL - OUT - Evaluates to TRUE if the provided string is IPv4/IPv6. False otherwise + * + * @return - STATUS status of execution + */ +BOOL isIpAddr(PCHAR, UINT16); + STATUS getIpAddrStr(PKvsIpAddress, PCHAR, UINT32); BOOL isSameIpAddress(PKvsIpAddress, PKvsIpAddress, BOOL); diff --git a/src/source/Ice/SocketConnection.c b/src/source/Ice/SocketConnection.c index 67680db5a5..7d3fb02719 100644 --- a/src/source/Ice/SocketConnection.c +++ b/src/source/Ice/SocketConnection.c @@ -66,7 +66,12 @@ STATUS freeSocketConnection(PSocketConnection* ppSocketConnection) CHK(ppSocketConnection != NULL, STATUS_NULL_ARG); pSocketConnection = *ppSocketConnection; CHK(pSocketConnection != NULL, retStatus); + + // connectionClosed is accessed and modified when checking if socket connection is closed + // Hence the modification needs to be protected + MUTEX_LOCK(pSocketConnection->lock); ATOMIC_STORE_BOOL(&pSocketConnection->connectionClosed, TRUE); + MUTEX_UNLOCK(pSocketConnection->lock); // Await for the socket connection to be released shutdownTimeout = GETTIME() + KVS_ICE_TURN_CONNECTION_SHUTDOWN_TIMEOUT; @@ -130,8 +135,7 @@ VOID socketConnectionTlsSessionOnStateChange(UINT64 customData, TLS_SESSION_STAT break; case TLS_SESSION_STATE_CONNECTED: if (IS_VALID_TIMESTAMP(pSocketConnection->tlsHandshakeStartTime)) { - DLOGD("TLS handshake done. Time taken %" PRIu64 " ms", - (GETTIME() - pSocketConnection->tlsHandshakeStartTime) / HUNDREDS_OF_NANOS_IN_A_MILLISECOND); + PROFILE_WITH_START_TIME(pSocketConnection->tlsHandshakeStartTime, "TLS handshake time"); pSocketConnection->tlsHandshakeStartTime = INVALID_TIMESTAMP_VALUE; } break; @@ -186,7 +190,7 @@ STATUS socketConnectionSendData(PSocketConnection pSocketConnection, PBYTE pBuf, // Using a single CHK_WARN might output too much spew in bad network conditions if (ATOMIC_LOAD_BOOL(&pSocketConnection->connectionClosed)) { - DLOGD("Warning: Failed to send data. Socket closed already"); + DLOGW("Warning: Failed to send data. Socket closed already"); CHK(FALSE, STATUS_SOCKET_CONNECTION_CLOSED_ALREADY); } @@ -365,16 +369,16 @@ STATUS socketSendDataWithRetry(PSocketConnection pSocketConnection, PBYTE buf, U if (result == 0) { /* loop back and try again */ - DLOGD("poll() timed out"); + DLOGE("poll() timed out"); } else if (result < 0) { - DLOGD("poll() failed with errno %s", getErrorString(getErrorCode())); + DLOGE("poll() failed with errno %s", getErrorString(getErrorCode())); break; } } else if (errorNum == EINTR) { /* nothing need to be done, just retry */ } else { /* fatal error from send() */ - DLOGD("sendto() failed with errno %s", getErrorString(errorNum)); + DLOGE("sendto() failed with errno %s", getErrorString(errorNum)); break; } diff --git a/src/source/Ice/TurnConnection.c b/src/source/Ice/TurnConnection.c index e1a833be35..460211700e 100644 --- a/src/source/Ice/TurnConnection.c +++ b/src/source/Ice/TurnConnection.c @@ -90,11 +90,11 @@ STATUS freeTurnConnection(PTurnConnection* ppTurnConnection) pTurnConnection = *ppTurnConnection; + // Ensure we are not freeing everything without cancelling the timer timerCallbackId = ATOMIC_EXCHANGE(&pTurnConnection->timerCallbackId, MAX_UINT32); if (timerCallbackId != MAX_UINT32) { CHK_LOG_ERR(timerQueueCancelTimer(pTurnConnection->timerQueueHandle, (UINT32) timerCallbackId, (UINT64) pTurnConnection)); } - // shutdown control channel if (pTurnConnection->pControlChannel) { CHK_LOG_ERR(connectionListenerRemoveConnection(pTurnConnection->pConnectionListener, pTurnConnection->pControlChannel)); @@ -924,6 +924,7 @@ STATUS turnConnectionStepState(PTurnConnection pTurnConnection) CHK(currentTime < pTurnConnection->stateTimeoutTime, STATUS_TURN_CONNECTION_STATE_TRANSITION_TIMEOUT); } + // fallthrough here, missing break intended case TURN_STATE_GET_CREDENTIALS: if (pTurnConnection->credentialObtained) { @@ -940,6 +941,8 @@ STATUS turnConnectionStepState(PTurnConnection pTurnConnection) pTurnConnection->state = TURN_STATE_ALLOCATION; pTurnConnection->stateTimeoutTime = currentTime + DEFAULT_TURN_ALLOCATION_TIMEOUT; + pTurnConnection->stateTryCountMax = DEFAULT_TURN_ALLOCATION_MAX_TRY_COUNT; + pTurnConnection->stateTryCount = 0; } else { CHK(currentTime < pTurnConnection->stateTimeoutTime, STATUS_TURN_CONNECTION_STATE_TRANSITION_TIMEOUT); } @@ -991,6 +994,8 @@ STATUS turnConnectionStepState(PTurnConnection pTurnConnection) pTurnConnection->stateTimeoutTime = currentTime + DEFAULT_TURN_CREATE_PERMISSION_TIMEOUT; } else { + pTurnConnection->stateTryCount++; + CHK(pTurnConnection->stateTryCount < pTurnConnection->stateTryCountMax, STATUS_TURN_CONNECTION_ALLOCAITON_FAILED); CHK(currentTime < pTurnConnection->stateTimeoutTime, STATUS_TURN_CONNECTION_STATE_TRANSITION_TIMEOUT); } break; @@ -1012,7 +1017,7 @@ STATUS turnConnectionStepState(PTurnConnection pTurnConnection) CHK(FALSE, retStatus); } - if (currentTime >= pTurnConnection->stateTimeoutTime) { + if (currentTime >= pTurnConnection->stateTimeoutTime || channelWithPermissionCount == pTurnConnection->turnPeerCount) { CHK(channelWithPermissionCount > 0, STATUS_TURN_CONNECTION_FAILED_TO_CREATE_PERMISSION); // go to next state if we have at least one ready peer @@ -1058,7 +1063,6 @@ STATUS turnConnectionStepState(PTurnConnection pTurnConnection) (UINT32) ATOMIC_LOAD(&pTurnConnection->timerCallbackId), pTurnConnection->currentTimerCallingPeriod)); } - break; case TURN_STATE_CLEAN_UP: @@ -1072,7 +1076,9 @@ STATUS turnConnectionStepState(PTurnConnection pTurnConnection) } CHK_STATUS(turnConnectionFreePreAllocatedPackets(pTurnConnection)); - CHK_STATUS(socketConnectionClosed(pTurnConnection->pControlChannel)); + if (pTurnConnection != NULL) { + CHK_STATUS(socketConnectionClosed(pTurnConnection->pControlChannel)); + } pTurnConnection->state = STATUS_SUCCEEDED(pTurnConnection->errorStatus) ? TURN_STATE_NEW : TURN_STATE_FAILED; ATOMIC_STORE_BOOL(&pTurnConnection->shutdownComplete, TRUE); } @@ -1109,6 +1115,12 @@ STATUS turnConnectionStepState(PTurnConnection pTurnConnection) if (STATUS_FAILED(retStatus) && pTurnConnection->state != TURN_STATE_FAILED) { pTurnConnection->errorStatus = retStatus; pTurnConnection->state = TURN_STATE_FAILED; + + if (pTurnConnection->turnConnectionCallbacks.turnStateFailedFn != NULL) { + pTurnConnection->turnConnectionCallbacks.turnStateFailedFn(pTurnConnection->pControlChannel, + pTurnConnection->turnConnectionCallbacks.customData); + } + /* fix up state to trigger transition into TURN_STATE_FAILED */ retStatus = STATUS_SUCCESS; } diff --git a/src/source/Ice/TurnConnection.h b/src/source/Ice/TurnConnection.h index 54df2bc280..cca70b6072 100644 --- a/src/source/Ice/TurnConnection.h +++ b/src/source/Ice/TurnConnection.h @@ -37,6 +37,8 @@ extern "C" { #define DEFAULT_TURN_CHANNEL_DATA_BUFFER_SIZE 512 #define DEFAULT_TURN_MAX_PEER_COUNT 32 +#define DEFAULT_TURN_ALLOCATION_MAX_TRY_COUNT 3 + // all turn channel numbers must be greater than 0x4000 and less than 0x7FFF #define TURN_CHANNEL_BIND_CHANNEL_NUMBER_BASE (UINT16) 0x4000 @@ -56,6 +58,7 @@ extern "C" { #define TURN_STATE_UNKNOWN_STR (PCHAR) "TURN_STATE_UNKNOWN" typedef STATUS (*RelayAddressAvailableFunc)(UINT64, PKvsIpAddress, PSocketConnection); +typedef STATUS (*TurnStateFailedFunc)(PSocketConnection, UINT64); typedef enum { TURN_STATE_NEW, @@ -90,6 +93,7 @@ typedef struct { typedef struct { UINT64 customData; RelayAddressAvailableFunc relayAddressAvailableFn; + TurnStateFailedFunc turnStateFailedFn; } TurnConnectionCallbacks, *PTurnConnectionCallbacks; typedef struct { @@ -140,6 +144,8 @@ struct __TurnConnection { TURN_CONNECTION_STATE state; UINT64 stateTimeoutTime; + UINT32 stateTryCount; + UINT32 stateTryCountMax; STATUS errorStatus; diff --git a/src/source/PeerConnection/DataChannel.c b/src/source/PeerConnection/DataChannel.c index bb66253b19..e8aee9a14a 100644 --- a/src/source/PeerConnection/DataChannel.c +++ b/src/source/PeerConnection/DataChannel.c @@ -30,7 +30,7 @@ STATUS createDataChannel(PRtcPeerConnection pPeerConnection, PCHAR pDataChannelN pKvsDataChannel->rtcDataChannelInit = *pRtcDataChannelInit; } else { // If nothing is set, set default to ordered mode - pKvsDataChannel->rtcDataChannelInit.ordered = FALSE; + pKvsDataChannel->rtcDataChannelInit.ordered = TRUE; NULLABLE_SET_EMPTY(pKvsDataChannel->rtcDataChannelInit.maxPacketLifeTime); NULLABLE_SET_EMPTY(pKvsDataChannel->rtcDataChannelInit.maxRetransmits); } diff --git a/src/source/PeerConnection/JitterBuffer.c b/src/source/PeerConnection/JitterBuffer.c index 2d919d07c6..300c3fe07c 100644 --- a/src/source/PeerConnection/JitterBuffer.c +++ b/src/source/PeerConnection/JitterBuffer.c @@ -32,11 +32,16 @@ STATUS createJitterBuffer(FrameReadyFunc onFrameReadyFunc, FrameDroppedFunc onFr } pJitterBuffer->maxLatency = pJitterBuffer->maxLatency * pJitterBuffer->clockRate / HUNDREDS_OF_NANOS_IN_A_SECOND; - pJitterBuffer->lastPushTimestamp = 0; + CHK(pJitterBuffer->maxLatency < MAX_RTP_TIMESTAMP, STATUS_INVALID_ARG); + + pJitterBuffer->tailTimestamp = 0; pJitterBuffer->headTimestamp = MAX_UINT32; - pJitterBuffer->headSequenceNumber = MAX_SEQUENCE_NUM; + pJitterBuffer->headSequenceNumber = MAX_RTP_SEQUENCE_NUM; + pJitterBuffer->tailSequenceNumber = MAX_RTP_SEQUENCE_NUM; pJitterBuffer->started = FALSE; pJitterBuffer->firstFrameProcessed = FALSE; + pJitterBuffer->timestampOverFlowState = FALSE; + pJitterBuffer->sequenceNumberOverflowState = FALSE; pJitterBuffer->customData = customData; CHK_STATUS(hashTableCreateWithParams(JITTER_BUFFER_HASH_TABLE_BUCKET_COUNT, JITTER_BUFFER_HASH_TABLE_BUCKET_LENGTH, @@ -70,7 +75,7 @@ STATUS freeJitterBuffer(PJitterBuffer* ppJitterBuffer) pJitterBuffer = *ppJitterBuffer; jitterBufferInternalParse(pJitterBuffer, TRUE); - jitterBufferDropBufferData(pJitterBuffer, 0, MAX_SEQUENCE_NUM, 0); + jitterBufferDropBufferData(pJitterBuffer, 0, MAX_RTP_SEQUENCE_NUM, 0); hashTableFree(pJitterBuffer->pPkgBufferHashTable); SAFE_MEMFREE(*ppJitterBuffer); @@ -82,6 +87,310 @@ STATUS freeJitterBuffer(PJitterBuffer* ppJitterBuffer) return retStatus; } +BOOL underflowPossible(PJitterBuffer pJitterBuffer, PRtpPacket pRtpPacket) +{ + BOOL retVal = FALSE; + UINT32 seqNoDifference = 0; + UINT64 timestampDifference = 0; + UINT64 maxTimePassed = 0; + if (pJitterBuffer->headTimestamp == pRtpPacket->header.timestamp) { + retVal = TRUE; + } else { + seqNoDifference = (MAX_RTP_SEQUENCE_NUM - pRtpPacket->header.sequenceNumber) + pJitterBuffer->headSequenceNumber; + if (pJitterBuffer->headTimestamp > pRtpPacket->header.timestamp) { + timestampDifference = pJitterBuffer->headTimestamp - pRtpPacket->header.timestamp; + } else { + timestampDifference = (MAX_RTP_TIMESTAMP - pRtpPacket->header.timestamp) + pJitterBuffer->headTimestamp; + } + + // 1 frame per second, and 1 packet per frame, the most charitable case we can consider + // TODO track most recent FPS to improve this metric + if ((MAX_RTP_TIMESTAMP / pJitterBuffer->clockRate) <= seqNoDifference) { + maxTimePassed = MAX_RTP_TIMESTAMP; + } else { + maxTimePassed = pJitterBuffer->clockRate * seqNoDifference; + } + + if (maxTimePassed >= timestampDifference) { + retVal = TRUE; + } + } + return retVal; +} + +BOOL headCheckingAllowed(PJitterBuffer pJitterBuffer, PRtpPacket pRtpPacket) +{ + BOOL retVal = FALSE; + /*If we haven't yet processed a frame yet, then we don't have a definitive way of knowing if + *the first packet we receive is actually the earliest packet we'll ever receive. Since sequence numbers + *can start anywhere from 0 - 65535, we need to incorporate some checks to determine if a newly received packet + *should be considered the new head. Part of how we determine this is by setting a limit to how many packets off we allow + *this out of order case to be. Without setting a limit, then we could run into an odd scenario. + * Example: + * Push->Packet->SeqNumber == 0. //FIRST PACKET! new head of buffer! + * Push->Packet->SeqNumber == 3. //... new head of 65532 packet sized frame? maybe? was 0 the tail? + * + * To resolve that insanity we set a MAX, and will use that MAX for the range. + * This logic is present in headSequenceNumberCheck() + * + *After the first frame has been processed we don't need or want to make this consideration, since if our parser has + *dropped a frame for a good reason then we want to ignore any packets from that dropped frame that may come later. + * + *However if the packet's timestamp is the same as the head timestamp, then it's possible this is simply an earlier + *sequence number of the same packet. + */ + if (!(pJitterBuffer->firstFrameProcessed) || pJitterBuffer->headTimestamp == pRtpPacket->header.timestamp) { + retVal = TRUE; + } + return retVal; +} + +// return true if pRtpPacket contains the head sequence number +BOOL headSequenceNumberCheck(PJitterBuffer pJitterBuffer, PRtpPacket pRtpPacket) +{ + BOOL retVal = FALSE; + UINT16 minimumHead = 0; + if (pJitterBuffer->headSequenceNumber >= MAX_OUT_OF_ORDER_PACKET_DIFFERENCE) { + minimumHead = pJitterBuffer->headSequenceNumber - MAX_OUT_OF_ORDER_PACKET_DIFFERENCE; + } + + // If we've already done this check and it was true + if (pJitterBuffer->headSequenceNumber == pRtpPacket->header.sequenceNumber) { + retVal = TRUE; + } else if (headCheckingAllowed(pJitterBuffer, pRtpPacket)) { + if (pJitterBuffer->sequenceNumberOverflowState) { + if (pJitterBuffer->tailSequenceNumber < pRtpPacket->header.sequenceNumber && + pJitterBuffer->headSequenceNumber > pRtpPacket->header.sequenceNumber && pRtpPacket->header.sequenceNumber >= minimumHead) { + // This purposefully misses the usecase where the buffer has >65000 entries. + // Our buffer is not designed for that use case, and it becomes far too ambiguous + // as to which packets are new tails or new heads without adding epoch checks. + pJitterBuffer->headSequenceNumber = pRtpPacket->header.sequenceNumber; + retVal = TRUE; + } + } else { + if (pRtpPacket->header.sequenceNumber < pJitterBuffer->headSequenceNumber) { + if (pRtpPacket->header.sequenceNumber >= minimumHead) { + pJitterBuffer->headSequenceNumber = pRtpPacket->header.sequenceNumber; + retVal = TRUE; + } + } + } + } + return retVal; +} + +// return true if pRtpPacket contains a new tail sequence number +BOOL tailSequenceNumberCheck(PJitterBuffer pJitterBuffer, PRtpPacket pRtpPacket) +{ + BOOL retVal = FALSE; + // If we've already done this check and it was true + if (pJitterBuffer->tailSequenceNumber == pRtpPacket->header.sequenceNumber) { + retVal = TRUE; + } else if (pRtpPacket->header.sequenceNumber > pJitterBuffer->tailSequenceNumber && + (!pJitterBuffer->sequenceNumberOverflowState || pJitterBuffer->headSequenceNumber > pRtpPacket->header.sequenceNumber)) { + retVal = TRUE; + pJitterBuffer->tailSequenceNumber = pRtpPacket->header.sequenceNumber; + } + return retVal; +} + +// return true if sequence numbers are now overflowing +BOOL enterSequenceNumberOverflowCheck(PJitterBuffer pJitterBuffer, PRtpPacket pRtpPacket) +{ + BOOL overflow = FALSE; + BOOL underflow = FALSE; + UINT16 packetsUntilOverflow = MAX_RTP_SEQUENCE_NUM - pJitterBuffer->tailSequenceNumber; + + if (!pJitterBuffer->sequenceNumberOverflowState) { + // overflow case + if (MAX_OUT_OF_ORDER_PACKET_DIFFERENCE >= packetsUntilOverflow) { + // It's possible sequence numbers and timestamps are both overflowing. + if (pRtpPacket->header.sequenceNumber < pJitterBuffer->tailSequenceNumber && + pRtpPacket->header.sequenceNumber <= MAX_OUT_OF_ORDER_PACKET_DIFFERENCE - packetsUntilOverflow) { + // Sequence number overflow detected + overflow = TRUE; + } + } + // underflow case + else if (headCheckingAllowed(pJitterBuffer, pRtpPacket)) { + if (pJitterBuffer->headSequenceNumber < MAX_OUT_OF_ORDER_PACKET_DIFFERENCE) { + if (pRtpPacket->header.sequenceNumber >= (MAX_UINT16 - (MAX_OUT_OF_ORDER_PACKET_DIFFERENCE - pJitterBuffer->headSequenceNumber))) { + // Possible sequence number underflow detected, now lets check the timestamps to be certain + // this is an earlier value, and not a much later. + if (underflowPossible(pJitterBuffer, pRtpPacket)) { + underflow = TRUE; + } + } + } + } + } + if (overflow && underflow) { + // This shouldn't be possible. + DLOGE("Critical underflow/overflow error in jitterbuffer"); + } + if (overflow) { + pJitterBuffer->sequenceNumberOverflowState = TRUE; + pJitterBuffer->tailSequenceNumber = pRtpPacket->header.sequenceNumber; + pJitterBuffer->tailTimestamp = pRtpPacket->header.timestamp; + } + if (underflow) { + pJitterBuffer->sequenceNumberOverflowState = TRUE; + pJitterBuffer->headSequenceNumber = pRtpPacket->header.sequenceNumber; + pJitterBuffer->headTimestamp = pRtpPacket->header.timestamp; + } + return (overflow || underflow); +} + +BOOL enterTimestampOverflowCheck(PJitterBuffer pJitterBuffer, PRtpPacket pRtpPacket) +{ + BOOL underflow = FALSE; + BOOL overflow = FALSE; + if (!pJitterBuffer->timestampOverFlowState) { + // overflow check + if (pJitterBuffer->headTimestamp > pRtpPacket->header.timestamp && pJitterBuffer->tailTimestamp > pRtpPacket->header.timestamp) { + // Check to see if this could be a timestamp overflow case + // We always check sequence number first, so the 'or equal to' checks if we just set the tail. + // That would be a corner case of sequence number and timestamp both overflowing + // in this one packet. + if (tailSequenceNumberCheck(pJitterBuffer, pRtpPacket)) { + // RTP timestamp overflow detected! + overflow = TRUE; + } + } + // underflow check + else if (pJitterBuffer->headTimestamp < pRtpPacket->header.timestamp && pJitterBuffer->tailTimestamp < pRtpPacket->header.timestamp) { + if (headSequenceNumberCheck(pJitterBuffer, pRtpPacket)) { + underflow = TRUE; + } + } + } + if (overflow && underflow) { + // This shouldn't be possible. + DLOGE("Critical underflow/overflow error in jitterbuffer"); + } + if (overflow) { + pJitterBuffer->timestampOverFlowState = TRUE; + pJitterBuffer->tailTimestamp = pRtpPacket->header.timestamp; + } else if (underflow) { + pJitterBuffer->timestampOverFlowState = TRUE; + pJitterBuffer->headTimestamp = pRtpPacket->header.timestamp; + } + return (underflow || overflow); +} + +BOOL exitSequenceNumberOverflowCheck(PJitterBuffer pJitterBuffer) +{ + BOOL retVal = FALSE; + + // can't exit if you're not in it + if (pJitterBuffer->sequenceNumberOverflowState) { + if (pJitterBuffer->headSequenceNumber <= pJitterBuffer->tailSequenceNumber) { + pJitterBuffer->sequenceNumberOverflowState = FALSE; + retVal = TRUE; + } + } + + return retVal; +} + +BOOL exitTimestampOverflowCheck(PJitterBuffer pJitterBuffer) +{ + BOOL retVal = FALSE; + + // can't exit if you're not in it + if (pJitterBuffer->timestampOverFlowState) { + if (pJitterBuffer->headTimestamp <= pJitterBuffer->tailTimestamp) { + pJitterBuffer->timestampOverFlowState = FALSE; + retVal = TRUE; + } + } + + return retVal; +} + +// return true if pRtpPacket contains a new head timestamp +BOOL headTimestampCheck(PJitterBuffer pJitterBuffer, PRtpPacket pRtpPacket) +{ + BOOL retVal = FALSE; + + if (headCheckingAllowed(pJitterBuffer, pRtpPacket)) { + if (pJitterBuffer->timestampOverFlowState) { + if (pJitterBuffer->headTimestamp > pRtpPacket->header.timestamp && pJitterBuffer->tailTimestamp < pRtpPacket->header.timestamp) { + // in the correct range to be a new head or new tail. + // if it's also the head sequence number then it's the new headtimestamp + if (headSequenceNumberCheck(pJitterBuffer, pRtpPacket)) { + pJitterBuffer->headTimestamp = pRtpPacket->header.timestamp; + retVal = TRUE; + } + } + } else { + if (pJitterBuffer->headTimestamp > pRtpPacket->header.timestamp || pJitterBuffer->tailTimestamp < pRtpPacket->header.timestamp) { + // in the correct range to be a new head or new tail. + // if it's also the head sequence number then it's the new headtimestamp + if (headSequenceNumberCheck(pJitterBuffer, pRtpPacket)) { + pJitterBuffer->headTimestamp = pRtpPacket->header.timestamp; + retVal = TRUE; + } + } + } + } + return retVal; +} + +// return true if pRtpPacket contains a new tail timestamp +BOOL tailTimestampCheck(PJitterBuffer pJitterBuffer, PRtpPacket pRtpPacket) +{ + BOOL retVal = FALSE; + + if (pJitterBuffer->tailTimestamp < pRtpPacket->header.timestamp) { + if (!pJitterBuffer->timestampOverFlowState || pJitterBuffer->headTimestamp > pRtpPacket->header.timestamp) { + // in the correct range to be a new head or new tail. + // if it's also the tail sequence number then it's the new tail timestamp + if (tailSequenceNumberCheck(pJitterBuffer, pRtpPacket)) { + pJitterBuffer->tailTimestamp = pRtpPacket->header.timestamp; + retVal = TRUE; + } + } + } + return retVal; +} + +// return true if pRtpPacket is within the latency tolerance (not much earlier than current head) +BOOL withinLatencyTolerance(PJitterBuffer pJitterBuffer, PRtpPacket pRtpPacket) +{ + BOOL retVal = FALSE; + UINT32 minimumTimestamp = 0; + + // Simple check, if we're at or past the tail timestamp then we're always within latency tolerance. + // overflow is checked earlier + if (tailTimestampCheck(pJitterBuffer, pRtpPacket) || pJitterBuffer->tailTimestamp == pRtpPacket->header.timestamp) { + retVal = TRUE; + } else { + // Is our tail current less than our head due to timestamp overflow? + if (pJitterBuffer->timestampOverFlowState) { + // calculate max-latency across the overflow boundry without triggering underflow + if (pJitterBuffer->tailTimestamp < pJitterBuffer->maxLatency) { + minimumTimestamp = MAX_RTP_TIMESTAMP - (pJitterBuffer->maxLatency - pJitterBuffer->tailTimestamp); + } + // Is the packet within the current range or is it a new head/tail + if (pRtpPacket->header.timestamp < pJitterBuffer->tailTimestamp || pRtpPacket->header.timestamp > pJitterBuffer->headTimestamp) { + // The packet is within the current range + retVal = TRUE; + } + // The only remaining option is that timestamp must be before headTimestamp + else if (pRtpPacket->header.timestamp >= minimumTimestamp) { + retVal = TRUE; + } + } else { + if ((pRtpPacket->header.timestamp < pJitterBuffer->maxLatency && pJitterBuffer->tailTimestamp <= pJitterBuffer->maxLatency) || + pRtpPacket->header.timestamp >= pJitterBuffer->tailTimestamp - pJitterBuffer->maxLatency) { + retVal = TRUE; + } + } + } + return retVal; +} + STATUS jitterBufferPush(PJitterBuffer pJitterBuffer, PRtpPacket pRtpPacket, PBOOL pPacketDiscarded) { ENTERS(); @@ -95,16 +404,27 @@ STATUS jitterBufferPush(PJitterBuffer pJitterBuffer, PRtpPacket pRtpPacket, PBOO // Set to started and initialize the sequence number pJitterBuffer->started = TRUE; pJitterBuffer->headSequenceNumber = pRtpPacket->header.sequenceNumber; + pJitterBuffer->tailSequenceNumber = pRtpPacket->header.sequenceNumber; pJitterBuffer->headTimestamp = pRtpPacket->header.timestamp; } - if (pJitterBuffer->lastPushTimestamp < pRtpPacket->header.timestamp) { - pJitterBuffer->lastPushTimestamp = pRtpPacket->header.timestamp; + // We'll check sequence numbers first, with our MAX Out of Order packet count to avoid + // defining a timestamp window for overflow + // Returning true means this packet is a new tail AND we've entered overflow state. + if (!enterSequenceNumberOverflowCheck(pJitterBuffer, pRtpPacket)) { + tailSequenceNumberCheck(pJitterBuffer, pRtpPacket); + } else { + DLOGS("Entered sequenceNumber overflow state"); + } + + if (!enterTimestampOverflowCheck(pJitterBuffer, pRtpPacket)) { + tailTimestampCheck(pJitterBuffer, pRtpPacket); + } else { + DLOGS("Entered timestamp overflow state"); } // is the packet within the accepted latency range, if so, add it to the hashtable - if ((pRtpPacket->header.timestamp < pJitterBuffer->maxLatency && pJitterBuffer->lastPushTimestamp <= pJitterBuffer->maxLatency) || - pRtpPacket->header.timestamp >= pJitterBuffer->lastPushTimestamp - pJitterBuffer->maxLatency) { + if (withinLatencyTolerance(pJitterBuffer, pRtpPacket)) { status = hashTableGet(pJitterBuffer->pPkgBufferHashTable, pRtpPacket->header.sequenceNumber, &hashValue); pCurPacket = (PRtpPacket) hashValue; if (STATUS_SUCCEEDED(status) && pCurPacket != NULL) { @@ -114,38 +434,13 @@ STATUS jitterBufferPush(PJitterBuffer pJitterBuffer, PRtpPacket pRtpPacket, PBOO CHK_STATUS(hashTablePut(pJitterBuffer->pPkgBufferHashTable, pRtpPacket->header.sequenceNumber, (UINT64) pRtpPacket)); - /*If we haven't yet processed a frame yet, then we don't have a definitive way of knowing if - *the first packet we receive is actually the earliest packet we'll ever receive. Since sequence numbers - *can start anywhere from 0 - 65535, we need to incorporate some checks to determine if a newly received packet - *should be considered the new head. Part of how we determine this is by setting a limit to how many packets off we allow - *this out of order case to be. Without setting a limit, then we could run into an odd scenario. - * Example: - * Push->Packet->SeqNumber == 0. //FIRST PACKET! new head of buffer! - * Push->Packet->SeqNumber == 3. //... new head of 65532 packet sized frame? maybe? was 0 the tail? - * - * To resolve that insanity we set a MAX, and will use that MAX for the range. - * - *After the first frame has been processed we don't need or want to make this consideration, since if our parser has - *dropped a frame for a good reason then we want to ignore any packets from that dropped frame that may come later. - */ - if (!(pJitterBuffer->firstFrameProcessed)) { + if (headCheckingAllowed(pJitterBuffer, pRtpPacket)) { // if the timestamp is less, we'll accept it as a new head, since it must be an earlier frame. - if (pRtpPacket->header.timestamp < pJitterBuffer->headTimestamp) { - pJitterBuffer->headSequenceNumber = pRtpPacket->header.sequenceNumber; - pJitterBuffer->headTimestamp = pRtpPacket->header.timestamp; + if (headTimestampCheck(pJitterBuffer, pRtpPacket)) { + DLOGS("New jitterbuffer head timestamp"); } - // timestamp is equal, we're in the same frame. - else if (pRtpPacket->header.timestamp == pJitterBuffer->headTimestamp) { - if (pJitterBuffer->headSequenceNumber < MAX_OUT_OF_ORDER_PACKET_DIFFERENCE) { - if ((pRtpPacket->header.sequenceNumber >= - (MAX_UINT16 - (MAX_OUT_OF_ORDER_PACKET_DIFFERENCE - pJitterBuffer->headSequenceNumber))) || - (pJitterBuffer->headSequenceNumber > pRtpPacket->header.sequenceNumber)) { - pJitterBuffer->headSequenceNumber = pRtpPacket->header.sequenceNumber; - } - } else if ((pRtpPacket->header.sequenceNumber >= pJitterBuffer->headSequenceNumber - MAX_OUT_OF_ORDER_PACKET_DIFFERENCE) && - (pRtpPacket->header.sequenceNumber < pJitterBuffer->headSequenceNumber)) { - pJitterBuffer->headSequenceNumber = pRtpPacket->header.sequenceNumber; - } + if (headSequenceNumberCheck(pJitterBuffer, pRtpPacket)) { + DLOGS("New jitterbuffer head sequenceNumber"); } } // DONE with considering the head. @@ -187,13 +482,13 @@ STATUS jitterBufferInternalParse(PJitterBuffer pJitterBuffer, BOOL bufferClosed) PRtpPacket pCurPacket = NULL; CHK(pJitterBuffer != NULL && pJitterBuffer->onFrameDroppedFn != NULL && pJitterBuffer->onFrameReadyFn != NULL, STATUS_NULL_ARG); - CHK(pJitterBuffer->lastPushTimestamp != 0, retStatus); + CHK(pJitterBuffer->tailTimestamp != 0, retStatus); - if (pJitterBuffer->lastPushTimestamp > pJitterBuffer->maxLatency) { - earliestAllowedTimestamp = pJitterBuffer->lastPushTimestamp - pJitterBuffer->maxLatency; + if (pJitterBuffer->tailTimestamp > pJitterBuffer->maxLatency) { + earliestAllowedTimestamp = pJitterBuffer->tailTimestamp - pJitterBuffer->maxLatency; } - lastIndex = pJitterBuffer->headSequenceNumber - 1; + lastIndex = pJitterBuffer->tailSequenceNumber + 1; index = pJitterBuffer->headSequenceNumber; startDropIndex = index; // Loop through entire buffer to find complete frames. @@ -210,7 +505,6 @@ STATUS jitterBufferInternalParse(PJitterBuffer pJitterBuffer, BOOL bufferClosed) * *The buffer is parsed in order of sequence numbers. It is important to note that if the Frame ready *conditions have been met from dropping an earlier frame, then it will be processed. - * */ for (; index != lastIndex; index++) { CHK_STATUS(hashTableContains(pJitterBuffer->pPkgBufferHashTable, index, &hasEntry)); @@ -221,12 +515,14 @@ STATUS jitterBufferInternalParse(PJitterBuffer pJitterBuffer, BOOL bufferClosed) } else { lastNonNullIndex = index; retStatus = hashTableGet(pJitterBuffer->pPkgBufferHashTable, index, &hashValue); - pCurPacket = (PRtpPacket) hashValue; - if (retStatus == STATUS_SUCCESS || retStatus == STATUS_HASH_KEY_NOT_PRESENT) { - retStatus = STATUS_SUCCESS; + if (retStatus == STATUS_HASH_KEY_NOT_PRESENT) { + // should be unreachable, this means hashTablContains() said we had it but hashTableGet() couldn't find it. + continue; } else { - CHK(FALSE, retStatus); + CHK_STATUS(retStatus); } + pCurPacket = (PRtpPacket) hashValue; + CHK(pCurPacket != NULL, STATUS_NULL_ARG); curTimestamp = pCurPacket->header.timestamp; // new timestamp on an RTP packet means new frame if (curTimestamp != pJitterBuffer->headTimestamp) { @@ -240,10 +536,10 @@ STATUS jitterBufferInternalParse(PJitterBuffer pJitterBuffer, BOOL bufferClosed) startDropIndex = index; containStartForEarliestFrame = FALSE; } - // are we force clearing out the buffer? if so drop the contents of incomplete frame + // are we forcibly clearing out the buffer? if so drop the contents of incomplete frame else if (pJitterBuffer->headTimestamp < earliestAllowedTimestamp || bufferClosed) { - CHK_STATUS( - pJitterBuffer->onFrameDroppedFn(pJitterBuffer->customData, startDropIndex, UINT16_DEC(index), pJitterBuffer->headTimestamp)); + // do not CHK_STATUS of onFrameDropped because we need to clear the jitter buffer no matter what else happens. + pJitterBuffer->onFrameDroppedFn(pJitterBuffer->customData, startDropIndex, UINT16_DEC(index), pJitterBuffer->headTimestamp); CHK_STATUS(jitterBufferDropBufferData(pJitterBuffer, startDropIndex, UINT16_DEC(index), curTimestamp)); pJitterBuffer->firstFrameProcessed = TRUE; isFrameDataContinuous = TRUE; @@ -315,12 +611,20 @@ STATUS jitterBufferDropBufferData(PJitterBuffer pJitterBuffer, UINT16 startIndex if (hasEntry) { CHK_STATUS(hashTableGet(pJitterBuffer->pPkgBufferHashTable, index, &hashValue)); pCurPacket = (PRtpPacket) hashValue; - freeRtpPacket(&pCurPacket); + if (pCurPacket) { + freeRtpPacket(&pCurPacket); + } CHK_STATUS(hashTableRemove(pJitterBuffer->pPkgBufferHashTable, index)); } } pJitterBuffer->headTimestamp = nextTimestamp; pJitterBuffer->headSequenceNumber = endIndex + 1; + if (exitTimestampOverflowCheck(pJitterBuffer)) { + DLOGS("Exited timestamp overflow state"); + } + if (exitSequenceNumberOverflowCheck(pJitterBuffer)) { + DLOGS("Exited sequenceNumber overflow state"); + } CleanUp: CHK_LOG_ERR(retStatus); @@ -344,13 +648,8 @@ STATUS jitterBufferFillFrameData(PJitterBuffer pJitterBuffer, PBYTE pFrame, UINT CHK(pJitterBuffer != NULL && pFrame != NULL && pFilledSize != NULL, STATUS_NULL_ARG); for (; UINT16_DEC(index) != endIndex; index++) { hashValue = 0; - retStatus = hashTableGet(pJitterBuffer->pPkgBufferHashTable, index, &hashValue); + CHK_STATUS(hashTableGet(pJitterBuffer->pPkgBufferHashTable, index, &hashValue)); pCurPacket = (PRtpPacket) hashValue; - if (retStatus == STATUS_SUCCESS || retStatus == STATUS_HASH_KEY_NOT_PRESENT) { - retStatus = STATUS_SUCCESS; - } else { - CHK(FALSE, retStatus); - } CHK(pCurPacket != NULL, STATUS_NULL_ARG); partialFrameSize = remainingFrameSize; CHK_STATUS(pJitterBuffer->depayPayloadFn(pCurPacket->payload, pCurPacket->payloadLength, pCurPtrInFrame, &partialFrameSize, NULL)); diff --git a/src/source/PeerConnection/JitterBuffer.h b/src/source/PeerConnection/JitterBuffer.h index a5a0ca59be..543b05c78c 100644 --- a/src/source/PeerConnection/JitterBuffer.h +++ b/src/source/PeerConnection/JitterBuffer.h @@ -28,14 +28,19 @@ typedef struct { UINT64 transit; // holds estimated jitter, in clockRate units DOUBLE jitter; - UINT32 lastPushTimestamp; UINT16 headSequenceNumber; + UINT16 tailSequenceNumber; UINT32 headTimestamp; + UINT32 tailTimestamp; + // this is set to U64 even though rtp timestamps are U32 + // in order to allow calculations to not cause overflow UINT64 maxLatency; UINT64 customData; UINT32 clockRate; BOOL started; BOOL firstFrameProcessed; + BOOL sequenceNumberOverflowState; + BOOL timestampOverFlowState; PHashTable pPkgBufferHashTable; } JitterBuffer, *PJitterBuffer; diff --git a/src/source/PeerConnection/PeerConnection.c b/src/source/PeerConnection/PeerConnection.c index 3e4de6823a..5da590b125 100644 --- a/src/source/PeerConnection/PeerConnection.c +++ b/src/source/PeerConnection/PeerConnection.c @@ -35,6 +35,7 @@ STATUS allocateSrtp(PKvsPeerConnection pKvsPeerConnection) return retStatus; } +#ifdef ENABLE_DATA_CHANNEL STATUS allocateSctpSortDataChannelsDataCallback(UINT64 customData, PHashEntry pHashEntry) { STATUS retStatus = STATUS_SUCCESS; @@ -106,6 +107,7 @@ STATUS allocateSctp(PKvsPeerConnection pKvsPeerConnection) CleanUp: return retStatus; } +#endif VOID onInboundPacket(UINT64 customData, PBYTE buff, UINT32 buffLen) { @@ -130,9 +132,11 @@ VOID onInboundPacket(UINT64 customData, PBYTE buff, UINT32 buffLen) if (buff[0] > 19 && buff[0] < 64) { dtlsSessionProcessPacket(pKvsPeerConnection->pDtlsSession, buff, &signedBuffLen); +#ifdef ENABLE_DATA_CHANNEL if (signedBuffLen > 0) { CHK_STATUS(putSctpPacket(pKvsPeerConnection->pSctpSession, buff, signedBuffLen)); } +#endif CHK_STATUS(dtlsSessionIsInitFinished(pKvsPeerConnection->pDtlsSession, &isDtlsConnected)); if (isDtlsConnected) { @@ -264,6 +268,22 @@ STATUS changePeerConnectionState(PKvsPeerConnection pKvsPeerConnection, RTC_PEER MUTEX_LOCK(pKvsPeerConnection->peerConnectionObjLock); locked = TRUE; + switch (newState) { + case RTC_PEER_CONNECTION_STATE_CONNECTING: + if (pKvsPeerConnection->iceConnectingStartTime == 0) { + pKvsPeerConnection->iceConnectingStartTime = GETTIME(); + } + break; + case RTC_PEER_CONNECTION_STATE_CONNECTED: + if (pKvsPeerConnection->iceConnectingStartTime != 0) { + PROFILE_WITH_START_TIME_OBJ(pKvsPeerConnection->iceConnectingStartTime, + pKvsPeerConnection->peerConnectionDiagnostics.iceHolePunchingTime, "ICE Hole Punching Time"); + pKvsPeerConnection->iceConnectingStartTime = 0; + } + break; + default: + break; + } /* new and closed state are terminal*/ CHK(pKvsPeerConnection->connectionState != newState && pKvsPeerConnection->connectionState != RTC_PEER_CONNECTION_STATE_FAILED && @@ -363,7 +383,6 @@ STATUS onFrameDroppedFunc(UINT64 customData, UINT16 startIndex, UINT16 endIndex, } else { CHK(FALSE, retStatus); } - // TODO: handle multi-packet frames CHK(pPacket != NULL, STATUS_NULL_ARG); MUTEX_LOCK(pTransceiver->statsLock); // https://www.w3.org/TR/webrtc-stats/#dom-rtcinboundrtpstreamstats-jitterbufferdelay @@ -420,7 +439,6 @@ VOID onIceConnectionStateChange(UINT64 customData, UINT64 connectionState) if (startDtlsSession) { CHK_STATUS(dtlsSessionIsInitFinished(pKvsPeerConnection->pDtlsSession, &dtlsConnected)); - if (dtlsConnected) { // In ICE restart scenario, DTLS handshake is not going to be reset. Therefore, we need to check // if the DTLS state has been connected. @@ -571,6 +589,9 @@ VOID onDtlsStateChange(UINT64 customData, RTC_DTLS_TRANSPORT_STATE newDtlsState) pKvsPeerConnection = (PKvsPeerConnection) customData; switch (newDtlsState) { + case RTC_DTLS_TRANSPORT_STATE_CONNECTED: + pKvsPeerConnection->peerConnectionDiagnostics.dtlsSessionSetupTime = pKvsPeerConnection->pDtlsSession->dtlsSessionSetupTime; + break; case RTC_DTLS_TRANSPORT_STATE_CLOSED: changePeerConnectionState(pKvsPeerConnection, RTC_PEER_CONNECTION_STATE_CLOSED); break; @@ -674,9 +695,11 @@ STATUS createPeerConnection(PRtcConfiguration pConfiguration, PRtcPeerConnection IceAgentCallbacks iceAgentCallbacks; DtlsSessionCallbacks dtlsSessionCallbacks; PConnectionListener pConnectionListener = NULL; + UINT64 startTime = 0; CHK(pConfiguration != NULL && ppPeerConnection != NULL, STATUS_NULL_ARG); + startTime = GETTIME(); MEMSET(&iceAgentCallbacks, 0, SIZEOF(IceAgentCallbacks)); MEMSET(&dtlsSessionCallbacks, 0, SIZEOF(DtlsSessionCallbacks)); @@ -700,6 +723,8 @@ STATUS createPeerConnection(PRtcConfiguration pConfiguration, PRtcPeerConnection CHK_STATUS(hashTableCreateWithParams(CODEC_HASH_TABLE_BUCKET_COUNT, CODEC_HASH_TABLE_BUCKET_LENGTH, &pKvsPeerConnection->pDataChannels)); CHK_STATUS(hashTableCreateWithParams(RTX_HASH_TABLE_BUCKET_COUNT, RTX_HASH_TABLE_BUCKET_LENGTH, &pKvsPeerConnection->pRtxTable)); CHK_STATUS(doubleListCreate(&(pKvsPeerConnection->pTransceivers))); + CHK_STATUS(doubleListCreate(&(pKvsPeerConnection->pFakeTransceivers))); + CHK_STATUS(doubleListCreate(&(pKvsPeerConnection->pAnswerTransceivers))); pKvsPeerConnection->pSrtpSessionLock = MUTEX_CREATE(TRUE); pKvsPeerConnection->peerConnectionObjLock = MUTEX_CREATE(FALSE); @@ -733,6 +758,9 @@ STATUS createPeerConnection(PRtcConfiguration pConfiguration, PRtcPeerConnection if (STATUS_FAILED(retStatus)) { freePeerConnection((PRtcPeerConnection*) &pKvsPeerConnection); + } else { + PROFILE_WITH_START_TIME_OBJ(startTime, pKvsPeerConnection->peerConnectionDiagnostics.peerConnectionCreationTime, + "Peer connection object creation time"); } LEAVES(); @@ -756,6 +784,7 @@ STATUS freePeerConnection(PRtcPeerConnection* ppPeerConnection) PKvsPeerConnection pKvsPeerConnection; PDoubleListNode pCurNode = NULL; UINT64 item = 0; + UINT64 startTime; CHK(ppPeerConnection != NULL, STATUS_NULL_ARG); @@ -763,6 +792,7 @@ STATUS freePeerConnection(PRtcPeerConnection* ppPeerConnection) CHK(pKvsPeerConnection != NULL, retStatus); + startTime = GETTIME(); /* Shutdown IceAgent first so there is no more incoming packets which can cause * SCTP to be allocated again after SCTP is freed. */ CHK_LOG_ERR(iceAgentShutdown(pKvsPeerConnection->pIceAgent)); @@ -774,7 +804,9 @@ STATUS freePeerConnection(PRtcPeerConnection* ppPeerConnection) /* Free structs that have their own thread. SCTP has threads created by SCTP library. IceAgent has the * connectionListener thread. Free SCTP first so it wont try to send anything through ICE. */ +#ifdef ENABLE_DATA_CHANNEL CHK_LOG_ERR(freeSctpSession(&pKvsPeerConnection->pSctpSession)); +#endif CHK_LOG_ERR(freeIceAgent(&pKvsPeerConnection->pIceAgent)); // free transceivers @@ -786,6 +818,14 @@ STATUS freePeerConnection(PRtcPeerConnection* ppPeerConnection) pCurNode = pCurNode->pNext; } + CHK_LOG_ERR(doubleListGetHeadNode(pKvsPeerConnection->pFakeTransceivers, &pCurNode)); + while (pCurNode != NULL) { + CHK_LOG_ERR(doubleListGetNodeData(pCurNode, &item)); + CHK_LOG_ERR(freeKvsRtpTransceiver((PKvsRtpTransceiver*) &item)); + + pCurNode = pCurNode->pNext; + } + // Free DataChannels CHK_LOG_ERR(hashTableIterateEntries(pKvsPeerConnection->pDataChannels, 0, freeHashEntry)); CHK_LOG_ERR(hashTableFree(pKvsPeerConnection->pDataChannels)); @@ -794,6 +834,8 @@ STATUS freePeerConnection(PRtcPeerConnection* ppPeerConnection) CHK_LOG_ERR(freeSrtpSession(&pKvsPeerConnection->pSrtpSession)); CHK_LOG_ERR(freeDtlsSession(&pKvsPeerConnection->pDtlsSession)); CHK_LOG_ERR(doubleListFree(pKvsPeerConnection->pTransceivers)); + CHK_LOG_ERR(doubleListFree(pKvsPeerConnection->pFakeTransceivers)); + CHK_LOG_ERR(doubleListFree(pKvsPeerConnection->pAnswerTransceivers)); CHK_LOG_ERR(hashTableFree(pKvsPeerConnection->pCodecTable)); CHK_LOG_ERR(hashTableFree(pKvsPeerConnection->pRtxTable)); if (IS_VALID_MUTEX_VALUE(pKvsPeerConnection->pSrtpSessionLock)) { @@ -818,8 +860,8 @@ STATUS freePeerConnection(PRtcPeerConnection* ppPeerConnection) SAFE_MEMFREE(pKvsPeerConnection->pTwccManager); } + PROFILE_WITH_START_TIME_OBJ(startTime, pKvsPeerConnection->peerConnectionDiagnostics.freePeerConnectionTime, "Free peer connection"); SAFE_MEMFREE(*ppPeerConnection); - CleanUp: LEAVES(); @@ -1030,6 +1072,9 @@ STATUS setRemoteDescription(PRtcPeerConnection pPeerConnection, PRtcSessionDescr STRNCPY(pKvsPeerConnection->remoteCertificateFingerprint, pSessionDescription->sdpAttributes[i].attributeValue + 8, CERTIFICATE_FINGERPRINT_LENGTH); } else if (pKvsPeerConnection->isOffer && STRCMP(pSessionDescription->sdpAttributes[i].attributeName, "setup") == 0) { + // possible values are actpass, passive and active. If the incoming SDP has active, it indicates it is taking up a client role + // In case of actpass and passive, the other peer is taking up a server role and is waiting for incoming connection + // Reference: https://www.rfc-editor.org/rfc/rfc4572#section-6.2 pKvsPeerConnection->dtlsIsServer = STRCMP(pSessionDescription->sdpAttributes[i].attributeValue, "active") == 0; } else if (STRCMP(pSessionDescription->sdpAttributes[i].attributeName, "ice-options") == 0 && STRSTR(pSessionDescription->sdpAttributes[i].attributeValue, "trickle") != NULL) { @@ -1079,12 +1124,14 @@ STATUS setRemoteDescription(PRtcPeerConnection pPeerConnection, PRtcSessionDescr CHK_STATUS(generateJSONSafeString(pKvsPeerConnection->localIceUfrag, LOCAL_ICE_UFRAG_LEN)); CHK_STATUS(generateJSONSafeString(pKvsPeerConnection->localIcePwd, LOCAL_ICE_PWD_LEN)); CHK_STATUS(iceAgentRestart(pKvsPeerConnection->pIceAgent, pKvsPeerConnection->localIceUfrag, pKvsPeerConnection->localIcePwd)); + // This starts the gathering process timer callback that periodically checks for local candidate list CHK_STATUS(iceAgentStartGathering(pKvsPeerConnection->pIceAgent)); } STRNCPY(pKvsPeerConnection->remoteIceUfrag, remoteIceUfrag, MAX_ICE_UFRAG_LEN); STRNCPY(pKvsPeerConnection->remoteIcePwd, remoteIcePwd, MAX_ICE_PWD_LEN); + // This starts the state machine timer callback that transitions states periodically CHK_STATUS(iceAgentStartAgent(pKvsPeerConnection->pIceAgent, pKvsPeerConnection->remoteIceUfrag, pKvsPeerConnection->remoteIcePwd, pKvsPeerConnection->isOffer)); @@ -1330,10 +1377,11 @@ STATUS closePeerConnection(PRtcPeerConnection pPeerConnection) ENTERS(); STATUS retStatus = STATUS_SUCCESS; PKvsPeerConnection pKvsPeerConnection = (PKvsPeerConnection) pPeerConnection; - + UINT64 startTime = GETTIME(); CHK(pKvsPeerConnection != NULL, STATUS_NULL_ARG); CHK_LOG_ERR(dtlsSessionShutdown(pKvsPeerConnection->pDtlsSession)); CHK_LOG_ERR(iceAgentShutdown(pKvsPeerConnection->pIceAgent)); + PROFILE_WITH_START_TIME_OBJ(startTime, pKvsPeerConnection->peerConnectionDiagnostics.closePeerConnectionTime, "Close peer connection"); CleanUp: @@ -1343,7 +1391,7 @@ STATUS closePeerConnection(PRtcPeerConnection pPeerConnection) return retStatus; } -PUBLIC_API NullableBool canTrickleIceCandidates(PRtcPeerConnection pPeerConnection) +NullableBool canTrickleIceCandidates(PRtcPeerConnection pPeerConnection) { NullableBool canTrickle = {FALSE, FALSE}; PKvsPeerConnection pKvsPeerConnection = (PKvsPeerConnection) pPeerConnection; @@ -1455,3 +1503,37 @@ STATUS twccManagerOnPacketSent(PKvsPeerConnection pc, PRtpPacket pRtpPacket) LEAVES(); return retStatus; } + +STATUS peerConnectionGetMetrics(PRtcPeerConnection pPeerConnection, PPeerConnectionMetrics pPeerConnectionMetrics) +{ + STATUS retStatus = STATUS_SUCCESS; + PKvsPeerConnection pKvsPeerConnection = (PKvsPeerConnection) pPeerConnection; + CHK(pKvsPeerConnection != NULL && pPeerConnectionMetrics != NULL, STATUS_NULL_ARG); + if (pPeerConnectionMetrics->version > PEER_CONNECTION_METRICS_CURRENT_VERSION) { + DLOGW("Peer connection metrics object version invalid..setting to highest default version %d", PEER_CONNECTION_METRICS_CURRENT_VERSION); + pPeerConnectionMetrics->version = PEER_CONNECTION_METRICS_CURRENT_VERSION; + } + pPeerConnectionMetrics->peerConnectionStats.peerConnectionCreationTime = pKvsPeerConnection->peerConnectionDiagnostics.peerConnectionCreationTime; + pPeerConnectionMetrics->peerConnectionStats.dtlsSessionSetupTime = pKvsPeerConnection->peerConnectionDiagnostics.dtlsSessionSetupTime; + pPeerConnectionMetrics->peerConnectionStats.iceHolePunchingTime = pKvsPeerConnection->peerConnectionDiagnostics.iceHolePunchingTime; + // Cannot record these 2 in here because peer connection object would become NULL after clearing. Need another strategy + pPeerConnectionMetrics->peerConnectionStats.closePeerConnectionTime = pKvsPeerConnection->peerConnectionDiagnostics.closePeerConnectionTime; + pPeerConnectionMetrics->peerConnectionStats.freePeerConnectionTime = pKvsPeerConnection->peerConnectionDiagnostics.freePeerConnectionTime; +CleanUp: + return retStatus; +} + +STATUS iceAgentGetMetrics(PRtcPeerConnection pPeerConnection, PKvsIceAgentMetrics pKvsIceAgentMetrics) +{ + STATUS retStatus = STATUS_SUCCESS; + PKvsPeerConnection pKvsPeerConnection = (PKvsPeerConnection) pPeerConnection; + CHK(pKvsPeerConnection != NULL && pKvsIceAgentMetrics != NULL, STATUS_NULL_ARG); + + if (pKvsIceAgentMetrics->version > ICE_AGENT_METRICS_CURRENT_VERSION) { + DLOGW("ICE agent metrics object version invalid..setting to highest default version %d", PEER_CONNECTION_METRICS_CURRENT_VERSION); + pKvsIceAgentMetrics->version = ICE_AGENT_METRICS_CURRENT_VERSION; + } + CHK_STATUS(getIceAgentStats(pKvsPeerConnection->pIceAgent, pKvsIceAgentMetrics)); +CleanUp: + return retStatus; +} diff --git a/src/source/PeerConnection/PeerConnection.h b/src/source/PeerConnection/PeerConnection.h index cc48b5b7ef..67cfe713d8 100644 --- a/src/source/PeerConnection/PeerConnection.h +++ b/src/source/PeerConnection/PeerConnection.h @@ -57,6 +57,14 @@ typedef struct { UINT16 lastReportedSeqNum; } TwccManager, *PTwccManager; +typedef struct { + UINT64 peerConnectionCreationTime; + UINT64 dtlsSessionSetupTime; + UINT64 iceHolePunchingTime; + UINT64 closePeerConnectionTime; + UINT64 freePeerConnectionTime; +} KvsPeerConnectionDiagnostics, *PKvsPeerConnectionDiagnostics; + typedef struct { RtcPeerConnection peerConnection; // UINT32 padding padding makes transportWideSequenceNumber 64bit aligned @@ -77,6 +85,9 @@ typedef struct { SessionDescription remoteSessionDescription; PDoubleList pTransceivers; + PDoubleList pFakeTransceivers; + PDoubleList pAnswerTransceivers; + BOOL sctpIsEnabled; CHAR localIceUfrag[LOCAL_ICE_UFRAG_LEN + 1]; @@ -128,6 +139,9 @@ typedef struct { PTwccManager pTwccManager; RtcOnSenderBandwidthEstimation onSenderBandwidthEstimation; UINT64 onSenderBandwidthEstimationCustomData; + + UINT64 iceConnectingStartTime; + KvsPeerConnectionDiagnostics peerConnectionDiagnostics; } KvsPeerConnection, *PKvsPeerConnection; typedef struct { diff --git a/src/source/PeerConnection/SessionDescription.c b/src/source/PeerConnection/SessionDescription.c index cab1eb0662..a3fedc2cc4 100644 --- a/src/source/PeerConnection/SessionDescription.c +++ b/src/source/PeerConnection/SessionDescription.c @@ -387,7 +387,8 @@ UINT64 getH264FmtpScore(PCHAR fmtp) // Populate a single media section from a PKvsRtpTransceiver STATUS populateSingleMediaSection(PKvsPeerConnection pKvsPeerConnection, PKvsRtpTransceiver pKvsRtpTransceiver, PSdpMediaDescription pSdpMediaDescription, PSessionDescription pRemoteSessionDescription, - PCHAR pCertificateFingerprint, UINT32 mediaSectionId, PCHAR pDtlsRole) + PCHAR pCertificateFingerprint, UINT32 mediaSectionId, PCHAR pDtlsRole, PHashTable pUnknownCodecPayloadTypesTable, + PHashTable pUnknownCodecRtpmapTable, UINT32 unknownCodecHashTableKey) { ENTERS(); STATUS retStatus = STATUS_SUCCESS; @@ -397,18 +398,23 @@ STATUS populateSingleMediaSection(PKvsPeerConnection pKvsPeerConnection, PKvsRtp UINT32 i, remoteAttributeCount, attributeCount = 0; PRtcMediaStreamTrack pRtcMediaStreamTrack = &(pKvsRtpTransceiver->sender.track); PSdpMediaDescription pSdpMediaDescriptionRemote; - PCHAR currentFmtp = NULL; + PCHAR currentFmtp = NULL, rtpMapValue = NULL; - CHK_STATUS(hashTableGet(pKvsPeerConnection->pCodecTable, pRtcMediaStreamTrack->codec, &payloadType)); - currentFmtp = fmtpForPayloadType(payloadType, &(pKvsPeerConnection->remoteSessionDescription)); + if (pRtcMediaStreamTrack->codec == RTC_CODEC_UNKNOWN && pUnknownCodecPayloadTypesTable != NULL) { + CHK_STATUS(hashTableGet(pUnknownCodecPayloadTypesTable, unknownCodecHashTableKey, &payloadType)); + } else { + CHK_STATUS(hashTableGet(pKvsPeerConnection->pCodecTable, pRtcMediaStreamTrack->codec, &payloadType)); + currentFmtp = fmtpForPayloadType(payloadType, &(pKvsPeerConnection->remoteSessionDescription)); + } - if (pRtcMediaStreamTrack->codec == RTC_CODEC_H264_PROFILE_42E01F_LEVEL_ASYMMETRY_ALLOWED_PACKETIZATION_MODE || - pRtcMediaStreamTrack->codec == RTC_CODEC_VP8) { + if (pRtcMediaStreamTrack->kind == MEDIA_STREAM_TRACK_KIND_VIDEO) { if (pRtcMediaStreamTrack->codec == RTC_CODEC_H264_PROFILE_42E01F_LEVEL_ASYMMETRY_ALLOWED_PACKETIZATION_MODE) { retStatus = hashTableGet(pKvsPeerConnection->pRtxTable, RTC_RTX_CODEC_H264_PROFILE_42E01F_LEVEL_ASYMMETRY_ALLOWED_PACKETIZATION_MODE, &rtxPayloadType); - } else { + } else if (pRtcMediaStreamTrack->codec == RTC_CODEC_VP8) { retStatus = hashTableGet(pKvsPeerConnection->pRtxTable, RTC_RTX_CODEC_VP8, &rtxPayloadType); + } else { + retStatus = STATUS_HASH_KEY_NOT_PRESENT; } CHK(retStatus == STATUS_SUCCESS || retStatus == STATUS_HASH_KEY_NOT_PRESENT, retStatus); containRtx = (retStatus == STATUS_SUCCESS); @@ -418,8 +424,7 @@ STATUS populateSingleMediaSection(PKvsPeerConnection pKvsPeerConnection, PKvsRtp } else { SPRINTF(pSdpMediaDescription->mediaName, "video 9 UDP/TLS/RTP/SAVPF %" PRId64, payloadType); } - } else if (pRtcMediaStreamTrack->codec == RTC_CODEC_OPUS || pRtcMediaStreamTrack->codec == RTC_CODEC_MULAW || - pRtcMediaStreamTrack->codec == RTC_CODEC_ALAW) { + } else if (pRtcMediaStreamTrack->kind == MEDIA_STREAM_TRACK_KIND_AUDIO) { SPRINTF(pSdpMediaDescription->mediaName, "audio 9 UDP/TLS/RTP/SAVPF %" PRId64, payloadType); } @@ -534,6 +539,11 @@ STATUS populateSingleMediaSection(PKvsPeerConnection pKvsPeerConnection, PKvsRtp pSdpMediaDescriptionRemote = &pRemoteSessionDescription->mediaDescriptions[mediaSectionId]; remoteAttributeCount = pSdpMediaDescriptionRemote->mediaAttributesCount; + // in case of a missing m-line, we respond with the same m-line but direction set to inactive + if (pKvsRtpTransceiver->transceiver.direction == RTC_RTP_TRANSCEIVER_DIRECTION_INACTIVE) { + STRCPY(pSdpMediaDescription->sdpAttributes[attributeCount].attributeName, "inactive"); + directionFound = TRUE; + } for (i = 0; i < remoteAttributeCount && directionFound == FALSE; i++) { if (STRCMP(pSdpMediaDescriptionRemote->sdpAttributes[i].attributeName, "sendrecv") == 0) { STRCPY(pSdpMediaDescription->sdpAttributes[attributeCount].attributeName, "sendrecv"); @@ -616,6 +626,11 @@ STATUS populateSingleMediaSection(PKvsPeerConnection pKvsPeerConnection, PKvsRtp STRCPY(pSdpMediaDescription->sdpAttributes[attributeCount].attributeName, "rtpmap"); SPRINTF(pSdpMediaDescription->sdpAttributes[attributeCount].attributeValue, "%" PRId64 " " ALAW_VALUE, payloadType); attributeCount++; + } else if (pRtcMediaStreamTrack->codec == RTC_CODEC_UNKNOWN) { + CHK_STATUS(hashTableGet(pUnknownCodecRtpmapTable, unknownCodecHashTableKey, (PUINT64) &rtpMapValue)); + STRCPY(pSdpMediaDescription->sdpAttributes[attributeCount].attributeName, "rtpmap"); + SPRINTF(pSdpMediaDescription->sdpAttributes[attributeCount].attributeValue, "%" PRId64 " %s", payloadType, rtpMapValue); + attributeCount++; } STRCPY(pSdpMediaDescription->sdpAttributes[attributeCount].attributeName, "rtcp-fb"); @@ -739,33 +754,71 @@ STATUS populateSessionDescriptionMedia(PKvsPeerConnection pKvsPeerConnection, PS UINT64 data; PKvsRtpTransceiver pKvsRtpTransceiver; PCHAR pDtlsRole = NULL; + PHashTable pUnknownCodecPayloadTypesTable = NULL, pUnknownCodecRtpmapTable = NULL; + UINT32 unknownCodecHashTableKey = 0; CHK_STATUS(dtlsSessionGetLocalCertificateFingerprint(pKvsPeerConnection->pDtlsSession, certificateFingerprint, CERTIFICATE_FINGERPRINT_LENGTH)); if (pKvsPeerConnection->isOffer) { pDtlsRole = DTLS_ROLE_ACTPASS; - } else { - pDtlsRole = DTLS_ROLE_ACTIVE; - CHK_STATUS(reorderTransceiverByRemoteDescription(pKvsPeerConnection, pRemoteSessionDescription)); - } - CHK_STATUS(doubleListGetHeadNode(pKvsPeerConnection->pTransceivers, &pCurNode)); - while (pCurNode != NULL) { - CHK_STATUS(doubleListGetNodeData(pCurNode, &data)); - pCurNode = pCurNode->pNext; - pKvsRtpTransceiver = (PKvsRtpTransceiver) data; - if (pKvsRtpTransceiver != NULL) { - CHK(pLocalSessionDescription->mediaCount < MAX_SDP_SESSION_MEDIA_COUNT, STATUS_SESSION_DESCRIPTION_MAX_MEDIA_COUNT); + CHK_STATUS(doubleListGetHeadNode(pKvsPeerConnection->pTransceivers, &pCurNode)); + while (pCurNode != NULL) { + CHK_STATUS(doubleListGetNodeData(pCurNode, &data)); + pCurNode = pCurNode->pNext; + pKvsRtpTransceiver = (PKvsRtpTransceiver) data; + if (pKvsRtpTransceiver != NULL) { + CHK(pLocalSessionDescription->mediaCount < MAX_SDP_SESSION_MEDIA_COUNT, STATUS_SESSION_DESCRIPTION_MAX_MEDIA_COUNT); - // If generating answer, need to check if Local Description is present in remote -- if not, we don't need to create a local description - // for it or else our Answer will have an extra m-line, for offer the local is the offer itself, don't care about remote - if (pKvsPeerConnection->isOffer || isPresentInRemote(pKvsRtpTransceiver, pRemoteSessionDescription)) { + // If generating answer, need to check if Local Description is present in remote -- if not, we don't need to create a local + // description for it or else our Answer will have an extra m-line, for offer the local is the offer itself, don't care about remote CHK_STATUS(populateSingleMediaSection( pKvsPeerConnection, pKvsRtpTransceiver, &(pLocalSessionDescription->mediaDescriptions[pLocalSessionDescription->mediaCount]), - pRemoteSessionDescription, certificateFingerprint, pLocalSessionDescription->mediaCount, pDtlsRole)); + pRemoteSessionDescription, certificateFingerprint, pLocalSessionDescription->mediaCount, pDtlsRole, NULL, NULL, 0)); pLocalSessionDescription->mediaCount++; } } + } else { + pDtlsRole = DTLS_ROLE_ACTIVE; + CHK_STATUS(hashTableCreate(&pUnknownCodecPayloadTypesTable)); + CHK_STATUS(hashTableCreate(&pUnknownCodecRtpmapTable)); + + // this function creates a list of transceivers corresponding to each m-line and adds it answerTransceivers + // if an m-line does not have a corresponding transceiver created by the user, we create a fake transceiver + CHK_STATUS(findTransceiversByRemoteDescription(pKvsPeerConnection, pRemoteSessionDescription, pUnknownCodecPayloadTypesTable, + pUnknownCodecRtpmapTable)); + + // pAnswerTransceivers contains transceivers created by the user as well as fake transceivers + CHK_STATUS(doubleListGetHeadNode(pKvsPeerConnection->pAnswerTransceivers, &pCurNode)); + while (pCurNode != NULL) { + CHK_STATUS(doubleListGetNodeData(pCurNode, &data)); + pCurNode = pCurNode->pNext; + pKvsRtpTransceiver = (PKvsRtpTransceiver) data; + if (pKvsRtpTransceiver != NULL) { + CHK(pLocalSessionDescription->mediaCount < MAX_SDP_SESSION_MEDIA_COUNT, STATUS_SESSION_DESCRIPTION_MAX_MEDIA_COUNT); + if (isPresentInRemote(pKvsRtpTransceiver, pRemoteSessionDescription)) { + if (pKvsRtpTransceiver->sender.track.codec == RTC_CODEC_UNKNOWN) { + CHK_STATUS(populateSingleMediaSection(pKvsPeerConnection, pKvsRtpTransceiver, + &(pLocalSessionDescription->mediaDescriptions[pLocalSessionDescription->mediaCount]), + pRemoteSessionDescription, certificateFingerprint, pLocalSessionDescription->mediaCount, + pDtlsRole, pUnknownCodecPayloadTypesTable, pUnknownCodecRtpmapTable, + unknownCodecHashTableKey)); + unknownCodecHashTableKey++; + // unknownCodecHashTableKey is the key for pUnknownCodecRtpmapTable and pUnknownCodecPayloadTypesTable + // a value for the same key in both hashtables corresponds to rtpmap and payloadtype for the same m-line / unknown codec + + } else { + // in case of a user-added transceiver, the pUnknownCodecPayloadTypesTable, pUnknownCodecRtpmapTable are not populated by + // the function findTransceiversByRemoteDescription and are NULL + CHK_STATUS(populateSingleMediaSection(pKvsPeerConnection, pKvsRtpTransceiver, + &(pLocalSessionDescription->mediaDescriptions[pLocalSessionDescription->mediaCount]), + pRemoteSessionDescription, certificateFingerprint, pLocalSessionDescription->mediaCount, + pDtlsRole, NULL, NULL, 0)); + } + pLocalSessionDescription->mediaCount++; + } + } + } } if (pKvsPeerConnection->sctpIsEnabled) { @@ -778,6 +831,13 @@ STATUS populateSessionDescriptionMedia(PKvsPeerConnection pKvsPeerConnection, PS CleanUp: + if (pUnknownCodecPayloadTypesTable != NULL) { + CHK_STATUS(hashTableFree(pUnknownCodecPayloadTypesTable)); + } + if (pUnknownCodecRtpmapTable != NULL) { + CHK_STATUS(hashTableFree(pUnknownCodecRtpmapTable)); + } + LEAVES(); return retStatus; } @@ -788,7 +848,8 @@ STATUS populateSessionDescription(PKvsPeerConnection pKvsPeerConnection, PSessio { ENTERS(); STATUS retStatus = STATUS_SUCCESS; - CHAR bundleValue[MAX_SDP_ATTRIBUTE_VALUE_LENGTH], wmsValue[MAX_SDP_ATTRIBUTE_VALUE_LENGTH]; + CHAR bundleValue[MAX_SDP_ATTRIBUTE_VALUE_LENGTH], wmsValue[MAX_SDP_ATTRIBUTE_VALUE_LENGTH], + remoteSdpAttributeValue[MAX_SDP_ATTRIBUTE_VALUE_LENGTH]; PCHAR curr = NULL; UINT32 i, sizeRemaining; INT32 charsCopied; @@ -799,6 +860,7 @@ STATUS populateSessionDescription(PKvsPeerConnection pKvsPeerConnection, PSessio MEMSET(bundleValue, 0, MAX_SDP_ATTRIBUTE_VALUE_LENGTH); MEMSET(wmsValue, 0, MAX_SDP_ATTRIBUTE_VALUE_LENGTH); + MEMSET(remoteSdpAttributeValue, 0, MAX_SDP_ATTRIBUTE_VALUE_LENGTH); STRCPY(pLocalSessionDescription->sdpOrigin.userName, "-"); pLocalSessionDescription->sdpOrigin.sessionId = RAND(); @@ -815,18 +877,36 @@ STATUS populateSessionDescription(PKvsPeerConnection pKvsPeerConnection, PSessio STRCPY(pLocalSessionDescription->sdpAttributes[0].attributeName, "group"); STRCPY(pLocalSessionDescription->sdpAttributes[0].attributeValue, BUNDLE_KEY); - for (curr = (pLocalSessionDescription->sdpAttributes[0].attributeValue + ARRAY_SIZE(BUNDLE_KEY) - 1), i = 0; - i < pLocalSessionDescription->mediaCount; i++) { - STRCPY(pLocalSessionDescription->mediaDescriptions[i].sdpConnectionInformation.networkType, "IN"); - STRCPY(pLocalSessionDescription->mediaDescriptions[i].sdpConnectionInformation.addressType, "IP4"); - STRCPY(pLocalSessionDescription->mediaDescriptions[i].sdpConnectionInformation.connectionAddress, "127.0.0.1"); - sizeRemaining = MAX_SDP_ATTRIBUTE_VALUE_LENGTH - (curr - pLocalSessionDescription->sdpAttributes[0].attributeValue); - charsCopied = SNPRINTF(curr, sizeRemaining, " %d", i); + // check all session attribute lines to see if a line with BUNDLE is present. If it is present, copy its content and break + for (i = 0; i < pRemoteSessionDescription->sessionAttributesCount; i++) { + if (STRSTR(pRemoteSessionDescription->sdpAttributes[i].attributeValue, BUNDLE_KEY) != NULL) { + STRCPY(remoteSdpAttributeValue, pRemoteSessionDescription->sdpAttributes[i].attributeValue + ARRAY_SIZE(BUNDLE_KEY) - 1); + break; + } + } + + // check if we already have a value for the "group" session attribute from remote description. If we have it, we use it. + // If we don't have it, we loop over, create and add them + if (STRLEN(remoteSdpAttributeValue) > 0) { + CHK(STRLEN(remoteSdpAttributeValue) < MAX_SDP_ATTRIBUTE_VALUE_LENGTH, STATUS_BUFFER_TOO_SMALL); + STRCAT(pLocalSessionDescription->sdpAttributes[0].attributeValue, remoteSdpAttributeValue); + } else { + for (curr = (pLocalSessionDescription->sdpAttributes[0].attributeValue + ARRAY_SIZE(BUNDLE_KEY) - 1), i = 0; + i < pLocalSessionDescription->mediaCount; i++) { + sizeRemaining = MAX_SDP_ATTRIBUTE_VALUE_LENGTH - (curr - pLocalSessionDescription->sdpAttributes[0].attributeValue); + charsCopied = SNPRINTF(curr, sizeRemaining, " %d", i); + + CHK(charsCopied > 0 && (UINT32) charsCopied < sizeRemaining, STATUS_BUFFER_TOO_SMALL); - CHK(charsCopied > 0 && (UINT32) charsCopied < sizeRemaining, STATUS_BUFFER_TOO_SMALL); + curr += charsCopied; + } + } - curr += charsCopied; + for (i = 0; i < pLocalSessionDescription->mediaCount; i++) { + STRCPY(pLocalSessionDescription->mediaDescriptions[i].sdpConnectionInformation.networkType, "IN"); + STRCPY(pLocalSessionDescription->mediaDescriptions[i].sdpConnectionInformation.addressType, "IP4"); + STRCPY(pLocalSessionDescription->mediaDescriptions[i].sdpConnectionInformation.connectionAddress, "127.0.0.1"); } pLocalSessionDescription->sessionAttributesCount++; @@ -840,119 +920,218 @@ STATUS populateSessionDescription(PKvsPeerConnection pKvsPeerConnection, PSessio return retStatus; } -// primarily meant to be used by reorderTransceiverByRemoteDescription -// Find a Transceiver with n codec, and then copy it to the end of the transceivers -// this allows us to re-order by the order the remote dictates -STATUS copyTransceiverWithCodec(PKvsPeerConnection pKvsPeerConnection, RTC_CODEC rtcCodec, PBOOL pDidFindCodec) +// primarily meant to be used by findTransceiversByRemoteDescription. This function checks if a codec is present in the user-created transceivers +STATUS findCodecInTransceivers(PKvsPeerConnection pKvsPeerConnection, RTC_CODEC rtcCodec, PBOOL pDidFindCodec, PHashTable pSeenTransceivers) { STATUS retStatus = STATUS_SUCCESS; PDoubleListNode pCurNode = NULL; - PKvsRtpTransceiver pTargetKvsRtpTransceiver = NULL, pKvsRtpTransceiver; + PKvsRtpTransceiver pKvsRtpTransceiver; UINT64 data; - - CHK(pKvsPeerConnection != NULL && pDidFindCodec != NULL, STATUS_NULL_ARG); - - *pDidFindCodec = FALSE; + BOOL contains = FALSE; CHK_STATUS(doubleListGetHeadNode(pKvsPeerConnection->pTransceivers, &pCurNode)); while (pCurNode != NULL) { CHK_STATUS(doubleListGetNodeData(pCurNode, &data)); pKvsRtpTransceiver = (PKvsRtpTransceiver) data; - if (pKvsRtpTransceiver != NULL && pKvsRtpTransceiver->sender.track.codec == rtcCodec) { - pTargetKvsRtpTransceiver = pKvsRtpTransceiver; - doubleListDeleteNode(pKvsPeerConnection->pTransceivers, pCurNode); + // if we have already seen / added the transceiver to the answerTransceivers list, we do not want to add it again. This is to ensure that + // we have one transceiver per m-line. In case of two video m-lines with the same codec, we need two different transceivers + CHK_STATUS(hashTableContains(pSeenTransceivers, (UINT64) pKvsRtpTransceiver, &contains)); + if (pKvsRtpTransceiver != NULL && pKvsRtpTransceiver->sender.track.codec == rtcCodec && contains == FALSE) { + CHK_STATUS(doubleListInsertItemTail(pKvsPeerConnection->pAnswerTransceivers, (UINT64) pKvsRtpTransceiver)); + CHK_STATUS(hashTablePut(pSeenTransceivers, (UINT64) pKvsRtpTransceiver, 0)); + *pDidFindCodec = TRUE; break; } pCurNode = pCurNode->pNext; } - if (pTargetKvsRtpTransceiver != NULL) { - CHK_STATUS(doubleListInsertItemTail(pKvsPeerConnection->pTransceivers, (UINT64) pTargetKvsRtpTransceiver)); - *pDidFindCodec = TRUE; - } CleanUp: return retStatus; } -STATUS reorderTransceiverByRemoteDescription(PKvsPeerConnection pKvsPeerConnection, PSessionDescription pRemoteSessionDescription) +// primarily used for creating a list of transceivers corresponding to each media m-line to respond to an offer with an answer +// This function generates the pAnswerTransceivers list which contains transceivers corresponding to each m-line in correct order +// To generate this list, it traverses over each m-line, first checks if it has a user-created transceiver present using findCodecInTransceivers +// if found, it adds that transceiver to pAnswerTransceivers +// if not, it creates a fake transceiver and adds it to pAnswerTransceivers +// In case a fake transceiver is created, the codec corresponding to that is RTC_CODEC_UNKNOWN. +// This function also obtains the payload type and rtpmap value for each unknown codec and adds it +// to pUnknownCodecPayloadTypesTable and pUnknownCodecRtpmapTable respectively. The keys for both hashtables are integers; +// a key in both hashtables corresponds to the payloadtype and rtpmap value for the same unknown codec, +// meaning, the same key can be used to retrieve a value for an unknown codec from both hashtables +STATUS findTransceiversByRemoteDescription(PKvsPeerConnection pKvsPeerConnection, PSessionDescription pRemoteSessionDescription, + PHashTable pUnknownCodecPayloadTypesTable, PHashTable pUnknownCodecRtpmapTable) { ENTERS(); STATUS retStatus = STATUS_SUCCESS; - UINT32 currentMedia, currentAttribute, transceiverCount = 0, tokenLen; + UINT32 currentMedia, currentAttribute, tokenLen = 0, codec = 0, count = 0, unknownCodecCounter = 0; PSdpMediaDescription pMediaDescription = NULL; - PCHAR attributeValue, end; - BOOL supportCodec, foundMediaSectionWithCodec; + PCHAR attributeValue, end, codecs = NULL; + PCHAR rtpMapValue = NULL; + CHAR firstCodec[MAX_PAYLOAD_TYPE_LENGTH]; + BOOL supportCodec, foundMediaSectionWithCodec, containsPayloadType = FALSE, containsRtpMap = FALSE; + PHashTable pSeenTransceivers; RTC_CODEC rtcCodec; + MEDIA_STREAM_TRACK_KIND streamKind; + PKvsRtpTransceiver pKvsRtpFakeTransceiver = NULL; + PRtcMediaStreamTrack pRtcMediaStreamTrack; + RtcMediaStreamTrack track; - // change the order of pKvsPeerConnection->pTransceivers to have the same codec order in pRemoteSessionDescription - CHK_STATUS(doubleListGetNodeCount(pKvsPeerConnection->pTransceivers, &transceiverCount)); + CHK_STATUS(hashTableCreate(&pSeenTransceivers)); // to be used by findCodecInTransceivers + // sample m-lines + // m=audio 9 UDP/TLS/RTP/SAVPF 111 63 103 104 9 0 8 106 105 13 110 112 113 126 + // m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 124 119 123 117 35 36 114 115 116 62 118 + // this loop iterates over all the m-lines for (currentMedia = 0; currentMedia < pRemoteSessionDescription->mediaCount; currentMedia++) { pMediaDescription = &(pRemoteSessionDescription->mediaDescriptions[currentMedia]); foundMediaSectionWithCodec = FALSE; + count = 0; + MEMSET(firstCodec, 0x00, MAX_PAYLOAD_TYPE_LENGTH); // Scan the media section name for any codecs we support + // sample attributeValue=audio 9 UDP/TLS/RTP/SAVPF 111 63 103 104 9 0 8 106 105 13 110 112 113 126 attributeValue = pMediaDescription->mediaName; + if ((end = STRCHR(attributeValue, ' ')) != NULL) { + tokenLen = (end - attributeValue); + } else { + tokenLen = STRLEN(attributeValue); + } + + if (STRNCMP(MEDIA_SECTION_AUDIO_VALUE, attributeValue, tokenLen) == 0) { + streamKind = MEDIA_STREAM_TRACK_KIND_AUDIO; + } else if (STRNCMP(MEDIA_SECTION_VIDEO_VALUE, attributeValue, tokenLen) == 0) { + streamKind = MEDIA_STREAM_TRACK_KIND_VIDEO; + } else { + continue; // ignore non-media m-lines + } + do { + count++; if ((end = STRCHR(attributeValue, ' ')) != NULL) { tokenLen = (end - attributeValue); } else { tokenLen = STRLEN(attributeValue); } - - if (STRNCMP(DEFAULT_PAYLOAD_MULAW_STR, attributeValue, tokenLen) == 0) { - supportCodec = TRUE; - rtcCodec = RTC_CODEC_MULAW; - } else if (STRNCMP(DEFAULT_PAYLOAD_ALAW_STR, attributeValue, tokenLen) == 0) { - supportCodec = TRUE; - rtcCodec = RTC_CODEC_ALAW; - } else { - supportCodec = FALSE; + if (count == 4) { + codecs = attributeValue; // codecs = 111 63 103 104 9 0 8 106 105 13 110 112 113 126 } + if (count > 3) { // look for codec values from payload types (111 63 103 104 9 0 8 106 105 13 110 112 113 126) + if (STRNCMP(DEFAULT_PAYLOAD_MULAW_STR, attributeValue, tokenLen) == 0) { + supportCodec = TRUE; + rtcCodec = RTC_CODEC_MULAW; + } else if (STRNCMP(DEFAULT_PAYLOAD_ALAW_STR, attributeValue, tokenLen) == 0) { + supportCodec = TRUE; + rtcCodec = RTC_CODEC_ALAW; + } else { + supportCodec = FALSE; + } - // find transceiver with rtcCodec and duplicate it at tail - if (supportCodec) { - CHK_STATUS(copyTransceiverWithCodec(pKvsPeerConnection, rtcCodec, &foundMediaSectionWithCodec)); + // if a supported codec is found, check if a user has created a transceiver for that + if (supportCodec) { + CHK_STATUS(findCodecInTransceivers(pKvsPeerConnection, rtcCodec, &foundMediaSectionWithCodec, pSeenTransceivers)); + } } if (end != NULL) { attributeValue = end + 1; } } while (end != NULL && !foundMediaSectionWithCodec); - // Scan the media section attributes for codecs we support + // get the first payload type from codecs in case we need to use it to generate a fake transceiver to respond to an m-line + // if we don't have a user-created one corresponding to an m-line + // we can respond to an m-line by including any one codec the offer had + // e.g: codecs = 111 63 103 104 9 0 8 106 105 13 110 112 113 126 + // firstCodec = 111 + if ((end = STRCHR(codecs, ' ')) != NULL) { + tokenLen = (end - codecs); + } else { + tokenLen = STRLEN(codecs); + } + STRNCPY(firstCodec, codecs, tokenLen); + + // in case a supported codec was not found from the payload types, check the rtpmaps in the a-lines for that particular m-line for (currentAttribute = 0; currentAttribute < pMediaDescription->mediaAttributesCount && !foundMediaSectionWithCodec; currentAttribute++) { attributeValue = pMediaDescription->sdpAttributes[currentAttribute].attributeValue; + rtcCodec = RTC_CODEC_UNKNOWN; + + // check for supported codec in rtpmap values only if an a-line contains the keyword "rtpmap" to save string comparisons + if (STRNCMP(RTPMAP_VALUE, pMediaDescription->sdpAttributes[currentAttribute].attributeName, 6) == 0) { + if (STRSTR(attributeValue, H264_VALUE) != NULL) { + supportCodec = TRUE; + rtcCodec = RTC_CODEC_H264_PROFILE_42E01F_LEVEL_ASYMMETRY_ALLOWED_PACKETIZATION_MODE; + } else if (STRSTR(attributeValue, OPUS_VALUE) != NULL) { + supportCodec = TRUE; + rtcCodec = RTC_CODEC_OPUS; + } else if (STRSTR(attributeValue, MULAW_VALUE) != NULL) { + supportCodec = TRUE; + rtcCodec = RTC_CODEC_MULAW; + } else if (STRSTR(attributeValue, ALAW_VALUE) != NULL) { + supportCodec = TRUE; + rtcCodec = RTC_CODEC_ALAW; + } else if (STRSTR(attributeValue, VP8_VALUE) != NULL) { + supportCodec = TRUE; + rtcCodec = RTC_CODEC_VP8; + } else { + supportCodec = FALSE; + } - if (STRSTR(attributeValue, H264_VALUE) != NULL) { - supportCodec = TRUE; - rtcCodec = RTC_CODEC_H264_PROFILE_42E01F_LEVEL_ASYMMETRY_ALLOWED_PACKETIZATION_MODE; - } else if (STRSTR(attributeValue, OPUS_VALUE) != NULL) { - supportCodec = TRUE; - rtcCodec = RTC_CODEC_OPUS; - } else if (STRSTR(attributeValue, MULAW_VALUE) != NULL) { - supportCodec = TRUE; - rtcCodec = RTC_CODEC_MULAW; - } else if (STRSTR(attributeValue, ALAW_VALUE) != NULL) { - supportCodec = TRUE; - rtcCodec = RTC_CODEC_ALAW; - } else if (STRSTR(attributeValue, VP8_VALUE) != NULL) { - supportCodec = TRUE; - rtcCodec = RTC_CODEC_VP8; - } else { - supportCodec = FALSE; + // if a supported codec is found, check if a user has created a transceiver for that + if (supportCodec) { + CHK_STATUS(findCodecInTransceivers(pKvsPeerConnection, rtcCodec, &foundMediaSectionWithCodec, pSeenTransceivers)); + } + + // if the m-line / codec is not supported or the user has not created a transceiver corresponding to it + // find the rtpmap value for the firstcodec that we saved previously + // e.g a-line: a=rtpmap:111 opus/48000/2 + // attributeValue = 111 opus/48000/2 + // firstCodec = 111 + // rtpMapValue = opus/48000/2 + // tokenLen = 3 (still contains length of the firstCodec) + if (foundMediaSectionWithCodec == FALSE) { + if ((end = STRCHR(attributeValue, ' ')) != NULL) + if (STRNCMP(attributeValue, firstCodec, tokenLen) == 0) { + rtpMapValue = end + 1; + } + } } + } - // find transceiver with rtcCodec and duplicate it at tail - if (supportCodec) { - CHK_STATUS(copyTransceiverWithCodec(pKvsPeerConnection, rtcCodec, &foundMediaSectionWithCodec)); + // if we have not found a transceiver for an m-line or if the codec is unsupported, got to this section to generate a fake transceiver + if (!foundMediaSectionWithCodec && (streamKind == MEDIA_STREAM_TRACK_KIND_AUDIO || streamKind == MEDIA_STREAM_TRACK_KIND_VIDEO)) { + MEMSET(&track, 0x00, SIZEOF(RtcMediaStreamTrack)); + track.kind = streamKind; + track.codec = RTC_CODEC_UNKNOWN; + STRCPY(track.streamId, "fakeStream"); + STRCPY(track.trackId, "fakeTrack"); + pRtcMediaStreamTrack = &track; + CHK_STATUS(createKvsRtpTransceiver(RTC_RTP_TRANSCEIVER_DIRECTION_INACTIVE, pKvsPeerConnection, (UINT32) RAND(), (UINT32) RAND(), + pRtcMediaStreamTrack, NULL, RTC_CODEC_UNKNOWN, &pKvsRtpFakeTransceiver)); + + // add the new transceiver to a list of fake transceivers to keep a track of them + // add the same to the pAnswerTransceivers since it will be needed later to serialize + CHK_STATUS(doubleListInsertItemTail(pKvsPeerConnection->pFakeTransceivers, (UINT64) pKvsRtpFakeTransceiver)); + CHK_STATUS(doubleListInsertItemTail(pKvsPeerConnection->pAnswerTransceivers, (UINT64) pKvsRtpFakeTransceiver)); + + CHK_STATUS(STRTOUI32(firstCodec, firstCodec + tokenLen, 10, &codec)); + + // Insert (int)(firstCodec) and rtpMapValue into the hashtables with the same key so they can be retrieved later during serialization + CHK_STATUS(hashTableContains(pUnknownCodecPayloadTypesTable, (UINT64) codec, &containsPayloadType)); + CHK_STATUS(hashTableContains(pUnknownCodecRtpmapTable, (UINT64) rtpMapValue, &containsRtpMap)); + if (containsPayloadType == FALSE && containsRtpMap == FALSE) { + CHK_STATUS(hashTablePut(pUnknownCodecPayloadTypesTable, unknownCodecCounter, (UINT64) codec)); + CHK_STATUS(hashTablePut(pUnknownCodecRtpmapTable, unknownCodecCounter, (UINT64) rtpMapValue)); + unknownCodecCounter++; + containsPayloadType = FALSE; + containsRtpMap = FALSE; } } } CleanUp: + CHK_STATUS(hashTableFree(pSeenTransceivers)); CHK_LOG_ERR(retStatus); LEAVES(); diff --git a/src/source/PeerConnection/SessionDescription.h b/src/source/PeerConnection/SessionDescription.h index 1e62ddf4e4..9be9bca2de 100644 --- a/src/source/PeerConnection/SessionDescription.h +++ b/src/source/PeerConnection/SessionDescription.h @@ -36,12 +36,14 @@ extern "C" { #define RTX_VALUE "rtx/90000" #define RTX_CODEC_VALUE "apt=" #define FMTP_VALUE "fmtp:" +#define RTPMAP_VALUE "rtpmap" -#define DEFAULT_PAYLOAD_MULAW (UINT64) 0 -#define DEFAULT_PAYLOAD_ALAW (UINT64) 8 -#define DEFAULT_PAYLOAD_OPUS (UINT64) 111 -#define DEFAULT_PAYLOAD_VP8 (UINT64) 96 -#define DEFAULT_PAYLOAD_H264 (UINT64) 125 +#define MAX_PAYLOAD_TYPE_LENGTH (UINT64) 10 +#define DEFAULT_PAYLOAD_MULAW (UINT64) 0 +#define DEFAULT_PAYLOAD_ALAW (UINT64) 8 +#define DEFAULT_PAYLOAD_OPUS (UINT64) 111 +#define DEFAULT_PAYLOAD_VP8 (UINT64) 96 +#define DEFAULT_PAYLOAD_H264 (UINT64) 125 #define DEFAULT_PAYLOAD_MULAW_STR (PCHAR) "0" #define DEFAULT_PAYLOAD_ALAW_STR (PCHAR) "8" @@ -80,7 +82,7 @@ STATUS setPayloadTypesForOffer(PHashTable); STATUS setTransceiverPayloadTypes(PHashTable, PHashTable, PDoubleList); STATUS populateSessionDescription(PKvsPeerConnection, PSessionDescription, PSessionDescription); -STATUS reorderTransceiverByRemoteDescription(PKvsPeerConnection, PSessionDescription); +STATUS findTransceiversByRemoteDescription(PKvsPeerConnection, PSessionDescription, PHashTable, PHashTable); STATUS setReceiversSsrc(PSessionDescription, PDoubleList); PCHAR fmtpForPayloadType(UINT64, PSessionDescription); UINT64 getH264FmtpScore(PCHAR); diff --git a/src/source/Rtcp/RtcpPacket.h b/src/source/Rtcp/RtcpPacket.h index a2106fadfb..3a11499e02 100644 --- a/src/source/Rtcp/RtcpPacket.h +++ b/src/source/Rtcp/RtcpPacket.h @@ -36,16 +36,6 @@ extern "C" { // is set to 5 seconds. #define RTCP_FIRST_REPORT_DELAY (3 * HUNDREDS_OF_NANOS_IN_A_SECOND) -#define RTCP_PACKET_SENDER_REPORT_MINLEN 24 -#define RTCP_PACKET_RECEIVER_REPORT_BLOCK_LEN 24 -#define RTCP_PACKET_RECEIVER_REPORT_MINLEN 4 + RTCP_PACKET_RECEIVER_REPORT_BLOCK_LEN - -// https://tools.ietf.org/html/rfc3550#section-4 -// If the participant has not yet sent an RTCP packet (the variable -// initial is true), the constant Tmin is set to 2.5 seconds, else it -// is set to 5 seconds. -#define RTCP_FIRST_REPORT_DELAY (3 * HUNDREDS_OF_NANOS_IN_A_SECOND) - typedef enum { RTCP_PACKET_TYPE_FIR = 192, // https://tools.ietf.org/html/rfc2032#section-5.2.1 RTCP_PACKET_TYPE_SENDER_REPORT = 200, diff --git a/src/source/Signaling/ChannelInfo.c b/src/source/Signaling/ChannelInfo.c index cd794cb2a5..6f8dcaf560 100644 --- a/src/source/Signaling/ChannelInfo.c +++ b/src/source/Signaling/ChannelInfo.c @@ -8,7 +8,8 @@ STATUS createValidateChannelInfo(PChannelInfo pOrigChannelInfo, PChannelInfo* pp UINT32 allocSize, nameLen = 0, arnLen = 0, regionLen = 0, cplLen = 0, certLen = 0, postfixLen = 0, agentLen = 0, userAgentLen = 0, kmsLen = 0, tagsSize; - PCHAR pCurPtr, pRegionPtr; + PCHAR pCurPtr, pRegionPtr, pUserAgentPostfixPtr; + CHAR agentString[MAX_CUSTOM_USER_AGENT_NAME_POSTFIX_LEN + 1]; PChannelInfo pChannelInfo = NULL; CHK(pOrigChannelInfo != NULL && ppChannelInfo != NULL, STATUS_NULL_ARG); @@ -49,10 +50,20 @@ STATUS createValidateChannelInfo(PChannelInfo pOrigChannelInfo, PChannelInfo* pp userAgentLen = MAX_USER_AGENT_LEN; - if (pOrigChannelInfo->pUserAgentPostfix != NULL) { + if (pOrigChannelInfo->pUserAgentPostfix != NULL && STRCMP(pOrigChannelInfo->pUserAgentPostfix, EMPTY_STRING) != 0) { CHK((postfixLen = (UINT32) STRNLEN(pOrigChannelInfo->pUserAgentPostfix, MAX_CUSTOM_USER_AGENT_NAME_POSTFIX_LEN + 1)) <= MAX_CUSTOM_USER_AGENT_NAME_POSTFIX_LEN, STATUS_SIGNALING_INVALID_AGENT_POSTFIX_LENGTH); + pUserAgentPostfixPtr = pOrigChannelInfo->pUserAgentPostfix; + } else { + // Account for the "/" in the agent string. + // The default user agent postfix is:AWS-WEBRTC-KVS-AGENT/ + postfixLen = STRLEN(SIGNALING_USER_AGENT_POSTFIX_NAME) + STRLEN(SIGNALING_USER_AGENT_POSTFIX_VERSION) + 1; + CHK(postfixLen <= MAX_CUSTOM_USER_AGENT_NAME_POSTFIX_LEN, STATUS_SIGNALING_INVALID_AGENT_POSTFIX_LENGTH); + SNPRINTF(agentString, + postfixLen + 1, // account for null terminator + (PCHAR) "%s/%s", SIGNALING_USER_AGENT_POSTFIX_NAME, SIGNALING_USER_AGENT_POSTFIX_VERSION); + pUserAgentPostfixPtr = agentString; } if (pOrigChannelInfo->pCustomUserAgent != NULL) { @@ -143,7 +154,7 @@ STATUS createValidateChannelInfo(PChannelInfo pOrigChannelInfo, PChannelInfo* pp } if (postfixLen != 0) { - STRCPY(pCurPtr, pOrigChannelInfo->pUserAgentPostfix); + STRCPY(pCurPtr, pUserAgentPostfixPtr); pChannelInfo->pUserAgentPostfix = pCurPtr; pCurPtr += ALIGN_UP_TO_MACHINE_WORD(postfixLen + 1); } @@ -154,13 +165,13 @@ STATUS createValidateChannelInfo(PChannelInfo pOrigChannelInfo, PChannelInfo* pp pCurPtr += ALIGN_UP_TO_MACHINE_WORD(agentLen + 1); } - getUserAgentString(pOrigChannelInfo->pUserAgentPostfix, pOrigChannelInfo->pCustomUserAgent, MAX_USER_AGENT_LEN, pCurPtr); + getUserAgentString(pUserAgentPostfixPtr, pOrigChannelInfo->pCustomUserAgent, MAX_USER_AGENT_LEN, pCurPtr); pChannelInfo->pUserAgent = pCurPtr; pChannelInfo->pUserAgent[MAX_USER_AGENT_LEN] = '\0'; pCurPtr += ALIGN_UP_TO_MACHINE_WORD(userAgentLen + 1); if (kmsLen != 0) { - STRCPY(pCurPtr, pOrigChannelInfo->pCustomUserAgent); + STRCPY(pCurPtr, pOrigChannelInfo->pKmsKeyId); pChannelInfo->pKmsKeyId = pCurPtr; pCurPtr += ALIGN_UP_TO_MACHINE_WORD(kmsLen + 1); } diff --git a/src/source/Signaling/ChannelInfo.h b/src/source/Signaling/ChannelInfo.h index 628f875f88..22b3aec222 100644 --- a/src/source/Signaling/ChannelInfo.h +++ b/src/source/Signaling/ChannelInfo.h @@ -32,6 +32,14 @@ extern "C" { #define MIN_SIGNALING_MESSAGE_TTL_VALUE (5 * HUNDREDS_OF_NANOS_IN_A_SECOND) #define MAX_SIGNALING_MESSAGE_TTL_VALUE (120 * HUNDREDS_OF_NANOS_IN_A_SECOND) +#define SIGNALING_USER_AGENT_POSTFIX_NAME (PCHAR) "AWS-WEBRTC-KVS-AGENT" + +#ifdef VERSION_STRING +#define SIGNALING_USER_AGENT_POSTFIX_VERSION (PCHAR) VERSION_STRING +#else +#define SIGNALING_USER_AGENT_POSTFIX_VERSION (PCHAR) "UNKNOWN" +#endif + /** * Takes in a pointer to a public version of ChannelInfo object. * Validates and creates an internal object diff --git a/src/source/Signaling/Client.c b/src/source/Signaling/Client.c index 7e54682918..425edcabf0 100644 --- a/src/source/Signaling/Client.c +++ b/src/source/Signaling/Client.c @@ -62,8 +62,9 @@ STATUS createSignalingClientSync(PSignalingClientInfo pClientInfo, PChannelInfo KvsRetryStrategy createSignalingClientRetryStrategy = {NULL, NULL, KVS_RETRY_STRATEGY_DISABLED}; INT32 signalingClientCreationMaxRetryCount; UINT64 signalingClientCreationWaitTime; + UINT64 startTime = 0; - DLOGV("Creating Signaling Client Sync"); + DLOGI("Creating Signaling Client Sync"); CHK(pSignalingHandle != NULL && pClientInfo != NULL, STATUS_NULL_ARG); // Convert the client info to the internal structure with empty values @@ -77,6 +78,7 @@ STATUS createSignalingClientSync(PSignalingClientInfo pClientInfo, PChannelInfo } else { signalingClientCreationMaxRetryCount = pClientInfo->signalingClientCreationMaxRetryAttempts; } + startTime = GETTIME(); while (TRUE) { retStatus = createSignalingSync(&signalingClientInfoInternal, pChannelInfo, pCallbacks, pCredentialProvider, &pSignalingClient); // NOTE: This will retry on all status codes except SUCCESS. @@ -105,11 +107,11 @@ STATUS createSignalingClientSync(PSignalingClientInfo pClientInfo, PChannelInfo } CleanUp: - if (STATUS_FAILED(retStatus)) { DLOGE("Create signaling client API failed with return code [0x%08x]", retStatus); freeSignaling(&pSignalingClient); } else { + PROFILE_WITH_START_TIME_OBJ(startTime, pSignalingClient->diagnostics.createClientTime, "Create signaling client"); *pSignalingHandle = TO_SIGNALING_CLIENT_HANDLE(pSignalingClient); } @@ -164,10 +166,12 @@ STATUS signalingClientConnectSync(SIGNALING_CLIENT_HANDLE signalingClientHandle) ENTERS(); STATUS retStatus = STATUS_SUCCESS; PSignalingClient pSignalingClient = FROM_SIGNALING_CLIENT_HANDLE(signalingClientHandle); + UINT64 startTimeInMacro = 0; DLOGV("Signaling Client Connect Sync"); - CHK_STATUS(signalingConnectSync(pSignalingClient)); + PROFILE_CALL_WITH_T_OBJ(CHK_STATUS(signalingConnectSync(pSignalingClient)), pSignalingClient->diagnostics.connectClientTime, + "Connect signaling client"); CleanUp: @@ -185,8 +189,9 @@ STATUS signalingClientFetchSync(SIGNALING_CLIENT_HANDLE signalingClientHandle) KvsRetryStrategy createSignalingClientRetryStrategy = {NULL, NULL, KVS_RETRY_STRATEGY_DISABLED}; INT32 signalingClientCreationMaxRetryCount; UINT64 signalingClientCreationWaitTime; + UINT64 startTime = 0; - DLOGV("Signaling Client Fetch Sync"); + DLOGI("Signaling Client Fetch Sync"); CHK(pSignalingClient != NULL, STATUS_NULL_ARG); // Convert the client info to the internal structure with empty values @@ -199,7 +204,7 @@ STATUS signalingClientFetchSync(SIGNALING_CLIENT_HANDLE signalingClientHandle) if (signalingClientCreationMaxRetryCount == CREATE_SIGNALING_CLIENT_RETRY_ATTEMPTS_SENTINEL_VALUE) { signalingClientCreationMaxRetryCount = DEFAULT_CREATE_SIGNALING_CLIENT_RETRY_ATTEMPTS; } - + startTime = GETTIME(); while (TRUE) { retStatus = signalingFetchSync(pSignalingClient); // NOTE: This will retry on all status codes except SUCCESS. @@ -233,6 +238,7 @@ STATUS signalingClientFetchSync(SIGNALING_CLIENT_HANDLE signalingClientHandle) SIGNALING_UPDATE_ERROR_COUNT(pSignalingClient, retStatus); if (pSignalingClient != NULL) { freeRetryStrategyForCreatingSignalingClient(&pSignalingClient->clientInfo.signalingClientInfo, &createSignalingClientRetryStrategy); + PROFILE_WITH_START_TIME_OBJ(startTime, pSignalingClient->diagnostics.fetchClientTime, "Fetch signaling client"); } LEAVES(); return retStatus; @@ -406,13 +412,15 @@ STATUS signalingClientGetMetrics(SIGNALING_CLIENT_HANDLE signalingClientHandle, ENTERS(); STATUS retStatus = STATUS_SUCCESS; PSignalingClient pSignalingClient = FROM_SIGNALING_CLIENT_HANDLE(signalingClientHandle); - + CHK(pSignalingClient != NULL, STATUS_NULL_ARG); DLOGV("Signaling Client Get Metrics"); CHK_STATUS(signalingGetMetrics(pSignalingClient, pSignalingClientMetrics)); CleanUp: - SIGNALING_UPDATE_ERROR_COUNT(pSignalingClient, retStatus); + if (pSignalingClient != NULL) { + SIGNALING_UPDATE_ERROR_COUNT(pSignalingClient, retStatus); + } LEAVES(); return retStatus; } diff --git a/src/source/Signaling/FileCache.c b/src/source/Signaling/FileCache.c index 9414ae4d7f..08b43dee56 100644 --- a/src/source/Signaling/FileCache.c +++ b/src/source/Signaling/FileCache.c @@ -172,7 +172,7 @@ STATUS signalingCacheSaveToFile(PSignalingFileCacheEntry pSignalingFileCacheEntr UINT32 entryCount = ARRAY_SIZE(entries), i, serializedCacheEntryLen; UINT64 fileSize = 0; PCHAR fileBuffer = NULL; - PSignalingFileCacheEntry pExistingCacheEntry = NULL; + BOOL newEntry = TRUE; CHAR serializedCacheEntry[MAX_SERIALIZED_SIGNALING_CACHE_ENTRY_LEN]; CHK(cacheFilePath != NULL && pSignalingFileCacheEntry != NULL, STATUS_NULL_ARG); @@ -199,20 +199,26 @@ STATUS signalingCacheSaveToFile(PSignalingFileCacheEntry pSignalingFileCacheEntr entryCount = 0; } - for (i = 0; pExistingCacheEntry == NULL && i < entryCount; ++i) { + for (i = 0; i < entryCount; ++i) { /* Assume channel name and region has been validated */ if (STRCMP(entries[i].channelName, pSignalingFileCacheEntry->channelName) == 0 && STRCMP(entries[i].region, pSignalingFileCacheEntry->region) == 0 && entries[i].role == pSignalingFileCacheEntry->role) { - pExistingCacheEntry = &entries[i]; + newEntry = FALSE; + break; } } /* at this point i is at most entryCount */ - CHK_WARN(entryCount < MAX_SIGNALING_CACHE_ENTRY_COUNT, STATUS_INVALID_OPERATION, - "Failed to store signaling cache because max entry count of %u reached", MAX_SIGNALING_CACHE_ENTRY_COUNT); + if (entryCount >= MAX_SIGNALING_CACHE_ENTRY_COUNT) { + DLOGW("Overwrote 32nd entry to store signaling cache because max entry count of %u reached", MAX_SIGNALING_CACHE_ENTRY_COUNT); + i = MAX_SIGNALING_CACHE_ENTRY_COUNT - 1; + newEntry = FALSE; + } entries[i] = *pSignalingFileCacheEntry; - entryCount++; + if (newEntry) { + entryCount++; + } for (i = 0; i < entryCount; ++i) { serializedCacheEntryLen = diff --git a/src/source/Signaling/LwsApiCalls.c b/src/source/Signaling/LwsApiCalls.c index b2429399f9..18367e884d 100644 --- a/src/source/Signaling/LwsApiCalls.c +++ b/src/source/Signaling/LwsApiCalls.c @@ -1082,7 +1082,7 @@ STATUS getChannelEndpointLws(PSignalingClient pSignalingClient, UINT64 time) i++; } else if (compareJsonString(pResponseStr, &tokens[i], JSMN_STRING, (PCHAR) "ResourceEndpoint")) { strLen = (UINT32) (tokens[i + 1].end - tokens[i + 1].start); - CHK(strLen <= MAX_CHANNEL_NAME_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); + CHK(strLen <= MAX_SIGNALING_ENDPOINT_URI_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); pEndpoint = pResponseStr + tokens[i + 1].start; endpointLen = strLen; endpoint = TRUE; @@ -2011,9 +2011,13 @@ STATUS receiveLwsMessage(PSignalingClient pSignalingClient, PCHAR pMessage, UINT DLOGW("Failed to validate the ICE server configuration received with an Offer"); } +#ifdef KVS_USE_SIGNALING_CHANNEL_THREADPOOL + CHK_STATUS(threadpoolPush(pSignalingClient->pThreadpool, receiveLwsMessageWrapper, (PVOID) pSignalingMessageWrapper)); +#else // Issue the callback on a separate thread CHK_STATUS(THREAD_CREATE(&receivedTid, receiveLwsMessageWrapper, (PVOID) pSignalingMessageWrapper)); CHK_STATUS(THREAD_DETACH(receivedTid)); +#endif CleanUp: @@ -2154,9 +2158,12 @@ PVOID receiveLwsMessageWrapper(PVOID args) STATUS retStatus = STATUS_SUCCESS; PSignalingMessageWrapper pSignalingMessageWrapper = (PSignalingMessageWrapper) args; PSignalingClient pSignalingClient = NULL; + SIGNALING_MESSAGE_TYPE messageType = SIGNALING_MESSAGE_TYPE_UNKNOWN; CHK(pSignalingMessageWrapper != NULL, STATUS_NULL_ARG); + messageType = pSignalingMessageWrapper->receivedSignalingMessage.signalingMessage.messageType; + pSignalingClient = pSignalingMessageWrapper->pSignalingClient; CHK(pSignalingClient != NULL, STATUS_INTERNAL_ERROR); @@ -2166,6 +2173,12 @@ PVOID receiveLwsMessageWrapper(PVOID args) // Calling client receive message callback if specified if (pSignalingClient->signalingClientCallbacks.messageReceivedFn != NULL) { + if (messageType == SIGNALING_MESSAGE_TYPE_OFFER) { + pSignalingClient->offerTime = GETTIME(); + } + if (messageType == SIGNALING_MESSAGE_TYPE_ANSWER) { + PROFILE_WITH_START_TIME_OBJ(pSignalingClient->offerTime, pSignalingClient->diagnostics.offerToAnswerTime, "Offer to answer time"); + } CHK_STATUS(pSignalingClient->signalingClientCallbacks.messageReceivedFn(pSignalingClient->signalingClientCallbacks.customData, &pSignalingMessageWrapper->receivedSignalingMessage)); } diff --git a/src/source/Signaling/Signaling.c b/src/source/Signaling/Signaling.c index c3d02b9e8a..c5761bf2b8 100644 --- a/src/source/Signaling/Signaling.c +++ b/src/source/Signaling/Signaling.c @@ -37,9 +37,12 @@ STATUS createSignalingSync(PSignalingClientInfoInternal pClientInfo, PChannelInf CHK_STATUS(createValidateChannelInfo(pChannelInfo, &pSignalingClient->pChannelInfo)); CHK_STATUS(validateSignalingCallbacks(pSignalingClient, pCallbacks)); CHK_STATUS(validateSignalingClientInfo(pSignalingClient, pClientInfo)); +#ifdef KVS_USE_SIGNALING_CHANNEL_THREADPOOL + CHK_STATUS(threadpoolCreate(&pSignalingClient->pThreadpool, pClientInfo->signalingClientInfo.signalingMessagesMinimumThreads, + pClientInfo->signalingClientInfo.signalingMessagesMaximumThreads)); +#endif pSignalingClient->version = SIGNALING_CLIENT_CURRENT_VERSION; - // Set invalid call times pSignalingClient->describeTime = INVALID_TIMESTAMP_VALUE; pSignalingClient->createTime = INVALID_TIMESTAMP_VALUE; @@ -222,6 +225,10 @@ STATUS freeSignaling(PSignalingClient* ppSignalingClient) hashTableFree(pSignalingClient->diagnostics.pEndpointToClockSkewHashMap); +#ifdef KVS_USE_SIGNALING_CHANNEL_THREADPOOL + threadpoolFree(pSignalingClient->pThreadpool); +#endif + if (IS_VALID_MUTEX_VALUE(pSignalingClient->connectedLock)) { MUTEX_FREE(pSignalingClient->connectedLock); } @@ -380,7 +387,12 @@ STATUS signalingSendMessageSync(PSignalingClient pSignalingClient, PSignalingMes // Perform the call CHK_STATUS(sendLwsMessage(pSignalingClient, pSignalingMessage->messageType, pSignalingMessage->peerClientId, pSignalingMessage->payload, pSignalingMessage->payloadLen, pSignalingMessage->correlationId, 0)); - + if (pSignalingMessage->messageType == SIGNALING_MESSAGE_TYPE_ANSWER) { + PROFILE_WITH_START_TIME_OBJ(pSignalingClient->offerTime, pSignalingClient->diagnostics.offerToAnswerTime, "Offer to answer time"); + } + if (pSignalingMessage->messageType == SIGNALING_MESSAGE_TYPE_OFFER) { + pSignalingClient->offerTime = GETTIME(); + } // Update the internal diagnostics only after successfully sending ATOMIC_INCREMENT(&pSignalingClient->diagnostics.numberOfMessagesSent); @@ -605,6 +617,8 @@ STATUS validateSignalingClientInfo(PSignalingClient pSignalingClient, PSignaling break; case 1: + // explicit-fallthrough + case 2: // If the path is specified and not empty then we validate and copy/store if (pSignalingClient->clientInfo.signalingClientInfo.cacheFilePath != NULL && pSignalingClient->clientInfo.signalingClientInfo.cacheFilePath[0] != '\0') { @@ -691,7 +705,7 @@ STATUS refreshIceConfiguration(PSignalingClient pSignalingClient) // Force the state machine to revert back to get ICE configuration without re-connection ATOMIC_STORE(&pSignalingClient->result, (SIZE_T) SERVICE_CALL_RESULT_SIGNALING_RECONNECT_ICE); ATOMIC_STORE(&pSignalingClient->refreshIceConfig, TRUE); - + DLOGI("Retrieving ICE config through getIceServerConfig call again"); // Iterate the state machinery in steady states only - ready or connected if (pStateMachineState->state == SIGNALING_STATE_READY || pStateMachineState->state == SIGNALING_STATE_CONNECTED) { CHK_STATUS(signalingStateMachineIterator(pSignalingClient, curTime + SIGNALING_REFRESH_ICE_CONFIG_STATE_TIMEOUT, pStateMachineState->state)); @@ -941,6 +955,7 @@ STATUS describeChannel(PSignalingClient pSignalingClient, UINT64 time) // Call DescribeChannel API if (STATUS_SUCCEEDED(retStatus)) { if (apiCall) { + DLOGI("Calling because call is uncached"); // Call pre hook func if (pSignalingClient->clientInfo.describePreHookFn != NULL) { retStatus = pSignalingClient->clientInfo.describePreHookFn(pSignalingClient->clientInfo.hookCustomData); @@ -1236,26 +1251,48 @@ STATUS signalingGetMetrics(PSignalingClient pSignalingClient, PSignalingClientMe curTime = SIGNALING_GET_CURRENT_TIME(pSignalingClient); CHK(pSignalingClient != NULL && pSignalingClientMetrics != NULL, STATUS_NULL_ARG); - CHK(pSignalingClientMetrics->version <= SIGNALING_CLIENT_METRICS_CURRENT_VERSION, STATUS_SIGNALING_INVALID_METRICS_VERSION); + + if (pSignalingClientMetrics->version > SIGNALING_CLIENT_METRICS_CURRENT_VERSION) { + DLOGW("Invalid signaling client metrics version...setting to highest supported by default version %d", + SIGNALING_CLIENT_METRICS_CURRENT_VERSION); + pSignalingClientMetrics->version = SIGNALING_CLIENT_METRICS_CURRENT_VERSION; + } // Interlock the threading due to data race possibility MUTEX_LOCK(pSignalingClient->diagnosticsLock); - // Fill in the data structures according to the version of the requested structure - currently only v0 - pSignalingClientMetrics->signalingClientStats.signalingClientUptime = curTime - pSignalingClient->diagnostics.createTime; - pSignalingClientMetrics->signalingClientStats.numberOfMessagesSent = (UINT32) pSignalingClient->diagnostics.numberOfMessagesSent; - pSignalingClientMetrics->signalingClientStats.numberOfMessagesReceived = (UINT32) pSignalingClient->diagnostics.numberOfMessagesReceived; - pSignalingClientMetrics->signalingClientStats.iceRefreshCount = (UINT32) pSignalingClient->diagnostics.iceRefreshCount; - pSignalingClientMetrics->signalingClientStats.numberOfErrors = (UINT32) pSignalingClient->diagnostics.numberOfErrors; - pSignalingClientMetrics->signalingClientStats.numberOfRuntimeErrors = (UINT32) pSignalingClient->diagnostics.numberOfRuntimeErrors; - pSignalingClientMetrics->signalingClientStats.numberOfReconnects = (UINT32) pSignalingClient->diagnostics.numberOfReconnects; - pSignalingClientMetrics->signalingClientStats.cpApiCallLatency = pSignalingClient->diagnostics.cpApiLatency; - pSignalingClientMetrics->signalingClientStats.dpApiCallLatency = pSignalingClient->diagnostics.dpApiLatency; - - pSignalingClientMetrics->signalingClientStats.connectionDuration = - ATOMIC_LOAD_BOOL(&pSignalingClient->connected) ? curTime - pSignalingClient->diagnostics.connectTime : 0; - pSignalingClientMetrics->signalingClientStats.apiCallRetryCount = pSignalingClient->diagnostics.stateMachineRetryCount; + MEMSET(&pSignalingClientMetrics->signalingClientStats, 0x00, SIZEOF(pSignalingClientMetrics->signalingClientStats)); + switch (pSignalingClientMetrics->version) { + case 1: + pSignalingClientMetrics->signalingClientStats.getTokenCallTime = pSignalingClient->diagnostics.getTokenCallTime; + pSignalingClientMetrics->signalingClientStats.describeCallTime = pSignalingClient->diagnostics.describeCallTime; + pSignalingClientMetrics->signalingClientStats.createCallTime = pSignalingClient->diagnostics.createCallTime; + pSignalingClientMetrics->signalingClientStats.getEndpointCallTime = pSignalingClient->diagnostics.getEndpointCallTime; + pSignalingClientMetrics->signalingClientStats.getIceConfigCallTime = pSignalingClient->diagnostics.getIceConfigCallTime; + pSignalingClientMetrics->signalingClientStats.connectCallTime = pSignalingClient->diagnostics.connectCallTime; + pSignalingClientMetrics->signalingClientStats.createClientTime = pSignalingClient->diagnostics.createClientTime; + pSignalingClientMetrics->signalingClientStats.fetchClientTime = pSignalingClient->diagnostics.fetchClientTime; + pSignalingClientMetrics->signalingClientStats.connectClientTime = pSignalingClient->diagnostics.connectClientTime; + pSignalingClientMetrics->signalingClientStats.offerToAnswerTime = pSignalingClient->diagnostics.offerToAnswerTime; + case 0: + // Fill in the data structures according to the version of the requested structure + pSignalingClientMetrics->signalingClientStats.signalingClientUptime = curTime - pSignalingClient->diagnostics.createTime; + pSignalingClientMetrics->signalingClientStats.numberOfMessagesSent = (UINT32) pSignalingClient->diagnostics.numberOfMessagesSent; + pSignalingClientMetrics->signalingClientStats.numberOfMessagesReceived = (UINT32) pSignalingClient->diagnostics.numberOfMessagesReceived; + pSignalingClientMetrics->signalingClientStats.iceRefreshCount = (UINT32) pSignalingClient->diagnostics.iceRefreshCount; + pSignalingClientMetrics->signalingClientStats.numberOfErrors = (UINT32) pSignalingClient->diagnostics.numberOfErrors; + pSignalingClientMetrics->signalingClientStats.numberOfRuntimeErrors = (UINT32) pSignalingClient->diagnostics.numberOfRuntimeErrors; + pSignalingClientMetrics->signalingClientStats.numberOfReconnects = (UINT32) pSignalingClient->diagnostics.numberOfReconnects; + pSignalingClientMetrics->signalingClientStats.cpApiCallLatency = pSignalingClient->diagnostics.cpApiLatency; + pSignalingClientMetrics->signalingClientStats.dpApiCallLatency = pSignalingClient->diagnostics.dpApiLatency; + + pSignalingClientMetrics->signalingClientStats.connectionDuration = + ATOMIC_LOAD_BOOL(&pSignalingClient->connected) ? curTime - pSignalingClient->diagnostics.connectTime : 0; + pSignalingClientMetrics->signalingClientStats.apiCallRetryCount = pSignalingClient->diagnostics.stateMachineRetryCount; + default: + break; + } MUTEX_UNLOCK(pSignalingClient->diagnosticsLock); CleanUp: diff --git a/src/source/Signaling/Signaling.h b/src/source/Signaling/Signaling.h index 738e980fb0..0355be4bac 100644 --- a/src/source/Signaling/Signaling.h +++ b/src/source/Signaling/Signaling.h @@ -180,6 +180,16 @@ typedef struct { UINT64 connectTime; UINT64 cpApiLatency; UINT64 dpApiLatency; + UINT64 getTokenCallTime; + UINT64 describeCallTime; + UINT64 createCallTime; + UINT64 getEndpointCallTime; + UINT64 getIceConfigCallTime; + UINT64 connectCallTime; + UINT64 createClientTime; + UINT64 fetchClientTime; + UINT64 connectClientTime; + UINT64 offerToAnswerTime; PHashTable pEndpointToClockSkewHashMap; UINT32 stateMachineRetryCount; } SignalingDiagnostics, PSignalingDiagnostics; @@ -328,6 +338,11 @@ typedef struct { UINT64 getIceConfigTime; UINT64 deleteTime; UINT64 connectTime; + +#ifdef KVS_USE_SIGNALING_CHANNEL_THREADPOOL + PThreadpool pThreadpool; +#endif + UINT64 offerTime; } SignalingClient, *PSignalingClient; // Public handle to and from object converters diff --git a/src/source/Signaling/StateMachine.c b/src/source/Signaling/StateMachine.c index 47a49e993a..44462f2af7 100644 --- a/src/source/Signaling/StateMachine.c +++ b/src/source/Signaling/StateMachine.c @@ -309,6 +309,7 @@ STATUS executeGetTokenSignalingState(UINT64 customData, UINT64 time) STATUS retStatus = STATUS_SUCCESS; PSignalingClient pSignalingClient = SIGNALING_CLIENT_FROM_CUSTOM_DATA(customData); SERVICE_CALL_RESULT serviceCallResult; + UINT64 startTimeInMacro = 0; CHK(pSignalingClient != NULL, STATUS_NULL_ARG); @@ -324,7 +325,9 @@ STATUS executeGetTokenSignalingState(UINT64 customData, UINT64 time) THREAD_SLEEP_UNTIL(time); // Use the credential provider to get the token - retStatus = pSignalingClient->pCredentialProvider->getCredentialsFn(pSignalingClient->pCredentialProvider, &pSignalingClient->pAwsCredentials); + PROFILE_CALL_WITH_T_OBJ(retStatus = pSignalingClient->pCredentialProvider->getCredentialsFn(pSignalingClient->pCredentialProvider, + &pSignalingClient->pAwsCredentials), + pSignalingClient->diagnostics.getTokenCallTime, "Get token call"); // Check the expiration if (NULL == pSignalingClient->pAwsCredentials || SIGNALING_GET_CURRENT_TIME(pSignalingClient) >= pSignalingClient->pAwsCredentials->expiration) { @@ -389,6 +392,7 @@ STATUS executeDescribeSignalingState(UINT64 customData, UINT64 time) ENTERS(); STATUS retStatus = STATUS_SUCCESS; PSignalingClient pSignalingClient = SIGNALING_CLIENT_FROM_CUSTOM_DATA(customData); + UINT64 startTimeInMacro = 0; CHK(pSignalingClient != NULL, STATUS_NULL_ARG); ATOMIC_STORE(&pSignalingClient->result, (SIZE_T) SERVICE_CALL_RESULT_NOT_SET); @@ -401,7 +405,8 @@ STATUS executeDescribeSignalingState(UINT64 customData, UINT64 time) } // Call the aggregate function - retStatus = describeChannel(pSignalingClient, time); + PROFILE_CALL_WITH_T_OBJ(retStatus = describeChannel(pSignalingClient, time), pSignalingClient->diagnostics.describeCallTime, + "Describe signaling call"); CleanUp: @@ -447,6 +452,7 @@ STATUS executeCreateSignalingState(UINT64 customData, UINT64 time) ENTERS(); STATUS retStatus = STATUS_SUCCESS; PSignalingClient pSignalingClient = SIGNALING_CLIENT_FROM_CUSTOM_DATA(customData); + UINT64 startTimeInMacro = 0; CHK(pSignalingClient != NULL, STATUS_NULL_ARG); ATOMIC_STORE(&pSignalingClient->result, (SIZE_T) SERVICE_CALL_RESULT_NOT_SET); @@ -459,7 +465,7 @@ STATUS executeCreateSignalingState(UINT64 customData, UINT64 time) } // Call the aggregate function - retStatus = createChannel(pSignalingClient, time); + PROFILE_CALL_WITH_T_OBJ(retStatus = createChannel(pSignalingClient, time), pSignalingClient->diagnostics.createCallTime, "Create signaling call"); CleanUp: @@ -504,6 +510,7 @@ STATUS executeGetEndpointSignalingState(UINT64 customData, UINT64 time) ENTERS(); STATUS retStatus = STATUS_SUCCESS; PSignalingClient pSignalingClient = SIGNALING_CLIENT_FROM_CUSTOM_DATA(customData); + UINT64 startTimeInMacro = 0; CHK(pSignalingClient != NULL, STATUS_NULL_ARG); ATOMIC_STORE(&pSignalingClient->result, (SIZE_T) SERVICE_CALL_RESULT_NOT_SET); @@ -516,7 +523,8 @@ STATUS executeGetEndpointSignalingState(UINT64 customData, UINT64 time) } // Call the aggregate function - retStatus = getChannelEndpoint(pSignalingClient, time); + PROFILE_CALL_WITH_T_OBJ(retStatus = getChannelEndpoint(pSignalingClient, time), pSignalingClient->diagnostics.getEndpointCallTime, + "Get endpoint signaling call"); CleanUp: @@ -562,6 +570,7 @@ STATUS executeGetIceConfigSignalingState(UINT64 customData, UINT64 time) ENTERS(); STATUS retStatus = STATUS_SUCCESS; PSignalingClient pSignalingClient = SIGNALING_CLIENT_FROM_CUSTOM_DATA(customData); + UINT64 startTimeInMacro = 0; CHK(pSignalingClient != NULL, STATUS_NULL_ARG); ATOMIC_STORE(&pSignalingClient->result, (SIZE_T) SERVICE_CALL_RESULT_NOT_SET); @@ -574,8 +583,8 @@ STATUS executeGetIceConfigSignalingState(UINT64 customData, UINT64 time) } // Call the aggregate function - retStatus = getIceConfig(pSignalingClient, time); - + PROFILE_CALL_WITH_T_OBJ(retStatus = getIceConfig(pSignalingClient, time), pSignalingClient->diagnostics.getIceConfigCallTime, + "Get ICE config signaling call"); CleanUp: LEAVES(); @@ -719,6 +728,7 @@ STATUS executeConnectSignalingState(UINT64 customData, UINT64 time) ENTERS(); STATUS retStatus = STATUS_SUCCESS; PSignalingClient pSignalingClient = SIGNALING_CLIENT_FROM_CUSTOM_DATA(customData); + UINT64 startTimeInMacro = 0; CHK(pSignalingClient != NULL, STATUS_NULL_ARG); @@ -728,7 +738,8 @@ STATUS executeConnectSignalingState(UINT64 customData, UINT64 time) SIGNALING_CLIENT_STATE_CONNECTING)); } - retStatus = connectSignalingChannel(pSignalingClient, time); + PROFILE_CALL_WITH_T_OBJ(retStatus = connectSignalingChannel(pSignalingClient, time), pSignalingClient->diagnostics.connectCallTime, + "Connect signaling call"); CleanUp: diff --git a/tst/CMakeLists.txt b/tst/CMakeLists.txt index d730949ab9..e31cd7658f 100644 --- a/tst/CMakeLists.txt +++ b/tst/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8) +cmake_minimum_required(VERSION 3.6.3) # Enabling the instrumented allocators to track memory add_definitions(-DINSTRUMENTED_ALLOCATORS) diff --git a/tst/DataChannelFunctionalityTest.cpp b/tst/DataChannelFunctionalityTest.cpp index 507b5176ec..abf373d5f5 100644 --- a/tst/DataChannelFunctionalityTest.cpp +++ b/tst/DataChannelFunctionalityTest.cpp @@ -107,7 +107,7 @@ TEST_F(DataChannelFunctionalityTest, dataChannelSendRecvMessageAfterDtlsComplete MEMSET(&configuration, 0x00, SIZEOF(RtcConfiguration)); - auto onDataChannel = [](UINT64 customData, PRtcDataChannel pRtcDataChannel) { ATOMIC_STORE((PSIZE_T) customData, (SIZE_T) pRtcDataChannel); }; + auto onDataChannel = [](UINT64 customData, PRtcDataChannel pRtcDataChannel) { ATOMIC_STORE((PSIZE_T)customData, reinterpret_cast(pRtcDataChannel)); }; auto dataChannelOnOpenCallback = [](UINT64 customData, PRtcDataChannel pDataChannel) { UNUSED_PARAM(pDataChannel); diff --git a/tst/IceFunctionalityTest.cpp b/tst/IceFunctionalityTest.cpp index 74f0a852a3..6ab40aa894 100644 --- a/tst/IceFunctionalityTest.cpp +++ b/tst/IceFunctionalityTest.cpp @@ -206,12 +206,7 @@ TEST_F(IceFunctionalityTest, connectionListenerFunctionalityTest) EXPECT_TRUE( IS_VALID_TID_VALUE(threadId)); ATOMIC_STORE_BOOL(&pConnectionListener->terminate, TRUE); - THREAD_SLEEP(CONNECTION_LISTENER_SHUTDOWN_TIMEOUT + 1 * HUNDREDS_OF_NANOS_IN_A_SECOND); - - MUTEX_LOCK(pConnectionListener->lock); - threadId = pConnectionListener->receiveDataRoutine; - MUTEX_UNLOCK(pConnectionListener->lock); - EXPECT_FALSE( IS_VALID_TID_VALUE(threadId)); + THREAD_JOIN(threadId, NULL); EXPECT_EQ(STATUS_SUCCESS, freeConnectionListener(&pConnectionListener)); @@ -645,9 +640,7 @@ TEST_F(IceFunctionalityTest, IceAgentPruneUnconnectedIceCandidatePairUnitTest) TEST_F(IceFunctionalityTest, IceAgentCandidateGatheringTest) { - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); typedef struct { std::vector list; diff --git a/tst/JitterBufferFunctionalityTest.cpp b/tst/JitterBufferFunctionalityTest.cpp index d88717b8da..8408629df5 100644 --- a/tst/JitterBufferFunctionalityTest.cpp +++ b/tst/JitterBufferFunctionalityTest.cpp @@ -14,6 +14,10 @@ TEST_F(JitterBufferFunctionalityTest, continousPacketsComeInOrder) { UINT32 i; UINT32 pktCount = 5; + UINT32 startingSequenceNumber = 0; + srand(time(0)); + startingSequenceNumber = rand()%UINT16_MAX; + initializeJitterBuffer(3, 0, pktCount); // First frame "1" at timestamp 100 - rtp packet #0 @@ -22,6 +26,7 @@ TEST_F(JitterBufferFunctionalityTest, continousPacketsComeInOrder) mPRtpPackets[0]->payload[0] = 1; mPRtpPackets[0]->payload[1] = 1; // First packet of a frame mPRtpPackets[0]->header.timestamp = 100; + mPRtpPackets[0]->header.sequenceNumber = startingSequenceNumber++; // Expected to get frame "1" mPExpectedFrameArr[0] = (PBYTE) MEMALLOC(1); @@ -34,12 +39,15 @@ TEST_F(JitterBufferFunctionalityTest, continousPacketsComeInOrder) mPRtpPackets[1]->payload[0] = 2; mPRtpPackets[1]->payload[1] = 1; // First packet of a frame mPRtpPackets[1]->header.timestamp = 200; + mPRtpPackets[1]->header.sequenceNumber = startingSequenceNumber++; + mPRtpPackets[2]->payloadLength = 2; mPRtpPackets[2]->payload = (PBYTE) MEMALLOC(mPRtpPackets[2]->payloadLength + 1); mPRtpPackets[2]->payload[0] = 3; mPRtpPackets[2]->payload[1] = 4; mPRtpPackets[2]->payload[2] = 0; // following packet of a frame mPRtpPackets[2]->header.timestamp = 200; + mPRtpPackets[2]->header.sequenceNumber = startingSequenceNumber++; // Expected to get frame "234" mPExpectedFrameArr[1] = (PBYTE) MEMALLOC(3); @@ -55,11 +63,13 @@ TEST_F(JitterBufferFunctionalityTest, continousPacketsComeInOrder) mPRtpPackets[3]->payload[1] = 6; mPRtpPackets[3]->payload[2] = 1; // First packet of a frame mPRtpPackets[3]->header.timestamp = 300; + mPRtpPackets[3]->header.sequenceNumber = startingSequenceNumber++; mPRtpPackets[4]->payloadLength = 1; mPRtpPackets[4]->payload = (PBYTE) MEMALLOC(mPRtpPackets[4]->payloadLength + 1); mPRtpPackets[4]->payload[0] = 7; mPRtpPackets[4]->payload[1] = 0; // Following packet of a frame mPRtpPackets[4]->header.timestamp = 300; + mPRtpPackets[4]->header.sequenceNumber = startingSequenceNumber++; // Expected to get frame "567" at close mPExpectedFrameArr[2] = (PBYTE) MEMALLOC(3); @@ -224,7 +234,7 @@ TEST_F(JitterBufferFunctionalityTest, gapBetweenTwoContinousPackets) mPRtpPackets[3]->header.timestamp = 400; mPRtpPackets[3]->header.sequenceNumber = 5; - // Expected to dropped frames when "2" "5" is not received + // Expected to dropped frames when "1" "4" is not received mExpectedDroppedFrameTimestampArr[0] = 100; mExpectedDroppedFrameTimestampArr[1] = 200; @@ -448,7 +458,7 @@ TEST_F(JitterBufferFunctionalityTest, fillDataReturnErrorWithImcompleteFrame) EXPECT_EQ(STATUS_SUCCESS, jitterBufferPush(mJitterBuffer, mPRtpPackets[i], nullptr)); } - EXPECT_EQ(STATUS_NULL_ARG, jitterBufferFillFrameData(mJitterBuffer, buffer, 2, &filledSize, 0, 1)); + EXPECT_EQ(STATUS_HASH_KEY_NOT_PRESENT, jitterBufferFillFrameData(mJitterBuffer, buffer, 2, &filledSize, 0, 1)); clearJitterBufferForTest(); MEMFREE(buffer); @@ -1120,6 +1130,729 @@ TEST_F(JitterBufferFunctionalityTest, latePacketsOfAlreadyDroppedFrame) clearJitterBufferForTest(); } + +TEST_F(JitterBufferFunctionalityTest, timestampOverflowTest) +{ + UINT32 i; + UINT32 pktCount = 7; + UINT32 startingSequenceNumber = 0; + UINT32 missingSequenceNumber = 0; + UINT32 firstSequenceNumber = 0; + initializeJitterBuffer(4, 0, pktCount); + srand(time(0)); + startingSequenceNumber = rand()%UINT16_MAX; + firstSequenceNumber = startingSequenceNumber - 1; + + // First frame "1" + mPRtpPackets[0]->payloadLength = 1; + mPRtpPackets[0]->payload = (PBYTE) MEMALLOC(mPRtpPackets[0]->payloadLength + 1); + mPRtpPackets[0]->payload[0] = 1; + mPRtpPackets[0]->payload[1] = 1; // First packet of a frame + mPRtpPackets[0]->header.timestamp = MAX_RTP_TIMESTAMP - 500; + mPRtpPackets[0]->header.sequenceNumber = startingSequenceNumber++; + + mPRtpPackets[1]->payloadLength = 1; + mPRtpPackets[1]->payload = (PBYTE) MEMALLOC(mPRtpPackets[1]->payloadLength + 1); + mPRtpPackets[1]->payload[0] = 2; + mPRtpPackets[1]->payload[1] = 0; + mPRtpPackets[1]->header.timestamp = MAX_RTP_TIMESTAMP - 500; + mPRtpPackets[1]->header.sequenceNumber = startingSequenceNumber++; + + mPRtpPackets[2]->payloadLength = 1; + mPRtpPackets[2]->payload = (PBYTE) MEMALLOC(mPRtpPackets[2]->payloadLength + 1); + mPRtpPackets[2]->payload[0] = 3; + mPRtpPackets[2]->payload[1] = 0; + mPRtpPackets[2]->header.timestamp = MAX_RTP_TIMESTAMP - 500; + mPRtpPackets[2]->header.sequenceNumber = startingSequenceNumber++; + missingSequenceNumber = startingSequenceNumber++; + + // Expected to get frame "1234" + mPExpectedFrameArr[0] = (PBYTE) MEMALLOC(4); + mPExpectedFrameArr[0][0] = 1; + mPExpectedFrameArr[0][1] = 2; + mPExpectedFrameArr[0][2] = 3; + mPExpectedFrameArr[0][3] = 4; + mExpectedFrameSizeArr[0] = 4; + + // Second frame "2" + mPRtpPackets[3]->payloadLength = 1; + mPRtpPackets[3]->payload = (PBYTE) MEMALLOC(mPRtpPackets[3]->payloadLength + 1); + mPRtpPackets[3]->payload[0] = 2; + mPRtpPackets[3]->payload[1] = 1; // First packet of a frame + mPRtpPackets[3]->header.timestamp = MAX_RTP_TIMESTAMP - 100; + mPRtpPackets[3]->header.sequenceNumber = startingSequenceNumber++; + + // Expected to get frame "2" + mPExpectedFrameArr[1] = (PBYTE) MEMALLOC(1); + mPExpectedFrameArr[1][0] = 2; + mExpectedFrameSizeArr[1] = 1; + + // Third frame "3" + mPRtpPackets[4]->payloadLength = 1; + mPRtpPackets[4]->payload = (PBYTE) MEMALLOC(mPRtpPackets[4]->payloadLength + 1); + mPRtpPackets[4]->payload[0] = 3; + mPRtpPackets[4]->payload[1] = 1; // First packet of a frame + mPRtpPackets[4]->header.timestamp = 300; + mPRtpPackets[4]->header.sequenceNumber = startingSequenceNumber++; + + // Expected to get frame "3" at close + mPExpectedFrameArr[2] = (PBYTE) MEMALLOC(1); + mPExpectedFrameArr[2][0] = 3; + mExpectedFrameSizeArr[2] = 1; + + // Third frame "4" + mPRtpPackets[5]->payloadLength = 1; + mPRtpPackets[5]->payload = (PBYTE) MEMALLOC(mPRtpPackets[5]->payloadLength + 1); + mPRtpPackets[5]->payload[0] = 4; + mPRtpPackets[5]->payload[1] = 1; // First packet of a frame + mPRtpPackets[5]->header.timestamp = 600; + mPRtpPackets[5]->header.sequenceNumber = startingSequenceNumber++; + + // Expected to get frame "4" at close + mPExpectedFrameArr[3] = (PBYTE) MEMALLOC(1); + mPExpectedFrameArr[3][0] = 4; + mExpectedFrameSizeArr[3] = 1; + + mPRtpPackets[6]->payloadLength = 1; + mPRtpPackets[6]->payload = (PBYTE) MEMALLOC(mPRtpPackets[6]->payloadLength + 1); + mPRtpPackets[6]->payload[0] = 4; + mPRtpPackets[6]->payload[1] = 0; // First packet of a frame + mPRtpPackets[6]->header.timestamp = MAX_RTP_TIMESTAMP - 500; + mPRtpPackets[6]->header.sequenceNumber = missingSequenceNumber; + + setPayloadToFree(); + + for (i = 0; i < pktCount; i++) { + EXPECT_EQ(STATUS_SUCCESS, jitterBufferPush(mJitterBuffer, mPRtpPackets[i], nullptr)); + switch (i) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + EXPECT_EQ(0, mReadyFrameIndex); + break; + case 6: + EXPECT_EQ(3, mReadyFrameIndex); + break; + default: + ASSERT_TRUE(FALSE); + } + EXPECT_EQ(0, mDroppedFrameIndex); + } + + clearJitterBufferForTest(); +} + +TEST_F(JitterBufferFunctionalityTest, timestampUnderflowTest) +{ + UINT32 i; + UINT32 pktCount = 8; + UINT32 startingSequenceNumber = 0; + UINT32 missingSequenceNumber = 0; + UINT32 firstSequenceNumber = 0; + srand(time(0)); + startingSequenceNumber = rand()%UINT16_MAX; + firstSequenceNumber = startingSequenceNumber - 1; + + initializeJitterBuffer(5, 0, pktCount); + + // Second frame "1234" at timestamp 0 -- first frame comes later + // The "4" will come late + mPRtpPackets[0]->payloadLength = 1; + mPRtpPackets[0]->payload = (PBYTE) MEMALLOC(mPRtpPackets[0]->payloadLength + 1); + mPRtpPackets[0]->payload[0] = 1; + mPRtpPackets[0]->payload[1] = 1; // First packet of a frame + mPRtpPackets[0]->header.timestamp = 0; + mPRtpPackets[0]->header.sequenceNumber = startingSequenceNumber++; + + mPRtpPackets[1]->payloadLength = 1; + mPRtpPackets[1]->payload = (PBYTE) MEMALLOC(mPRtpPackets[1]->payloadLength + 1); + mPRtpPackets[1]->payload[0] = 2; + mPRtpPackets[1]->payload[1] = 0; + mPRtpPackets[1]->header.timestamp = 0; + mPRtpPackets[1]->header.sequenceNumber = startingSequenceNumber++; + + mPRtpPackets[2]->payloadLength = 1; + mPRtpPackets[2]->payload = (PBYTE) MEMALLOC(mPRtpPackets[2]->payloadLength + 1); + mPRtpPackets[2]->payload[0] = 3; + mPRtpPackets[2]->payload[1] = 0; + mPRtpPackets[2]->header.timestamp = 0; + mPRtpPackets[2]->header.sequenceNumber = startingSequenceNumber++; + + //sequence number of 4th packet of this frame + missingSequenceNumber = startingSequenceNumber++; + + // Expected to get frame "1234" + mPExpectedFrameArr[1] = (PBYTE) MEMALLOC(4); + mPExpectedFrameArr[1][0] = 1; + mPExpectedFrameArr[1][1] = 2; + mPExpectedFrameArr[1][2] = 3; + mPExpectedFrameArr[1][3] = 4; + mExpectedFrameSizeArr[1] = 4; + + // Third frame "2" at timestamp 300 + mPRtpPackets[3]->payloadLength = 1; + mPRtpPackets[3]->payload = (PBYTE) MEMALLOC(mPRtpPackets[3]->payloadLength + 1); + mPRtpPackets[3]->payload[0] = 2; + mPRtpPackets[3]->payload[1] = 1; // First packet of a frame + mPRtpPackets[3]->header.timestamp = 300; + mPRtpPackets[3]->header.sequenceNumber = startingSequenceNumber++; + + // Expected to get frame "2" + mPExpectedFrameArr[2] = (PBYTE) MEMALLOC(1); + mPExpectedFrameArr[2][0] = 2; + mExpectedFrameSizeArr[2] = 1; + + // Fourth frame "3" at timestamp 600 + mPRtpPackets[4]->payloadLength = 1; + mPRtpPackets[4]->payload = (PBYTE) MEMALLOC(mPRtpPackets[4]->payloadLength + 1); + mPRtpPackets[4]->payload[0] = 3; + mPRtpPackets[4]->payload[1] = 1; // First packet of a frame + mPRtpPackets[4]->header.timestamp = 600; + mPRtpPackets[4]->header.sequenceNumber = startingSequenceNumber++; + + // Expected to get frame "3" at close + mPExpectedFrameArr[3] = (PBYTE) MEMALLOC(1); + mPExpectedFrameArr[3][0] = 3; + mExpectedFrameSizeArr[3] = 1; + + // Fifth frame "4" at timestamp 400 - rtp packet #1 + mPRtpPackets[5]->payloadLength = 1; + mPRtpPackets[5]->payload = (PBYTE) MEMALLOC(mPRtpPackets[5]->payloadLength + 1); + mPRtpPackets[5]->payload[0] = 4; + mPRtpPackets[5]->payload[1] = 1; // First packet of a frame + mPRtpPackets[5]->header.timestamp = 900; + mPRtpPackets[5]->header.sequenceNumber = startingSequenceNumber++; + + // Expected to get frame "4" at close + mPExpectedFrameArr[4] = (PBYTE) MEMALLOC(1); + mPExpectedFrameArr[4][0] = 4; + mExpectedFrameSizeArr[4] = 1; + + // Actual first frame, underflow timestamp + mPRtpPackets[6]->payloadLength = 1; + mPRtpPackets[6]->payload = (PBYTE) MEMALLOC(mPRtpPackets[6]->payloadLength + 1); + mPRtpPackets[6]->payload[0] = 4; + mPRtpPackets[6]->payload[1] = 1; // First packet of a frame + mPRtpPackets[6]->header.timestamp = MAX_RTP_TIMESTAMP - 300; + mPRtpPackets[6]->header.sequenceNumber = firstSequenceNumber; + + // Expected to get frame "4" at close + mPExpectedFrameArr[0] = (PBYTE) MEMALLOC(1); + mPExpectedFrameArr[0][0] = 4; + mExpectedFrameSizeArr[0] = 1; + + // Missing 4th packet in 2nd frame + mPRtpPackets[7]->payloadLength = 1; + mPRtpPackets[7]->payload = (PBYTE) MEMALLOC(mPRtpPackets[7]->payloadLength + 1); + mPRtpPackets[7]->payload[0] = 4; + mPRtpPackets[7]->payload[1] = 0; + mPRtpPackets[7]->header.timestamp = 0; + mPRtpPackets[7]->header.sequenceNumber = missingSequenceNumber; + + setPayloadToFree(); + + for (i = 0; i < pktCount; i++) { + EXPECT_EQ(STATUS_SUCCESS, jitterBufferPush(mJitterBuffer, mPRtpPackets[i], nullptr)); + switch (i) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + EXPECT_EQ(0, mReadyFrameIndex); + break; + case 6: + EXPECT_EQ(1, mReadyFrameIndex); + break; + case 7: + EXPECT_EQ(4, mReadyFrameIndex); + break; + default: + ASSERT_TRUE(FALSE); + } + EXPECT_EQ(0, mDroppedFrameIndex); + } + + clearJitterBufferForTest(); +} + +TEST_F(JitterBufferFunctionalityTest, SequenceNumberOverflowTest) +{ + UINT32 i; + UINT32 pktCount = 7; + initializeJitterBuffer(4, 0, pktCount); + + // First frame "1" at timestamp 100 - rtp packet #65534 + mPRtpPackets[0]->payloadLength = 1; + mPRtpPackets[0]->payload = (PBYTE) MEMALLOC(mPRtpPackets[0]->payloadLength + 1); + mPRtpPackets[0]->payload[0] = 1; + mPRtpPackets[0]->payload[1] = 1; // First packet of a frame + mPRtpPackets[0]->header.timestamp = 100; + mPRtpPackets[0]->header.sequenceNumber = 65534; + + mPRtpPackets[1]->payloadLength = 1; + mPRtpPackets[1]->payload = (PBYTE) MEMALLOC(mPRtpPackets[1]->payloadLength + 1); + mPRtpPackets[1]->payload[0] = 2; + mPRtpPackets[1]->payload[1] = 0; + mPRtpPackets[1]->header.timestamp = 100; + mPRtpPackets[1]->header.sequenceNumber = 65535; + + mPRtpPackets[2]->payloadLength = 1; + mPRtpPackets[2]->payload = (PBYTE) MEMALLOC(mPRtpPackets[2]->payloadLength + 1); + mPRtpPackets[2]->payload[0] = 3; + mPRtpPackets[2]->payload[1] = 0; + mPRtpPackets[2]->header.timestamp = 100; + mPRtpPackets[2]->header.sequenceNumber = 0; + + // Expected to get frame "1234" + mPExpectedFrameArr[0] = (PBYTE) MEMALLOC(4); + mPExpectedFrameArr[0][0] = 1; + mPExpectedFrameArr[0][1] = 2; + mPExpectedFrameArr[0][2] = 3; + mPExpectedFrameArr[0][3] = 4; + mExpectedFrameSizeArr[0] = 4; + + // Second frame "2" at timestamp 200 - rtp packet #65535 + mPRtpPackets[3]->payloadLength = 1; + mPRtpPackets[3]->payload = (PBYTE) MEMALLOC(mPRtpPackets[3]->payloadLength + 1); + mPRtpPackets[3]->payload[0] = 2; + mPRtpPackets[3]->payload[1] = 1; // First packet of a frame + mPRtpPackets[3]->header.timestamp = 200; + mPRtpPackets[3]->header.sequenceNumber = 2; + + // Expected to get frame "2" + mPExpectedFrameArr[1] = (PBYTE) MEMALLOC(1); + mPExpectedFrameArr[1][0] = 2; + mExpectedFrameSizeArr[1] = 1; + + // Third frame "3" at timestamp 300 - rtp packet #0 + mPRtpPackets[4]->payloadLength = 1; + mPRtpPackets[4]->payload = (PBYTE) MEMALLOC(mPRtpPackets[4]->payloadLength + 1); + mPRtpPackets[4]->payload[0] = 3; + mPRtpPackets[4]->payload[1] = 1; // First packet of a frame + mPRtpPackets[4]->header.timestamp = 300; + mPRtpPackets[4]->header.sequenceNumber = 3; + + // Expected to get frame "3" at close + mPExpectedFrameArr[2] = (PBYTE) MEMALLOC(1); + mPExpectedFrameArr[2][0] = 3; + mExpectedFrameSizeArr[2] = 1; + + // Third frame "4" at timestamp 400 - rtp packet #1 + mPRtpPackets[5]->payloadLength = 1; + mPRtpPackets[5]->payload = (PBYTE) MEMALLOC(mPRtpPackets[5]->payloadLength + 1); + mPRtpPackets[5]->payload[0] = 4; + mPRtpPackets[5]->payload[1] = 1; // First packet of a frame + mPRtpPackets[5]->header.timestamp = 400; + mPRtpPackets[5]->header.sequenceNumber = 4; + + // Expected to get frame "4" at close + mPExpectedFrameArr[3] = (PBYTE) MEMALLOC(1); + mPExpectedFrameArr[3][0] = 4; + mExpectedFrameSizeArr[3] = 1; + + mPRtpPackets[6]->payloadLength = 1; + mPRtpPackets[6]->payload = (PBYTE) MEMALLOC(mPRtpPackets[6]->payloadLength + 1); + mPRtpPackets[6]->payload[0] = 4; + mPRtpPackets[6]->payload[1] = 0; // First packet of a frame + mPRtpPackets[6]->header.timestamp = 100; + mPRtpPackets[6]->header.sequenceNumber = 1; + + setPayloadToFree(); + + for (i = 0; i < pktCount; i++) { + EXPECT_EQ(STATUS_SUCCESS, jitterBufferPush(mJitterBuffer, mPRtpPackets[i], nullptr)); + switch (i) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + EXPECT_EQ(0, mReadyFrameIndex); + break; + case 6: + EXPECT_EQ(3, mReadyFrameIndex); + break; + default: + ASSERT_TRUE(FALSE); + } + EXPECT_EQ(0, mDroppedFrameIndex); + } + + clearJitterBufferForTest(); +} + +TEST_F(JitterBufferFunctionalityTest, SequenceNumberUnderflowTest) +{ + UINT32 i; + UINT32 pktCount = 8; + UINT32 startingSequenceNumber = 0; + UINT32 missingSequenceNumber = 0; + UINT32 firstSequenceNumber = MAX_RTP_SEQUENCE_NUM-2; + + srand(time(0)); + UINT32 startingTimestamp = rand()%UINT32_MAX; + + initializeJitterBuffer(5, 0, pktCount); + + // Fourth frame "1234", first frame comes later + // The "4" will come late + mPRtpPackets[0]->payloadLength = 1; + mPRtpPackets[0]->payload = (PBYTE) MEMALLOC(mPRtpPackets[0]->payloadLength + 1); + mPRtpPackets[0]->payload[0] = 1; + mPRtpPackets[0]->payload[1] = 1; // First packet of a frame + mPRtpPackets[0]->header.timestamp = startingTimestamp + 300; + mPRtpPackets[0]->header.sequenceNumber = startingSequenceNumber++; + + mPRtpPackets[1]->payloadLength = 1; + mPRtpPackets[1]->payload = (PBYTE) MEMALLOC(mPRtpPackets[1]->payloadLength + 1); + mPRtpPackets[1]->payload[0] = 2; + mPRtpPackets[1]->payload[1] = 0; + mPRtpPackets[1]->header.timestamp = startingTimestamp + 300; + mPRtpPackets[1]->header.sequenceNumber = startingSequenceNumber++; + + mPRtpPackets[2]->payloadLength = 1; + mPRtpPackets[2]->payload = (PBYTE) MEMALLOC(mPRtpPackets[2]->payloadLength + 1); + mPRtpPackets[2]->payload[0] = 3; + mPRtpPackets[2]->payload[1] = 0; + mPRtpPackets[2]->header.timestamp = startingTimestamp + 300; + mPRtpPackets[2]->header.sequenceNumber = startingSequenceNumber++; + + //sequence number of 4th packet of this frame + missingSequenceNumber = startingSequenceNumber++; + + // Expected to get frame "1234" + mPExpectedFrameArr[3] = (PBYTE) MEMALLOC(4); + mPExpectedFrameArr[3][0] = 1; + mPExpectedFrameArr[3][1] = 2; + mPExpectedFrameArr[3][2] = 3; + mPExpectedFrameArr[3][3] = 4; + mExpectedFrameSizeArr[3] = 4; + + // First frame "2" at timestamp 300 + mPRtpPackets[3]->payloadLength = 1; + mPRtpPackets[3]->payload = (PBYTE) MEMALLOC(mPRtpPackets[3]->payloadLength + 1); + mPRtpPackets[3]->payload[0] = 2; + mPRtpPackets[3]->payload[1] = 1; // First packet of a frame + mPRtpPackets[3]->header.timestamp = startingTimestamp; + mPRtpPackets[3]->header.sequenceNumber = firstSequenceNumber++; + + // Expected to get frame "2" + mPExpectedFrameArr[0] = (PBYTE) MEMALLOC(1); + mPExpectedFrameArr[0][0] = 2; + mExpectedFrameSizeArr[0] = 1; + + // Second frame "3" at timestamp 600 + mPRtpPackets[4]->payloadLength = 1; + mPRtpPackets[4]->payload = (PBYTE) MEMALLOC(mPRtpPackets[4]->payloadLength + 1); + mPRtpPackets[4]->payload[0] = 3; + mPRtpPackets[4]->payload[1] = 1; // First packet of a frame + mPRtpPackets[4]->header.timestamp = startingTimestamp+100; + mPRtpPackets[4]->header.sequenceNumber = firstSequenceNumber++; + + // Expected to get frame "3" at close + mPExpectedFrameArr[1] = (PBYTE) MEMALLOC(1); + mPExpectedFrameArr[1][0] = 3; + mExpectedFrameSizeArr[1] = 1; + + // Third frame "4" + mPRtpPackets[5]->payloadLength = 1; + mPRtpPackets[5]->payload = (PBYTE) MEMALLOC(mPRtpPackets[5]->payloadLength + 1); + mPRtpPackets[5]->payload[0] = 4; + mPRtpPackets[5]->payload[1] = 1; // First packet of a frame + mPRtpPackets[5]->header.timestamp = startingTimestamp+200; + mPRtpPackets[5]->header.sequenceNumber = firstSequenceNumber++; + + // Expected to get frame "4" at close + mPExpectedFrameArr[2] = (PBYTE) MEMALLOC(1); + mPExpectedFrameArr[2][0] = 4; + mExpectedFrameSizeArr[2] = 1; + + // Fifth frame + mPRtpPackets[6]->payloadLength = 1; + mPRtpPackets[6]->payload = (PBYTE) MEMALLOC(mPRtpPackets[6]->payloadLength + 1); + mPRtpPackets[6]->payload[0] = 4; + mPRtpPackets[6]->payload[1] = 1; // First packet of a frame + mPRtpPackets[6]->header.timestamp = startingTimestamp+400; + mPRtpPackets[6]->header.sequenceNumber = startingSequenceNumber++; + + // Expected to get frame "4" at close + mPExpectedFrameArr[4] = (PBYTE) MEMALLOC(1); + mPExpectedFrameArr[4][0] = 4; + mExpectedFrameSizeArr[4] = 1; + + // Missing 4th packet in 4th frame + mPRtpPackets[7]->payloadLength = 1; + mPRtpPackets[7]->payload = (PBYTE) MEMALLOC(mPRtpPackets[7]->payloadLength + 1); + mPRtpPackets[7]->payload[0] = 4; + mPRtpPackets[7]->payload[1] = 0; + mPRtpPackets[7]->header.timestamp = startingTimestamp+300; + mPRtpPackets[7]->header.sequenceNumber = missingSequenceNumber; + + setPayloadToFree(); + + for (i = 0; i < pktCount; i++) { + EXPECT_EQ(STATUS_SUCCESS, jitterBufferPush(mJitterBuffer, mPRtpPackets[i], nullptr)); + switch (i) { + case 0: + case 1: + case 2: + case 3: + EXPECT_EQ(0, mReadyFrameIndex); + break; + case 4: + EXPECT_EQ(1, mReadyFrameIndex); + break; + case 5: + case 6: + EXPECT_EQ(3, mReadyFrameIndex); + break; + case 7: + EXPECT_EQ(4, mReadyFrameIndex); + break; + default: + ASSERT_TRUE(FALSE); + } + EXPECT_EQ(0, mDroppedFrameIndex); + } + + clearJitterBufferForTest(); +} + +TEST_F(JitterBufferFunctionalityTest, DoubleOverflowTest) +{ + UINT32 i; + UINT32 pktCount = 7; + initializeJitterBuffer(4, 0, pktCount); + + // First frame "1" at timestamp 100 - rtp packet #65534 + mPRtpPackets[0]->payloadLength = 1; + mPRtpPackets[0]->payload = (PBYTE) MEMALLOC(mPRtpPackets[0]->payloadLength + 1); + mPRtpPackets[0]->payload[0] = 1; + mPRtpPackets[0]->payload[1] = 1; // First packet of a frame + mPRtpPackets[0]->header.timestamp = MAX_RTP_TIMESTAMP - 500; + mPRtpPackets[0]->header.sequenceNumber = 65534; + + mPRtpPackets[1]->payloadLength = 1; + mPRtpPackets[1]->payload = (PBYTE) MEMALLOC(mPRtpPackets[1]->payloadLength + 1); + mPRtpPackets[1]->payload[0] = 2; + mPRtpPackets[1]->payload[1] = 0; + mPRtpPackets[1]->header.timestamp = MAX_RTP_TIMESTAMP - 500; + mPRtpPackets[1]->header.sequenceNumber = 65535; + + mPRtpPackets[2]->payloadLength = 1; + mPRtpPackets[2]->payload = (PBYTE) MEMALLOC(mPRtpPackets[2]->payloadLength + 1); + mPRtpPackets[2]->payload[0] = 3; + mPRtpPackets[2]->payload[1] = 0; + mPRtpPackets[2]->header.timestamp = MAX_RTP_TIMESTAMP - 500; + mPRtpPackets[2]->header.sequenceNumber = 0; + + // Expected to get frame "1234" + mPExpectedFrameArr[0] = (PBYTE) MEMALLOC(4); + mPExpectedFrameArr[0][0] = 1; + mPExpectedFrameArr[0][1] = 2; + mPExpectedFrameArr[0][2] = 3; + mPExpectedFrameArr[0][3] = 4; + mExpectedFrameSizeArr[0] = 4; + + // Second frame "2" at timestamp 200 - rtp packet #65535 + mPRtpPackets[3]->payloadLength = 1; + mPRtpPackets[3]->payload = (PBYTE) MEMALLOC(mPRtpPackets[3]->payloadLength + 1); + mPRtpPackets[3]->payload[0] = 2; + mPRtpPackets[3]->payload[1] = 1; // First packet of a frame + mPRtpPackets[3]->header.timestamp = MAX_RTP_TIMESTAMP - 100; + mPRtpPackets[3]->header.sequenceNumber = 2; + + // Expected to get frame "2" + mPExpectedFrameArr[1] = (PBYTE) MEMALLOC(1); + mPExpectedFrameArr[1][0] = 2; + mExpectedFrameSizeArr[1] = 1; + + // Third frame "3" at timestamp 300 - rtp packet #0 + mPRtpPackets[4]->payloadLength = 1; + mPRtpPackets[4]->payload = (PBYTE) MEMALLOC(mPRtpPackets[4]->payloadLength + 1); + mPRtpPackets[4]->payload[0] = 3; + mPRtpPackets[4]->payload[1] = 1; // First packet of a frame + mPRtpPackets[4]->header.timestamp = 300; + mPRtpPackets[4]->header.sequenceNumber = 3; + + // Expected to get frame "3" at close + mPExpectedFrameArr[2] = (PBYTE) MEMALLOC(1); + mPExpectedFrameArr[2][0] = 3; + mExpectedFrameSizeArr[2] = 1; + + // Third frame "4" at timestamp 400 - rtp packet #1 + mPRtpPackets[5]->payloadLength = 1; + mPRtpPackets[5]->payload = (PBYTE) MEMALLOC(mPRtpPackets[5]->payloadLength + 1); + mPRtpPackets[5]->payload[0] = 4; + mPRtpPackets[5]->payload[1] = 1; // First packet of a frame + mPRtpPackets[5]->header.timestamp = 600; + mPRtpPackets[5]->header.sequenceNumber = 4; + + // Expected to get frame "4" at close + mPExpectedFrameArr[3] = (PBYTE) MEMALLOC(1); + mPExpectedFrameArr[3][0] = 4; + mExpectedFrameSizeArr[3] = 1; + + mPRtpPackets[6]->payloadLength = 1; + mPRtpPackets[6]->payload = (PBYTE) MEMALLOC(mPRtpPackets[6]->payloadLength + 1); + mPRtpPackets[6]->payload[0] = 4; + mPRtpPackets[6]->payload[1] = 0; // First packet of a frame + mPRtpPackets[6]->header.timestamp = MAX_RTP_TIMESTAMP - 500; + mPRtpPackets[6]->header.sequenceNumber = 1; + + setPayloadToFree(); + + for (i = 0; i < pktCount; i++) { + EXPECT_EQ(STATUS_SUCCESS, jitterBufferPush(mJitterBuffer, mPRtpPackets[i], nullptr)); + switch (i) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + EXPECT_EQ(0, mReadyFrameIndex); + break; + case 6: + EXPECT_EQ(3, mReadyFrameIndex); + break; + default: + ASSERT_TRUE(FALSE); + } + EXPECT_EQ(0, mDroppedFrameIndex); + } + + clearJitterBufferForTest(); +} + +#if 0 +//TODO complete this test +TEST_F(JitterBufferFunctionalityTest, LongRunningWithDroppedPacketsTest) +{ + UINT32 timeStep = 100; + UINT16 startingSequenceNumber = 0; + UINT32 startingTimestamp = 0; + UINT32 totalPackets = 0; + UINT32 droppedPackets = 0; + UINT32 rangeForNextDrop = 0; + UINT32 nextDrop = 0; + UINT32 dropSection = 0; + UINT32 packetCount = 0; + UINT32 frameCount = 0; + UINT32 readyFrameCount = 0; + UINT32 droppedFrameCount = 0; + UINT32 currentDroppedPacket = 0; + BOOL dropped = FALSE; + std::vector dropNextPacket; + std::vector packetsPerFrame; + std::vector packetsOfFrameToDrop; + + srand(time(0)); + + //between 1-3 UINT16 cycles + totalPackets = rand()%(UINT16_MAX*2) + UINT16_MAX; + //100-200 dropped OR very late packets + droppedPackets = rand()%(100) + 100; + startingSequenceNumber = rand()%UINT16_MAX; + startingTimestamp = rand()%UINT32_MAX; + + dropSection = totalPackets/droppedPackets; + rangeForNextDrop = dropSection; + for(auto i = 0; i < droppedPackets; i++) { + nextDrop = rand()%rangeForNextDrop; + rangeForNextDrop += std::abs(dropSection-nextDrop); + if(i == 0) { + dropNextPacket.push_back(nextDrop); + } + else { + dropNextPacket.push_back(dropNextPacket.back() + nextDrop); + } + } + + while(packetCount < totalPackets) { + if((totalPackets - packetCount) <= 30) { + packetsPerFrame.push_back(totalPackets-packetCount); + } + else { + packetsPerFrame.push_back(rand()%29 + 2); + } + packetCount += packetsPerFrame.back(); + frameCount++; + while(packetCount > dropNextPacket[currentDroppedPacket]) { + dropped = TRUE; + currentDroppedPacket++; + } + if(dropped) { + droppedFrameCount++; + } + else { + readyFrameCount++; + } + dropped = FALSE; + } + + initializeJitterBuffer(readyFrameCount, droppedFrameCount, totalPackets); + + dropped = FALSE; + packetCount = 0; + droppedFrameCount = 0; + currentDroppedPacket = 0; + + for(auto frame = 0; frame < frameCount; frame++) { + //is frame missing a packet + while((packetsPerFrame[frame] + packetCount ) > dropNextPacket[currentDroppedPacket]){ + dropped = TRUE; + packetsOfFrameToDrop.push_back(dropNextPacket[currentDroppedPacket] - packetCount); + currentDroppedPacket++; + } + if(dropped) { + droppedFrameCount++; + } + else { + mPExpectedFrameArr[frame-droppedFrameCount] = (PBYTE) MEMALLOC(packetsPerFrame[frame]); + mExpectedFrameSizeArr[frame-droppedFrameCount] = packetsPerFrame[frame]; + } + for(auto packet = 0; packet < packetsPerFrame[frame]; packet++) { + if(!dropped) { + mPExpectedFrameArr[frame-droppedFrameCount][packet] = packet; + } + + mPRtpPackets[packetCount]->payloadLength = 1; + mPRtpPackets[packetCount]->payload = (PBYTE) MEMALLOC(mPRtpPackets[packetCount]->payloadLength + 1); + mPRtpPackets[packetCount]->payload[0] = packet; + if(packet == 0) { + mPRtpPackets[packetCount]->payload[1] = 1; // First packet of a frame + } + else { + mPRtpPackets[packetCount]->payload[1] = 0; + } + mPRtpPackets[packetCount]->header.timestamp = startingTimestamp; + mPRtpPackets[packetCount]->header.sequenceNumber = startingSequenceNumber++; + + packetCount++; + } + if(dropped) { + mExpectedDroppedFrameTimestampArr[droppedFrameCount-1] = startingTimestamp; + } + startingTimestamp += timeStep; + + } + + setPayloadToFree(); + + for(auto i = 0; i < totalPackets; i++) { + EXPECT_EQ(STATUS_SUCCESS, jitterBufferPush(mJitterBuffer, mPRtpPackets[i], nullptr)); + } + clearJitterBufferForTest(); +} +#endif + } // namespace webrtcclient } // namespace video } // namespace kinesis diff --git a/tst/NetworkApiTest.cpp b/tst/NetworkApiTest.cpp new file mode 100644 index 0000000000..c5702a61c6 --- /dev/null +++ b/tst/NetworkApiTest.cpp @@ -0,0 +1,38 @@ +#include "WebRTCClientTestFixture.h" + +namespace com { +namespace amazonaws { +namespace kinesis { +namespace video { +namespace webrtcclient { + +class NetworkApiTest : public WebRtcClientTestBase { +}; + +TEST_F(NetworkApiTest, GetIpWithHostNameTest) +{ + KvsIpAddress ipAddress; + EXPECT_EQ(STATUS_NULL_ARG, getIpWithHostName(NULL, &ipAddress)); + EXPECT_EQ(STATUS_RESOLVE_HOSTNAME_FAILED, getIpWithHostName((PCHAR) "stun:stun.test.net:3478", &ipAddress)); + EXPECT_EQ(STATUS_SUCCESS, getIpWithHostName((PCHAR) "35-90-63-38.t-ae7dd61a.kinesisvideo.us-west-2.amazonaws.com", &ipAddress)); + EXPECT_EQ(STATUS_SUCCESS, getIpWithHostName((PCHAR) "12.34.45.40", &ipAddress)); + EXPECT_EQ(STATUS_SUCCESS, getIpWithHostName((PCHAR) "2001:0db8:85a3:0000:0000:8a2e:0370:7334", &ipAddress)); + EXPECT_EQ(STATUS_RESOLVE_HOSTNAME_FAILED, getIpWithHostName((PCHAR) ".12.34.45.40", &ipAddress)); + EXPECT_EQ(STATUS_RESOLVE_HOSTNAME_FAILED, getIpWithHostName((PCHAR) "...........", &ipAddress)); +} + +TEST_F(NetworkApiTest, ipIpAddrTest) +{ + EXPECT_EQ(FALSE, isIpAddr((PCHAR) "stun:stun.test.net:3478", STRLEN("stun:stun.test.net:3478"))); + EXPECT_EQ(TRUE, isIpAddr((PCHAR) "12.34.45.40", STRLEN("12.34.45.40"))); + EXPECT_EQ(FALSE, isIpAddr((PCHAR) "567.123.345.000", STRLEN("567.123.345.000"))); + EXPECT_EQ(TRUE, isIpAddr((PCHAR) "2001:0db8:85a3:0000:0000:8a2e:0370:7334", STRLEN("2001:0db8:85a3:0000:0000:8a2e:0370:7334"))); + EXPECT_EQ(FALSE, isIpAddr((PCHAR) "2001:85a3:0000:0000:8a2e:0370:7334", STRLEN("2001:85a3:0000:0000:8a2e:0370:7334"))); +} + + +} // namespace webrtcclient +} // namespace video +} // namespace kinesis +} // namespace amazonaws +} // namespace com diff --git a/tst/PeerConnectionFunctionalityTest.cpp b/tst/PeerConnectionFunctionalityTest.cpp index 5a5e3ed3d5..35d4a3cda0 100644 --- a/tst/PeerConnectionFunctionalityTest.cpp +++ b/tst/PeerConnectionFunctionalityTest.cpp @@ -189,9 +189,7 @@ TEST_F(PeerConnectionFunctionalityTest, connectTwoPeersWithPresetCerts) // Assert that two PeerConnections with forced TURN can connect to each other and go to connected TEST_F(PeerConnectionFunctionalityTest, connectTwoPeersForcedTURN) { - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); RtcConfiguration configuration; PRtcPeerConnection offerPc = NULL, answerPc = NULL; @@ -218,9 +216,7 @@ TEST_F(PeerConnectionFunctionalityTest, connectTwoPeersForcedTURN) TEST_F(PeerConnectionFunctionalityTest, sendDataWithClosedSocketConnectionWithHostAndStun) { - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); RtcMediaStreamTrack offerVideoTrack; PRtcRtpTransceiver offerVideoTransceiver; @@ -281,9 +277,7 @@ TEST_F(PeerConnectionFunctionalityTest, sendDataWithClosedSocketConnectionWithHo TEST_F(PeerConnectionFunctionalityTest, sendDataWithClosedSocketConnectionWithForcedTurn) { - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); RtcMediaStreamTrack offerVideoTrack; PRtcRtpTransceiver offerVideoTransceiver; @@ -349,9 +343,7 @@ TEST_F(PeerConnectionFunctionalityTest, sendDataWithClosedSocketConnectionWithFo TEST_F(PeerConnectionFunctionalityTest, shutdownTurnDueToP2PFoundBeforeTurnEstablished) { - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); RtcConfiguration configuration; PRtcPeerConnection offerPc = NULL, answerPc = NULL; @@ -410,9 +402,7 @@ TEST_F(PeerConnectionFunctionalityTest, shutdownTurnDueToP2PFoundBeforeTurnEstab TEST_F(PeerConnectionFunctionalityTest, shutdownTurnDueToP2PFoundAfterTurnEstablished) { - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); RtcConfiguration configuration; PRtcPeerConnection offerPc = NULL, answerPc = NULL; @@ -541,10 +531,7 @@ TEST_F(PeerConnectionFunctionalityTest, connectTwoPeersWithHostAndStun) // Assert that two PeerConnections can connect and then terminate one of them, the other one will eventually report disconnection TEST_F(PeerConnectionFunctionalityTest, connectTwoPeersThenDisconnectTest) { - if (!mAccessKeyIdSet) { - return; - } - + ASSERT_EQ(TRUE, mAccessKeyIdSet); RtcConfiguration configuration; PRtcPeerConnection offerPc = NULL, answerPc = NULL; UINT32 i; @@ -783,9 +770,7 @@ TEST_F(PeerConnectionFunctionalityTest, exchangeMedia) // Same test as exchangeMedia, but assert that if one side is RSA DTLS and Key Extraction works TEST_F(PeerConnectionFunctionalityTest, exchangeMediaRSA) { - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); auto const frameBufferSize = 200000; @@ -869,9 +854,7 @@ TEST_F(PeerConnectionFunctionalityTest, iceRestartTestForcedTurn) RtcConfiguration configuration; PRtcPeerConnection offerPc = NULL, answerPc = NULL; - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); MEMSET(&configuration, 0x00, SIZEOF(RtcConfiguration)); configuration.iceTransportPolicy = ICE_TRANSPORT_POLICY_RELAY; @@ -905,9 +888,7 @@ TEST_F(PeerConnectionFunctionalityTest, peerConnectionOfferCloseConnection) RtcConfiguration configuration; PRtcPeerConnection offerPc = NULL, answerPc = NULL; - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); MEMSET(&configuration, 0x00, SIZEOF(RtcConfiguration)); @@ -934,10 +915,7 @@ TEST_F(PeerConnectionFunctionalityTest, peerConnectionAnswerCloseConnection) RtcConfiguration configuration; PRtcPeerConnection offerPc = NULL, answerPc = NULL; - if (!mAccessKeyIdSet) { - return; - } - + ASSERT_EQ(TRUE, mAccessKeyIdSet); MEMSET(&configuration, 0x00, SIZEOF(RtcConfiguration)); initializeSignalingClient(); @@ -960,9 +938,7 @@ TEST_F(PeerConnectionFunctionalityTest, peerConnectionAnswerCloseConnection) TEST_F(PeerConnectionFunctionalityTest, DISABLED_exchangeMediaThroughTurnRandomStop) { - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); initializeSignalingClient(); diff --git a/tst/SdpApiTest.cpp b/tst/SdpApiTest.cpp index 0edf661361..a4dccd6a2d 100644 --- a/tst/SdpApiTest.cpp +++ b/tst/SdpApiTest.cpp @@ -640,6 +640,67 @@ a=group:BUNDLE 0 }); } +// uses words "audio video data" instead of "0 1 2" for session attributes. Sends an offer, expects the answer sdp +// to contain "audio video data" as sent in the offer +TEST_F(SdpApiTest, offerWithMediaNameInBundle) +{ + auto offer = std::string(R"(v=0 +o=- 481034601 1588366671 IN IP4 0.0.0.0 +s=- +t=0 0 +a=fingerprint:sha-256 87:E6:EC:59:93:76:9F:42:7D:15:17:F6:8F:C4:29:AB:EA:3F:28:B6:DF:F8:14:2F:96:62:2F:16:98:F5:76:E5 +a=group:BUNDLE audio video data +)"); + + offer += sdpaudio_sendrecv_mid0; + offer += "\n"; + offer += sdpvideo; + offer += "\n"; + + assertLFAndCRLF((PCHAR) offer.c_str(), offer.size(), [](PCHAR sdp) { + RtcConfiguration configuration{}; + PRtcPeerConnection pRtcPeerConnection = nullptr; + RtcMediaStreamTrack track1{}; + RtcMediaStreamTrack track2{}; + PRtcRtpTransceiver transceiver1 = nullptr; + PRtcRtpTransceiver transceiver2 = nullptr; + RtcSessionDescriptionInit offerSdp{}; + RtcSessionDescriptionInit answerSdp{}; + + SNPRINTF(configuration.iceServers[0].urls, MAX_ICE_CONFIG_URI_LEN, KINESIS_VIDEO_STUN_URL, TEST_DEFAULT_REGION, TEST_DEFAULT_STUN_URL_POSTFIX); + + track1.kind = MEDIA_STREAM_TRACK_KIND_VIDEO; + track1.codec = RTC_CODEC_VP8; + STRNCPY(track1.streamId, "videoStream", MAX_MEDIA_STREAM_ID_LEN); + STRNCPY(track1.trackId, "videoTrack1", MAX_MEDIA_STREAM_TRACK_ID_LEN); + + track2.kind = MEDIA_STREAM_TRACK_KIND_AUDIO; + track2.codec = RTC_CODEC_OPUS; + STRNCPY(track2.streamId, "audioStream1", MAX_MEDIA_STREAM_ID_LEN); + STRNCPY(track2.trackId, "audioTrack1", MAX_MEDIA_STREAM_TRACK_ID_LEN); + + offerSdp.type = SDP_TYPE_OFFER; + STRNCPY(offerSdp.sdp, (PCHAR) sdp, MAX_SESSION_DESCRIPTION_INIT_SDP_LEN); + + EXPECT_EQ(STATUS_SUCCESS, createPeerConnection(&configuration, &pRtcPeerConnection)); + EXPECT_EQ(STATUS_SUCCESS, addSupportedCodec(pRtcPeerConnection, RTC_CODEC_VP8)); + EXPECT_EQ(STATUS_SUCCESS, addSupportedCodec(pRtcPeerConnection, RTC_CODEC_OPUS)); + + EXPECT_EQ(STATUS_SUCCESS, addTransceiver(pRtcPeerConnection, &track1, nullptr, &transceiver1)); + EXPECT_EQ(STATUS_SUCCESS, addTransceiver(pRtcPeerConnection, &track2, nullptr, &transceiver2)); + + EXPECT_EQ(STATUS_SUCCESS, setRemoteDescription(pRtcPeerConnection, &offerSdp)); + EXPECT_EQ(STATUS_SUCCESS, createAnswer(pRtcPeerConnection, &answerSdp)); + + EXPECT_PRED_FORMAT2(testing::IsSubstring, "sendonly", answerSdp.sdp); + EXPECT_PRED_FORMAT2(testing::IsSubstring, "sendrecv", answerSdp.sdp); + EXPECT_PRED_FORMAT2(testing::IsSubstring, "group:BUNDLE audio video data", answerSdp.sdp); + + closePeerConnection(pRtcPeerConnection); + EXPECT_EQ(STATUS_SUCCESS, freePeerConnection(&pRtcPeerConnection)); + }); +} + // if offer (remote) contains video m-line only then answer (local) should contain video m-line only // even if local side has other transceivers, i.e. audio TEST_F(SdpApiTest, offerMediaMultipleDirections_validateAnswerCorrectMatchingDirections) @@ -1015,6 +1076,310 @@ a=rtpmap:102 H264/90000 }); } +TEST_F(SdpApiTest, audioTransceiverMissingInactiveDirection) +{ + auto offer = std::string(R"(v=0 +o=- 481034601 1588366671 IN IP4 0.0.0.0 +s=- +t=0 0 +a=fingerprint:sha-256 87:E6:EC:59:93:76:9F:42:7D:15:17:F6:8F:C4:29:AB:EA:3F:28:B6:DF:F8:14:2F:96:62:2F:16:98:F5:76:E5 +a=group:BUNDLE 0 1 2 +a=ice-options:trickle +)"); + + offer += sdpvideo; + offer += "\n"; + offer += sdpaudio_sendrecv_mid0; + offer += "\n"; + offer += sdpdata; + offer += "\n"; + + assertLFAndCRLF((PCHAR) offer.c_str(), offer.size(), [](PCHAR sdp) { + RtcConfiguration configuration{}; + PRtcPeerConnection pRtcPeerConnection = nullptr; + RtcMediaStreamTrack track1{}; + PRtcRtpTransceiver transceiver1 = nullptr; + RtcSessionDescriptionInit offerSdp{}; + RtcSessionDescriptionInit answerSdp{}; + + SNPRINTF(configuration.iceServers[0].urls, MAX_ICE_CONFIG_URI_LEN, KINESIS_VIDEO_STUN_URL, TEST_DEFAULT_REGION, TEST_DEFAULT_STUN_URL_POSTFIX); + + track1.kind = MEDIA_STREAM_TRACK_KIND_VIDEO; + track1.codec = RTC_CODEC_VP8; + STRNCPY(track1.streamId, "stream1", MAX_MEDIA_STREAM_ID_LEN); + STRNCPY(track1.trackId, "track1", MAX_MEDIA_STREAM_TRACK_ID_LEN); + + offerSdp.type = SDP_TYPE_OFFER; + STRNCPY(offerSdp.sdp, (PCHAR) sdp, MAX_SESSION_DESCRIPTION_INIT_SDP_LEN); + + EXPECT_EQ(STATUS_SUCCESS, createPeerConnection(&configuration, &pRtcPeerConnection)); + EXPECT_EQ(STATUS_SUCCESS, addSupportedCodec(pRtcPeerConnection, RTC_CODEC_VP8)); + EXPECT_EQ(STATUS_SUCCESS, addTransceiver(pRtcPeerConnection, &track1, nullptr, &transceiver1)); + + EXPECT_EQ(STATUS_SUCCESS, setRemoteDescription(pRtcPeerConnection, &offerSdp)); + EXPECT_EQ(TRUE, canTrickleIceCandidates(pRtcPeerConnection).value); + EXPECT_EQ(STATUS_SUCCESS, createAnswer(pRtcPeerConnection, &answerSdp)); + + std::string answer = answerSdp.sdp; + std::string::size_type videoPos = answer.find("m=video 9 UDP/TLS/RTP/SAVPF 96"); + std::string::size_type audioPos = answer.find("m=audio 9 UDP/TLS/RTP/SAVPF 111"); + + // check directions + EXPECT_NE(std::string::npos, answer.substr(videoPos, audioPos - videoPos).find("a=sendonly")); + EXPECT_NE(std::string::npos, answer.substr(audioPos).find("a=inactive")); + + closePeerConnection(pRtcPeerConnection); + EXPECT_EQ(STATUS_SUCCESS, freePeerConnection(&pRtcPeerConnection)); + }); +} + +TEST_F(SdpApiTest, answerMlinesOrderSameAsOfferMLinesOrder) +{ + auto offer = std::string(R"(v=0 +o=- 481034601 1588366671 IN IP4 0.0.0.0 +s=- +t=0 0 +a=fingerprint:sha-256 87:E6:EC:59:93:76:9F:42:7D:15:17:F6:8F:C4:29:AB:EA:3F:28:B6:DF:F8:14:2F:96:62:2F:16:98:F5:76:E5 +a=group:BUNDLE 0 1 2 +a=ice-options:trickle +)"); + + auto sdpOfferAudio1 = R"(m=audio 9 UDP/TLS/RTP/SAVPF 109 9 0 8 101 +c=IN IP4 0.0.0.0 +a=recvonly +a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level +a=extmap:2/recvonly urn:ietf:params:rtp-hdrext:csrc-audio-level +a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:mid +a=fmtp:109 maxplaybackrate=48000;stereo=1;useinbandfec=1 +a=fmtp:101 0-15 +a=ice-pwd:db2619f637ea75cf7e578e8fc7829ebf +a=ice-ufrag:6a957b4a +a=mid:1 +a=rtcp-mux +a=rtpmap:109 opus/48000/2 +a=rtpmap:9 G722/8000/1 +a=rtpmap:0 PCMU/8000 +a=rtpmap:8 PCMA/8000 +a=rtpmap:101 telephone-event/8000 +a=setup:actpass +a=ssrc:1326673407 cname:{080eadab-2d5f-4ba3-abc2-0ccc305a028d})"; + + auto sdpOfferVideo1 = R"(m=video 9 UDP/TLS/RTP/SAVPF 97 98 99 100 101 122 102 121 127 120 125 107 108 109 124 119 123 +c=IN IP4 0.0.0.0 +a=rtcp:9 IN IP4 0.0.0.0 +a=ice-ufrag:XvdX +a=ice-pwd:VbwqLiodQFWAt3YVdyK/HG04 +a=ice-options:trickle +a=fingerprint:sha-256 F0:6C:41:02:7D:AC:E0:CA:3B:2A:F9:92:F9:13:86:67:DA:71:5B:4E:E4:83:80:C5:87:3F:3B:4D:41:F2:91:44 +a=setup:actpass +a=mid:0 +a=extmap:1 urn:ietf:params:rtp-hdrext:toffset +a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time +a=extmap:3 urn:3gpp:video-orientation +a=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01 +a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay +a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type +a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing +a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space +a=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid +a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id +a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id +a=recvonly +a=rtcp-mux +a=rtcp-rsize +a=rtpmap:97 rtx/90000 +a=fmtp:97 apt=96 +a=rtpmap:98 VP9/90000 +a=rtcp-fb:98 goog-remb +a=rtcp-fb:98 transport-cc +a=rtcp-fb:98 ccm fir +a=rtcp-fb:98 nack +a=rtcp-fb:98 nack pli +a=fmtp:98 profile-id=0 +a=rtpmap:99 rtx/90000 +a=fmtp:99 apt=98 +a=rtpmap:100 VP9/90000 +a=rtcp-fb:100 goog-remb +a=rtcp-fb:100 transport-cc +a=rtcp-fb:100 ccm fir +a=rtcp-fb:100 nack +a=rtcp-fb:100 nack pli +a=fmtp:100 profile-id=2 +a=rtpmap:101 rtx/90000 +a=fmtp:101 apt=100 +a=rtpmap:122 VP9/90000 +a=rtcp-fb:122 goog-remb +a=rtcp-fb:122 transport-cc +a=rtcp-fb:122 ccm fir +a=rtcp-fb:122 nack +a=rtcp-fb:122 nack pli +a=fmtp:122 profile-id=1 +a=rtpmap:102 H264/90000 +a=rtcp-fb:102 goog-remb +a=rtcp-fb:102 transport-cc +a=rtcp-fb:102 ccm fir +a=rtcp-fb:102 nack +a=rtcp-fb:102 nack pli +a=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f +a=rtpmap:121 rtx/90000 +a=fmtp:121 apt=102 +a=rtpmap:127 H264/90000 +a=rtcp-fb:127 goog-remb +a=rtcp-fb:127 transport-cc +a=rtcp-fb:127 ccm fir +a=rtcp-fb:127 nack +a=rtcp-fb:127 nack pli +a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f +a=rtpmap:120 rtx/90000 +a=fmtp:120 apt=127 +a=rtpmap:125 H264/90000 +a=rtcp-fb:125 goog-remb +a=rtcp-fb:125 transport-cc +a=rtcp-fb:125 ccm fir +a=rtcp-fb:125 nack +a=rtcp-fb:125 nack pli +a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f +a=rtpmap:107 rtx/90000 +a=fmtp:107 apt=125 +a=rtpmap:108 H264/90000 +a=rtcp-fb:108 goog-remb +a=rtcp-fb:108 transport-cc +a=rtcp-fb:108 ccm fir +a=rtcp-fb:108 nack +a=rtcp-fb:108 nack pli +a=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f +a=rtpmap:109 rtx/90000 +a=fmtp:109 apt=108 +a=rtpmap:124 red/90000 +a=rtpmap:119 rtx/90000 +a=fmtp:119 apt=124 +a=rtpmap:123 ulpfec/90000)"; + + auto sdpOfferVideo2 = R"(m=video 9 UDP/TLS/RTP/SAVPF 124 121 125 126 127 97 98 +c=IN IP4 0.0.0.0 +a=recvonly +a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:mid +a=extmap:4 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time +a=extmap:5 urn:ietf:params:rtp-hdrext:toffset +a=extmap:6/recvonly http://www.webrtc.org/experiments/rtp-hdrext/playout-delay +a=extmap:7 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01 +a=fmtp:126 profile-level-id=42e01f;level-asymmetry-allowed=1;packetization-mode=1 +a=fmtp:97 profile-level-id=42e01f;level-asymmetry-allowed=1 +a=fmtp:120 max-fs=12288;max-fr=60 +a=fmtp:124 apt=120 +a=fmtp:121 max-fs=12288;max-fr=60 +a=fmtp:125 apt=121 +a=fmtp:127 apt=126 +a=fmtp:98 apt=97 +a=ice-pwd:e2f571f28334aa91043ed38190223da9 +a=ice-ufrag:9dfb71ef +a=mid:0 +a=rtcp-fb:121 nack +a=rtcp-fb:121 nack pli +a=rtcp-fb:121 ccm fir +a=rtcp-fb:121 goog-remb +a=rtcp-fb:121 transport-cc +a=rtcp-fb:126 nack +a=rtcp-fb:126 nack pli +a=rtcp-fb:126 ccm fir +a=rtcp-fb:126 goog-remb +a=rtcp-fb:126 transport-cc +a=rtcp-fb:97 nack +a=rtcp-fb:97 nack pli +a=rtcp-fb:97 ccm fir +a=rtcp-fb:97 goog-remb +a=rtcp-fb:97 transport-cc +a=rtcp-mux +a=rtcp-rsize +a=rtpmap:124 rtx/90000 +a=rtpmap:121 VP9/90000 +a=rtpmap:125 rtx/90000 +a=rtpmap:126 H264/90000 +a=rtpmap:127 rtx/90000 +a=rtpmap:97 H264/90000 +a=rtpmap:98 rtx/90000 +a=setup:actpass +a=ssrc:1644235696 cname:{36a6a74c-73a4-594b-9bb0-023b4d357280})"; + + offer += sdpaudio_sendrecv_mid0; + offer += "\n"; + offer += sdpOfferAudio1; + offer += "\n"; + offer += sdpOfferVideo1; + offer += "\n"; + offer += sdpvideo; + offer += "\n"; + offer += sdpOfferVideo2; + offer += "\n"; + + assertLFAndCRLF((PCHAR) offer.c_str(), offer.size(), [](PCHAR sdp) { + RtcConfiguration configuration{}; + PRtcPeerConnection pRtcPeerConnection = nullptr; + RtcMediaStreamTrack track1{}; + PRtcRtpTransceiver transceiver1 = nullptr; + RtcSessionDescriptionInit offerSdp{}; + RtcSessionDescriptionInit answerSdp{}; + + SNPRINTF(configuration.iceServers[0].urls, MAX_ICE_CONFIG_URI_LEN, KINESIS_VIDEO_STUN_URL, TEST_DEFAULT_REGION, TEST_DEFAULT_STUN_URL_POSTFIX); + + track1.kind = MEDIA_STREAM_TRACK_KIND_VIDEO; + track1.codec = RTC_CODEC_VP8; + STRNCPY(track1.streamId, "stream1", MAX_MEDIA_STREAM_ID_LEN); + STRNCPY(track1.trackId, "track1", MAX_MEDIA_STREAM_TRACK_ID_LEN); + + offerSdp.type = SDP_TYPE_OFFER; + STRNCPY(offerSdp.sdp, (PCHAR) sdp, MAX_SESSION_DESCRIPTION_INIT_SDP_LEN); + + EXPECT_EQ(STATUS_SUCCESS, createPeerConnection(&configuration, &pRtcPeerConnection)); + EXPECT_EQ(STATUS_SUCCESS, addSupportedCodec(pRtcPeerConnection, RTC_CODEC_VP8)); + EXPECT_EQ(STATUS_SUCCESS, addTransceiver(pRtcPeerConnection, &track1, nullptr, &transceiver1)); + + EXPECT_EQ(STATUS_SUCCESS, setRemoteDescription(pRtcPeerConnection, &offerSdp)); + EXPECT_EQ(TRUE, canTrickleIceCandidates(pRtcPeerConnection).value); + EXPECT_EQ(STATUS_SUCCESS, createAnswer(pRtcPeerConnection, &answerSdp)); + + std::string answer = answerSdp.sdp; + + // check m-line and codec value + std::string::size_type posMline1 = answer.find("m=audio 9 UDP/TLS/RTP/SAVPF 111"); + EXPECT_NE(std::string::npos, posMline1); + posMline1++; + std::string::size_type posMline2 = answer.find("m=audio 9 UDP/TLS/RTP/SAVPF 109", posMline1); + EXPECT_NE(std::string::npos, posMline2); + posMline2++; + std::string::size_type posMline3 = answer.find("m=video 9 UDP/TLS/RTP/SAVPF 97", posMline2); + EXPECT_NE(std::string::npos, posMline3); + posMline3++; + std::string::size_type posMline4 = answer.find("m=video 9 UDP/TLS/RTP/SAVPF 96", posMline3); + EXPECT_NE(std::string::npos, posMline4); + posMline4++; + std::string::size_type posMline5 = answer.find("m=video 9 UDP/TLS/RTP/SAVPF 124", posMline4); + EXPECT_NE(std::string::npos, posMline5); + + // check order of the m-lines + EXPECT_EQ(TRUE, posMline1 < posMline2); + EXPECT_EQ(TRUE, posMline2 < posMline3); + EXPECT_EQ(TRUE, posMline3 < posMline4); + EXPECT_EQ(TRUE, posMline4 < posMline5); + + // check directions + EXPECT_NE(std::string::npos, answer.substr(posMline1, posMline2 - posMline1).find("a=inactive")); + EXPECT_NE(std::string::npos, answer.substr(posMline2, posMline3 - posMline2).find("a=inactive")); + EXPECT_NE(std::string::npos, answer.substr(posMline3, posMline4 - posMline3).find("a=inactive")); + EXPECT_NE(std::string::npos, answer.substr(posMline4, posMline5 - posMline4).find("a=sendonly")); + EXPECT_NE(std::string::npos, answer.substr(posMline5).find("a=inactive")); + + // check rtpmap values + EXPECT_NE(std::string::npos, answer.substr(posMline1, posMline2 - posMline1).find("a=rtpmap:111 opus/48000/2")); + EXPECT_NE(std::string::npos, answer.substr(posMline2, posMline3 - posMline2).find("a=rtpmap:109 opus/48000/2")); + EXPECT_NE(std::string::npos, answer.substr(posMline3, posMline4 - posMline3).find("a=rtpmap:97 rtx/90000")); + EXPECT_NE(std::string::npos, answer.substr(posMline5).find("a=rtpmap:124 rtx/90000")); + + closePeerConnection(pRtcPeerConnection); + EXPECT_EQ(STATUS_SUCCESS, freePeerConnection(&pRtcPeerConnection)); + }); +} + TEST_P(SdpApiTest_SdpMatch, populateSingleMediaSection_TestH264Fmtp) { PRtcPeerConnection pRtcPeerConnection = NULL; @@ -1961,18 +2326,18 @@ a=max-message-size:262144 }; // 1v1a1d represents 1 video + 1 audio + 1 data channel -INSTANTIATE_TEST_CASE_P(SdpApiTest_SdpMatch_Chrome, SdpApiTest_SdpMatch, +INSTANTIATE_TEST_SUITE_P(SdpApiTest_SdpMatch_Chrome, SdpApiTest_SdpMatch, ::testing::Values(offer_1v1a1d_Chrome_Android, offer_1v1a1d_Chrome_Linux, - offer_1v1a1d_Chrome_Mac), ); // the last comma is used to silent a warning + offer_1v1a1d_Chrome_Mac)); // the last comma is used to silent a warning -INSTANTIATE_TEST_CASE_P(SdpApiTest_SdpMatch_Firefox, SdpApiTest_SdpMatch, ::testing::Values(offer_1v1a1d_Firefox_Linux, offer_1v1a1d_Firefox_Mac), ); +INSTANTIATE_TEST_SUITE_P(SdpApiTest_SdpMatch_Firefox, SdpApiTest_SdpMatch, ::testing::Values(offer_1v1a1d_Firefox_Linux, offer_1v1a1d_Firefox_Mac)); -INSTANTIATE_TEST_CASE_P(SdpApiTest_SdpMatch_Chromium, SdpApiTest_SdpMatch, ::testing::Values(offer_1v1a1d_Chromium_Linux), ); +INSTANTIATE_TEST_SUITE_P(SdpApiTest_SdpMatch_Chromium, SdpApiTest_SdpMatch, ::testing::Values(offer_1v1a1d_Chromium_Linux)); -INSTANTIATE_TEST_CASE_P(SdpApiTest_SdpMatch_Safari, SdpApiTest_SdpMatch, ::testing::Values(offer_1v1a1d_Safari_Mac), ); +INSTANTIATE_TEST_SUITE_P(SdpApiTest_SdpMatch_Safari, SdpApiTest_SdpMatch, ::testing::Values(offer_1v1a1d_Safari_Mac)); } // namespace webrtcclient } // namespace video } // namespace kinesis } // namespace amazonaws -} // namespace com +} // namespace com \ No newline at end of file diff --git a/tst/SignalingApiFunctionalityTest.cpp b/tst/SignalingApiFunctionalityTest.cpp index c88e812e55..3197bf15aa 100644 --- a/tst/SignalingApiFunctionalityTest.cpp +++ b/tst/SignalingApiFunctionalityTest.cpp @@ -821,9 +821,7 @@ TEST_F(SignalingApiFunctionalityTest, invalidChannelInfoInput) TEST_F(SignalingApiFunctionalityTest, iceReconnectEmulation) { - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); ChannelInfo channelInfo; SignalingClientCallbacks signalingClientCallbacks; @@ -908,9 +906,7 @@ TEST_F(SignalingApiFunctionalityTest, iceReconnectEmulation) TEST_F(SignalingApiFunctionalityTest, iceServerConfigRefreshNotConnectedVariations) { - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); ChannelInfo channelInfo; SignalingClientCallbacks signalingClientCallbacks; @@ -1173,10 +1169,7 @@ TEST_F(SignalingApiFunctionalityTest, iceServerConfigRefreshNotConnectedVariatio TEST_F(SignalingApiFunctionalityTest, iceServerConfigRefreshConnectedVariations) { - if (!mAccessKeyIdSet) { - return; - } - + ASSERT_EQ(TRUE, mAccessKeyIdSet); ChannelInfo channelInfo; SignalingClientCallbacks signalingClientCallbacks; SignalingClientInfoInternal clientInfoInternal; @@ -1441,9 +1434,7 @@ TEST_F(SignalingApiFunctionalityTest, iceServerConfigRefreshConnectedVariations) TEST_F(SignalingApiFunctionalityTest, iceServerConfigRefreshNotConnectedAuthExpiration) { - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); ChannelInfo channelInfo; SignalingClientCallbacks signalingClientCallbacks; @@ -1564,9 +1555,7 @@ TEST_F(SignalingApiFunctionalityTest, iceServerConfigRefreshNotConnectedAuthExpi TEST_F(SignalingApiFunctionalityTest, iceServerConfigRefreshConnectedAuthExpiration) { - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); ChannelInfo channelInfo; SignalingClientCallbacks signalingClientCallbacks; @@ -1690,9 +1679,7 @@ TEST_F(SignalingApiFunctionalityTest, iceServerConfigRefreshConnectedAuthExpirat TEST_F(SignalingApiFunctionalityTest, iceServerConfigRefreshNotConnectedWithFaultInjectionRecovered) { - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); ChannelInfo channelInfo; SignalingClientCallbacks signalingClientCallbacks; @@ -1807,9 +1794,7 @@ TEST_F(SignalingApiFunctionalityTest, iceServerConfigRefreshNotConnectedWithFaul TEST_F(SignalingApiFunctionalityTest, iceServerConfigRefreshConnectedWithFaultInjectionRecovered) { - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); ChannelInfo channelInfo; SignalingClientCallbacks signalingClientCallbacks; @@ -1926,9 +1911,7 @@ TEST_F(SignalingApiFunctionalityTest, iceServerConfigRefreshConnectedWithFaultIn TEST_F(SignalingApiFunctionalityTest, iceServerConfigRefreshNotConnectedWithFaultInjectionNotRecovered) { - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); ChannelInfo channelInfo; SignalingClientCallbacks signalingClientCallbacks; @@ -2041,9 +2024,7 @@ TEST_F(SignalingApiFunctionalityTest, iceServerConfigRefreshNotConnectedWithFaul TEST_F(SignalingApiFunctionalityTest, iceServerConfigRefreshConnectedWithFaultInjectionNot1669) { - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); ChannelInfo channelInfo; SignalingClientCallbacks signalingClientCallbacks; @@ -2159,9 +2140,7 @@ TEST_F(SignalingApiFunctionalityTest, iceServerConfigRefreshConnectedWithFaultIn TEST_F(SignalingApiFunctionalityTest, iceServerConfigRefreshNotConnectedWithBadAuth) { - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); ChannelInfo channelInfo; SignalingClientCallbacks signalingClientCallbacks; @@ -2280,9 +2259,7 @@ TEST_F(SignalingApiFunctionalityTest, iceServerConfigRefreshNotConnectedWithBadA TEST_F(SignalingApiFunctionalityTest, iceServerConfigRefreshConnectedWithBadAuth) { - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); ChannelInfo channelInfo; SignalingClientCallbacks signalingClientCallbacks; @@ -2405,9 +2382,7 @@ TEST_F(SignalingApiFunctionalityTest, iceServerConfigRefreshConnectedWithBadAuth TEST_F(SignalingApiFunctionalityTest, goAwayEmulation) { - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); ChannelInfo channelInfo; SignalingClientCallbacks signalingClientCallbacks; @@ -2491,9 +2466,7 @@ TEST_F(SignalingApiFunctionalityTest, goAwayEmulation) TEST_F(SignalingApiFunctionalityTest, unknownMessageTypeEmulation) { - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); ChannelInfo channelInfo; SignalingClientCallbacks signalingClientCallbacks; @@ -2581,9 +2554,7 @@ TEST_F(SignalingApiFunctionalityTest, unknownMessageTypeEmulation) TEST_F(SignalingApiFunctionalityTest, connectTimeoutEmulation) { - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); ChannelInfo channelInfo; SignalingClientCallbacks signalingClientCallbacks; @@ -2606,7 +2577,7 @@ TEST_F(SignalingApiFunctionalityTest, connectTimeoutEmulation) clientInfoInternal.signalingClientInfo.version = SIGNALING_CLIENT_INFO_CURRENT_VERSION; clientInfoInternal.signalingClientInfo.loggingLevel = mLogLevel; STRCPY(clientInfoInternal.signalingClientInfo.clientId, TEST_SIGNALING_MASTER_CLIENT_ID); - clientInfoInternal.connectTimeout = 100 * HUNDREDS_OF_NANOS_IN_A_MILLISECOND; + clientInfoInternal.connectTimeout = 1 * HUNDREDS_OF_NANOS_IN_A_MILLISECOND; setupSignalingStateMachineRetryStrategyCallbacks(&clientInfoInternal); pKvsRetryStrategyCallbacks = &(clientInfoInternal.signalingStateMachineRetryStrategyCallbacks); @@ -2704,9 +2675,7 @@ TEST_F(SignalingApiFunctionalityTest, connectTimeoutEmulation) TEST_F(SignalingApiFunctionalityTest, channelInfoArnSkipDescribe) { - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); ChannelInfo channelInfo; SignalingClientCallbacks signalingClientCallbacks; @@ -2838,9 +2807,7 @@ TEST_F(SignalingApiFunctionalityTest, channelInfoArnSkipDescribe) TEST_F(SignalingApiFunctionalityTest, deleteChannelCreatedWithArn) { - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); ChannelInfo channelInfo; SignalingClientCallbacks signalingClientCallbacks; @@ -2972,9 +2939,7 @@ TEST_F(SignalingApiFunctionalityTest, deleteChannelCreatedWithArn) TEST_F(SignalingApiFunctionalityTest, deleteChannelCreatedAuthExpiration) { - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); ChannelInfo channelInfo; SignalingClientCallbacks signalingClientCallbacks; @@ -3085,9 +3050,7 @@ TEST_F(SignalingApiFunctionalityTest, deleteChannelCreatedAuthExpiration) TEST_F(SignalingApiFunctionalityTest, signalingClientDisconnectSyncVariations) { - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); initializeSignalingClient(); @@ -3131,9 +3094,7 @@ TEST_F(SignalingApiFunctionalityTest, signalingClientDisconnectSyncVariations) TEST_F(SignalingApiFunctionalityTest, cachingWithFaultInjection) { - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); ChannelInfo channelInfo; SignalingClientCallbacks signalingClientCallbacks; @@ -3267,9 +3228,7 @@ TEST_F(SignalingApiFunctionalityTest, cachingWithFaultInjection) TEST_F(SignalingApiFunctionalityTest, fileCachingTest) { - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); ChannelInfo channelInfo; SignalingClientCallbacks signalingClientCallbacks; @@ -3362,9 +3321,12 @@ TEST_F(SignalingApiFunctionalityTest, fileCachingTest) EXPECT_EQ(STATUS_SUCCESS, freeSignalingClient(&signalingHandle)); } - /* describeCount and getEndpointCount should only increase by 1 because they are cached for all channels except one */ - EXPECT_TRUE(describeCount > describeCountNoCache && (describeCount - describeCountNoCache) == 1); - EXPECT_TRUE(getEndpointCount > getEndpointCountNoCache && (getEndpointCount - 2 * getEndpointCountNoCache) == 1); + DLOGD("describeCount: %d, describeCountNoCache: %d", describeCount, describeCountNoCache); + DLOGD("getEndpointCount: %d, getEndpointCountNoCache: %d", getEndpointCount, getEndpointCountNoCache); + + /* describeCount and getEndpointCount should only increase by 2 because they are cached for all channels except one and we iterate twice*/ + EXPECT_TRUE(describeCount > describeCountNoCache && (describeCount - describeCountNoCache) == 2); + EXPECT_TRUE(getEndpointCount > getEndpointCountNoCache && (getEndpointCount - 2*getEndpointCountNoCache) == 2); } TEST_F(SignalingApiFunctionalityTest, fileCachingUpdateCache) @@ -3397,11 +3359,133 @@ TEST_F(SignalingApiFunctionalityTest, fileCachingUpdateCache) EXPECT_EQ(STATUS_SUCCESS, signalingCacheSaveToFile(&testEntry, DEFAULT_CACHE_FILE_PATH)); } -TEST_F(SignalingApiFunctionalityTest, receivingIceConfigOffer) +TEST_F(SignalingApiFunctionalityTest, fileCachingUpdateMultiChannelCache) { - if (!mAccessKeyIdSet) { - return; + FREMOVE(DEFAULT_CACHE_FILE_PATH); + srand(GETTIME()); + + SignalingFileCacheEntry testEntry; + BOOL cacheFound = FALSE; + int additionalEntries = rand()%15 + 2; + char testWssEndpoint[MAX_SIGNALING_ENDPOINT_URI_LEN + 1] = {0}; + char testHttpsEndpoint[MAX_SIGNALING_ENDPOINT_URI_LEN + 1] = {0}; + char testRegion[MAX_REGION_NAME_LEN + 1] = {0}; + char testChannelArn[MAX_ARN_LEN + 1] = {0}; + char testChannel[MAX_CHANNEL_NAME_LEN + 1] = {0}; + int time = GETTIME() / HUNDREDS_OF_NANOS_IN_A_SECOND; + int append = 0; + int i = 0; + char * fileBuffer; + UINT64 fileSize; + UINT32 entryCount; + SignalingFileCacheEntry entries[MAX_SIGNALING_CACHE_ENTRY_COUNT]; + const int TEST_CHANNEL_COUNT = 5; + + for(i = 0; i < MAX_SIGNALING_CACHE_ENTRY_COUNT + additionalEntries; i++) { + testEntry.role = SIGNALING_CHANNEL_ROLE_TYPE_VIEWER; + MEMSET(testWssEndpoint, 0, MAX_SIGNALING_ENDPOINT_URI_LEN+1); + MEMSET(testHttpsEndpoint, 0, MAX_SIGNALING_ENDPOINT_URI_LEN+1); + MEMSET(testRegion, 0, MAX_REGION_NAME_LEN + 1); + MEMSET(testChannelArn, 0, MAX_ARN_LEN+1); + MEMSET(testChannel, 0, MAX_CHANNEL_NAME_LEN+1); + + append = rand()%TEST_CHANNEL_COUNT; + SPRINTF(testWssEndpoint, "%s%d", "testWssEndpoint", append); + SPRINTF(testHttpsEndpoint, "%s%d", "testHttpsEndpoint", append); + SPRINTF(testRegion, "%s%d", "testRegion", append); + SPRINTF(testChannelArn, "%s%d", "testChannelArn", append); + SPRINTF(testChannel, "%s%d", "testChannel", append); + + STRCPY(testEntry.wssEndpoint, testWssEndpoint); + STRCPY(testEntry.httpsEndpoint, testHttpsEndpoint); + STRCPY(testEntry.region, testRegion); + STRCPY(testEntry.channelArn, testChannelArn); + STRCPY(testEntry.channelName, testChannel); + testEntry.creationTsEpochSeconds = time + i; + EXPECT_EQ(STATUS_SUCCESS, signalingCacheSaveToFile(&testEntry, DEFAULT_CACHE_FILE_PATH)); } + testEntry.creationTsEpochSeconds = 0; + EXPECT_EQ(STATUS_SUCCESS, signalingCacheLoadFromFile(testChannel, testRegion, SIGNALING_CHANNEL_ROLE_TYPE_VIEWER, &testEntry, &cacheFound, DEFAULT_CACHE_FILE_PATH)); + EXPECT_EQ(TRUE, cacheFound); + EXPECT_EQ(time + i - 1, testEntry.creationTsEpochSeconds); + EXPECT_EQ(0, STRCMP(testEntry.wssEndpoint, testWssEndpoint)); + EXPECT_EQ(0, STRCMP(testEntry.httpsEndpoint, testHttpsEndpoint)); + EXPECT_EQ(0, STRCMP(testEntry.region, testRegion)); + EXPECT_EQ(0, STRCMP(testEntry.channelArn, testChannelArn)); + EXPECT_EQ(0, STRCMP(testEntry.channelName, testChannel)); + + //Check size to ensure entries are properly overwriting each other + EXPECT_EQ(STATUS_SUCCESS, readFile(DEFAULT_CACHE_FILE_PATH, FALSE, NULL, &fileSize)); + + EXPECT_LT(0, fileSize); + /* +1 for null terminator */ + fileBuffer = (char*)MEMCALLOC(1, (fileSize + 1) * SIZEOF(CHAR)); + EXPECT_TRUE((fileBuffer != NULL)); + EXPECT_EQ(STATUS_SUCCESS, readFile(DEFAULT_CACHE_FILE_PATH, FALSE, (PBYTE) fileBuffer, &fileSize)); + EXPECT_EQ(STATUS_SUCCESS, deserializeSignalingCacheEntries(fileBuffer, fileSize, entries, &entryCount, DEFAULT_CACHE_FILE_PATH)); + EXPECT_LT(entryCount, TEST_CHANNEL_COUNT+1); + + MEMFREE(fileBuffer); + + FREMOVE(DEFAULT_CACHE_FILE_PATH); +} + +TEST_F(SignalingApiFunctionalityTest, fileCachingUpdateFullMultiChannelCache) +{ + FREMOVE(DEFAULT_CACHE_FILE_PATH); + srand(GETTIME()); + + SignalingFileCacheEntry testEntry; + BOOL cacheFound = FALSE; + int additionalEntries = rand()%15 + 2; + char testWssEndpoint[MAX_SIGNALING_ENDPOINT_URI_LEN + 1] = {0}; + char testHttpsEndpoint[MAX_SIGNALING_ENDPOINT_URI_LEN + 1] = {0}; + char testRegion[MAX_REGION_NAME_LEN + 1] = {0}; + char testChannelArn[MAX_ARN_LEN + 1] = {0}; + char testChannel[MAX_CHANNEL_NAME_LEN + 1] = {0}; + int time = GETTIME() / HUNDREDS_OF_NANOS_IN_A_SECOND; + int append = 0; + int i = 0; + + for(i = 0; i < MAX_SIGNALING_CACHE_ENTRY_COUNT + additionalEntries; i++) { + testEntry.role = SIGNALING_CHANNEL_ROLE_TYPE_VIEWER; + MEMSET(testWssEndpoint, 0, MAX_SIGNALING_ENDPOINT_URI_LEN+1); + MEMSET(testHttpsEndpoint, 0, MAX_SIGNALING_ENDPOINT_URI_LEN+1); + MEMSET(testRegion, 0, MAX_REGION_NAME_LEN + 1); + MEMSET(testChannelArn, 0, MAX_ARN_LEN+1); + MEMSET(testChannel, 0, MAX_CHANNEL_NAME_LEN+1); + + append = i; + SPRINTF(testWssEndpoint, "%s%d", "testWssEndpoint", append); + SPRINTF(testHttpsEndpoint, "%s%d", "testHttpsEndpoint", append); + SPRINTF(testRegion, "%s%d", "testRegion", append); + SPRINTF(testChannelArn, "%s%d", "testChannelArn", append); + SPRINTF(testChannel, "%s%d", "testChannel", append); + + STRCPY(testEntry.wssEndpoint, testWssEndpoint); + STRCPY(testEntry.httpsEndpoint, testHttpsEndpoint); + STRCPY(testEntry.region, testRegion); + STRCPY(testEntry.channelArn, testChannelArn); + STRCPY(testEntry.channelName, testChannel); + testEntry.creationTsEpochSeconds = time + i; + EXPECT_EQ(STATUS_SUCCESS, signalingCacheSaveToFile(&testEntry, DEFAULT_CACHE_FILE_PATH)); + } + testEntry.creationTsEpochSeconds = 0; + EXPECT_EQ(STATUS_SUCCESS, signalingCacheLoadFromFile(testChannel, testRegion, SIGNALING_CHANNEL_ROLE_TYPE_VIEWER, &testEntry, &cacheFound, DEFAULT_CACHE_FILE_PATH)); + EXPECT_EQ(TRUE, cacheFound); + EXPECT_EQ(time + i - 1, testEntry.creationTsEpochSeconds); + EXPECT_EQ(0, STRCMP(testEntry.wssEndpoint, testWssEndpoint)); + EXPECT_EQ(0, STRCMP(testEntry.httpsEndpoint, testHttpsEndpoint)); + EXPECT_EQ(0, STRCMP(testEntry.region, testRegion)); + EXPECT_EQ(0, STRCMP(testEntry.channelArn, testChannelArn)); + EXPECT_EQ(0, STRCMP(testEntry.channelName, testChannel)); + + FREMOVE(DEFAULT_CACHE_FILE_PATH); +} + +TEST_F(SignalingApiFunctionalityTest, receivingIceConfigOffer) +{ + ASSERT_EQ(TRUE, mAccessKeyIdSet); ChannelInfo channelInfo; SignalingClientCallbacks signalingClientCallbacks; @@ -3587,9 +3671,7 @@ TEST_F(SignalingApiFunctionalityTest, receivingIceConfigOffer) TEST_F(SignalingApiFunctionalityTest, receivingIceConfigOffer_SlowClockSkew) { - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); ChannelInfo channelInfo; SignalingClientCallbacks signalingClientCallbacks; @@ -3779,9 +3861,7 @@ TEST_F(SignalingApiFunctionalityTest, receivingIceConfigOffer_SlowClockSkew) TEST_F(SignalingApiFunctionalityTest, receivingIceConfigOffer_FastClockSkew) { - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); ChannelInfo channelInfo; SignalingClientCallbacks signalingClientCallbacks; diff --git a/tst/SignalingApiTest.cpp b/tst/SignalingApiTest.cpp index 75306b1d22..29652b8544 100644 --- a/tst/SignalingApiTest.cpp +++ b/tst/SignalingApiTest.cpp @@ -9,6 +9,37 @@ namespace webrtcclient { class SignalingApiTest : public WebRtcClientTestBase { }; +TEST_F(SignalingApiTest, createValidateChannelInfo) +{ + initializeSignalingClientStructs(); + PChannelInfo rChannelInfo; + CHAR agentString[MAX_CUSTOM_USER_AGENT_NAME_POSTFIX_LEN + 1]; + UINT32 postfixLen = STRLEN(SIGNALING_USER_AGENT_POSTFIX_NAME) + STRLEN(SIGNALING_USER_AGENT_POSTFIX_VERSION) + 1; + SNPRINTF(agentString, postfixLen + 1, (PCHAR) "%s/%s", SIGNALING_USER_AGENT_POSTFIX_NAME, SIGNALING_USER_AGENT_POSTFIX_VERSION); + STRCPY(mChannelArn, TEST_CHANNEL_ARN); + STRCPY(mKmsKeyId, TEST_KMS_KEY_ID_ARN); + mChannelInfo.pChannelArn = mChannelArn; + mChannelInfo.pKmsKeyId = mKmsKeyId; + EXPECT_EQ(STATUS_SUCCESS, createValidateChannelInfo(&mChannelInfo, &rChannelInfo)); + EXPECT_EQ(0, STRCMP(rChannelInfo->pChannelArn, TEST_CHANNEL_ARN)); + EXPECT_EQ(0, STRCMP(rChannelInfo->pKmsKeyId, TEST_KMS_KEY_ID_ARN)); + EXPECT_EQ(rChannelInfo->version, CHANNEL_INFO_CURRENT_VERSION); + EXPECT_EQ(rChannelInfo->tagCount, 3); + EXPECT_EQ(rChannelInfo->retry, TRUE); + EXPECT_EQ(rChannelInfo->channelType, SIGNALING_CHANNEL_TYPE_SINGLE_MASTER); + EXPECT_EQ(rChannelInfo->channelRoleType, SIGNALING_CHANNEL_ROLE_TYPE_MASTER); + EXPECT_EQ(rChannelInfo->cachingPolicy, SIGNALING_API_CALL_CACHE_TYPE_NONE); + // The createValidateChannelInfo() is expected to fix up caching period to an hour + EXPECT_EQ(rChannelInfo->cachingPeriod, SIGNALING_DEFAULT_API_CALL_CACHE_TTL); + EXPECT_EQ(rChannelInfo->reconnect, TRUE); + EXPECT_EQ(0, STRCMP(rChannelInfo->pCertPath, mCaCertPath)); + EXPECT_EQ(rChannelInfo->messageTtl, TEST_SIGNALING_MESSAGE_TTL); + EXPECT_EQ(0, STRCMP(rChannelInfo->pRegion, TEST_DEFAULT_REGION)); + // Test default agent postfix + EXPECT_PRED_FORMAT2(testing::IsSubstring, agentString, rChannelInfo->pUserAgent); + freeChannelInfo(&rChannelInfo); +} + TEST_F(SignalingApiTest, signalingSendMessageSync) { STATUS expectedStatus; @@ -58,14 +89,22 @@ TEST_F(SignalingApiTest, signalingSendMessageSyncFileCredsProvider) PAwsCredentialProvider pAwsCredentialProvider = NULL; CHAR fileContent[10000]; UINT32 length = ARRAY_SIZE(fileContent); + CHAR futureTime[] = "2200-06-05T09:39:36Z"; - if (!mAccessKeyIdSet) { - return; - } - // Store the credentials in a file under the current dir - length = SNPRINTF(fileContent, length, "CREDENTIALS %s %s", mAccessKey, mSecretKey); - ASSERT_GT(ARRAY_SIZE(fileContent), length); + ASSERT_EQ(TRUE, mAccessKeyIdSet); + + if (mSessionToken == NULL) { + // Store the credentials in a file under the current dir + length = SNPRINTF(fileContent, length, "CREDENTIALS %s %s", mAccessKey, mSecretKey); + ASSERT_GT(ARRAY_SIZE(fileContent), length); + } else { + // test Temp Creds + // "CREDENTIALS accessKey expiration secretKey sessionToken" + length = SNPRINTF(fileContent, length, "CREDENTIALS %s %s %s %s", mAccessKey, futureTime, mSecretKey, mSessionToken); + ASSERT_GT(ARRAY_SIZE(fileContent), length); + } + ASSERT_EQ(STATUS_SUCCESS, writeFile(TEST_FILE_CREDENTIALS_FILE_PATH, FALSE, FALSE, (PBYTE) fileContent, length)); // Create file creds provider from the file @@ -249,9 +288,7 @@ TEST_F(SignalingApiTest, signalingClientGetMetrics) EXPECT_NE(STATUS_SUCCESS, signalingClientGetMetrics(INVALID_SIGNALING_CLIENT_HANDLE_VALUE, NULL)); EXPECT_NE(STATUS_SUCCESS, signalingClientGetMetrics(mSignalingClientHandle, NULL)); - if (!mAccessKeyIdSet) { - return; - } + ASSERT_EQ(TRUE, mAccessKeyIdSet); initializeSignalingClient(); // Valid call diff --git a/tst/TurnConnectionFunctionalityTest.cpp b/tst/TurnConnectionFunctionalityTest.cpp index d482ebf2d5..9f02977a60 100644 --- a/tst/TurnConnectionFunctionalityTest.cpp +++ b/tst/TurnConnectionFunctionalityTest.cpp @@ -149,6 +149,7 @@ TEST_F(TurnConnectionFunctionalityTest, turnConnectionRefreshPermissionTest) MUTEX_UNLOCK(pTurnConnection->lock); } + DLOGI("Checking if TURN_STATE_READY is set"); EXPECT_TRUE(turnReady == TRUE); // modify permission expiration time to trigger refresh permission @@ -156,14 +157,22 @@ TEST_F(TurnConnectionFunctionalityTest, turnConnectionRefreshPermissionTest) pTurnConnection->turnPeerList[0].permissionExpirationTime = GETTIME(); MUTEX_UNLOCK(pTurnConnection->lock); - // turn Connection timer run happens every second when at ready state. - THREAD_SLEEP(1500 * HUNDREDS_OF_NANOS_IN_A_MILLISECOND); - // verify we are no longer in ready state. - MUTEX_LOCK(pTurnConnection->lock); - EXPECT_TRUE(pTurnConnection->state != TURN_STATE_READY); - MUTEX_UNLOCK(pTurnConnection->lock); + turnReady = FALSE; + turnReadyTimeout = GETTIME() + 10 * HUNDREDS_OF_NANOS_IN_A_SECOND; + while (!turnReady && GETTIME() < turnReadyTimeout) { + THREAD_SLEEP(5 * HUNDREDS_OF_NANOS_IN_A_MILLISECOND); + MUTEX_LOCK(pTurnConnection->lock); + if (pTurnConnection->state != TURN_STATE_READY) { + turnReady = TRUE; + } + MUTEX_UNLOCK(pTurnConnection->lock); + } + + //here "TRUE" actually means not in the ready state + EXPECT_TRUE(turnReady == TRUE); + //and now let's make sure we get back to ready turnReady = FALSE; turnReadyTimeout = GETTIME() + 10 * HUNDREDS_OF_NANOS_IN_A_SECOND; diff --git a/tst/WebRTCClientTestFixture.h b/tst/WebRTCClientTestFixture.h index 845abbc4f5..f4abf4532e 100644 --- a/tst/WebRTCClientTestFixture.h +++ b/tst/WebRTCClientTestFixture.h @@ -14,6 +14,8 @@ #define TEST_SIGNALING_MASTER_CLIENT_ID (PCHAR) "Test_Master_ClientId" #define TEST_SIGNALING_VIEWER_CLIENT_ID (PCHAR) "Test_Viewer_ClientId" #define TEST_SIGNALING_CHANNEL_NAME (PCHAR) "ScaryTestChannel_" +#define TEST_KMS_KEY_ID_ARN (PCHAR) "arn:aws:kms:us-west-2:123456789012:key/0000-0000-0000-0000-0000" +#define TEST_CHANNEL_ARN (PCHAR) "arn:aws:kinesisvideo:us-west-2:123456789012:channel/ScaryTestChannel" #define SIGNAING_TEST_CORRELATION_ID (PCHAR) "Test_correlation_id" #define TEST_SIGNALING_MESSAGE_TTL (120 * HUNDREDS_OF_NANOS_IN_A_SECOND) #define TEST_VIDEO_FRAME_SIZE (120 * 1024) @@ -294,6 +296,8 @@ class WebRtcClientTestBase : public ::testing::Test { CHAR mDefaultRegion[MAX_REGION_NAME_LEN + 1]; BOOL mAccessKeyIdSet; CHAR mChannelName[MAX_CHANNEL_NAME_LEN + 1]; + CHAR mChannelArn[MAX_ARN_LEN + 1]; + CHAR mKmsKeyId[MAX_ARN_LEN + 1]; PJitterBuffer mJitterBuffer; PBYTE mFrame; diff --git a/tst/suppressions/TSAN.supp b/tst/suppressions/TSAN.supp index 636d016122..0c1179bfbd 100644 --- a/tst/suppressions/TSAN.supp +++ b/tst/suppressions/TSAN.supp @@ -176,4 +176,4 @@ deadlock:com::amazonaws::kinesis::video::webrtcclient::DtlsFunctionalityTest::cr # instead of flagging each individual instance of the test. deadlock:lwsListenerHandler deadlock:connectSignalingChannelLws -race:lwsListenerHandler +race:lwsListenerHandler \ No newline at end of file