2022-08-26 15:44:59 +00:00
|
|
|
// Copyright 2014 Google LLC. All rights reserved.
|
2014-02-14 23:21:05 +00:00
|
|
|
//
|
|
|
|
// Use of this source code is governed by a BSD-style
|
|
|
|
// license that can be found in the LICENSE file or at
|
|
|
|
// https://developers.google.com/open-source/licenses/bsd
|
2013-10-11 21:44:55 +00:00
|
|
|
|
2023-10-10 23:51:11 +00:00
|
|
|
#include <packager/status/status.h>
|
2013-10-11 21:44:55 +00:00
|
|
|
|
2023-10-09 23:21:41 +00:00
|
|
|
#include <absl/strings/str_format.h>
|
|
|
|
#include <glog/logging.h>
|
2023-10-10 23:51:11 +00:00
|
|
|
#include <packager/macros.h>
|
2013-10-11 21:44:55 +00:00
|
|
|
|
2016-05-20 21:19:33 +00:00
|
|
|
namespace shaka {
|
2013-10-11 21:44:55 +00:00
|
|
|
|
2014-03-05 23:15:22 +00:00
|
|
|
namespace error {
|
|
|
|
namespace {
|
2018-12-07 01:35:53 +00:00
|
|
|
const char* ErrorCodeToString(Code error_code) {
|
2014-03-05 23:15:22 +00:00
|
|
|
switch (error_code) {
|
|
|
|
case OK:
|
|
|
|
return "OK";
|
|
|
|
case UNKNOWN:
|
|
|
|
return "UNKNOWN";
|
|
|
|
case CANCELLED:
|
|
|
|
return "CANCELLED";
|
|
|
|
case INVALID_ARGUMENT:
|
|
|
|
return "INVALID_ARGUMENT";
|
|
|
|
case UNIMPLEMENTED:
|
|
|
|
return "UNIMPLEMENTED";
|
|
|
|
case FILE_FAILURE:
|
|
|
|
return "FILE_FAILURE";
|
|
|
|
case END_OF_STREAM:
|
|
|
|
return "END_OF_STREAM";
|
|
|
|
case HTTP_FAILURE:
|
|
|
|
return "HTTP_FAILURE";
|
|
|
|
case PARSER_FAILURE:
|
|
|
|
return "PARSER_FAILURE";
|
Implement ChunkingHandler
This handler is a multi-in multi-out handler. If more than one input is
provided, there should be one and only one video stream; also, all inputs
should come from the same thread and are synchronized.
There can be multiple chunking handler running in different threads or even
different processes, we use the "consistent chunking algorithm" to make sure
the chunks in different streams are aligned without explicit communcating
with each other - which is not efficient and often difficult.
Consistent Chunking Algorithm:
1. Find the consistent chunkable boundary
Let the timestamps for video frames be (t1, t2, t3, ...). Then a
consistent chunkable boundary is simply the first chunkable boundary after
(tk / N) != (tk-1 / N), where '/' denotes integer division, and N is the
intended chunk duration.
2. Chunk only at the consistent chunkable boundary
This algorithm will make sure the chunks from different video streams are
aligned if they have aligned GoPs. However, this algorithm will only work
for video streams. To be able to chunk non video streams at similar
positions as video streams, ChunkingHandler is designed to accept one video
input and multiple non video inputs, the non video inputs are chunked when
the video input is chunked. If the inputs are synchronized - which is true
if the inputs come from the same demuxer, the video and non video chunks
are aligned.
Change-Id: Id3bad51ab14f311efdb8713b6cd36d36cf9e4639
2017-02-07 18:58:47 +00:00
|
|
|
case ENCRYPTION_FAILURE:
|
|
|
|
return "ENCRYPTION_FAILURE";
|
|
|
|
case CHUNKING_ERROR:
|
|
|
|
return "CHUNKING_ERROR";
|
2014-03-05 23:15:22 +00:00
|
|
|
case MUXER_FAILURE:
|
|
|
|
return "MUXER_FAILURE";
|
|
|
|
case FRAGMENT_FINALIZED:
|
|
|
|
return "FRAGMENT_FINALIZED";
|
|
|
|
case SERVER_ERROR:
|
|
|
|
return "SERVER_ERROR";
|
|
|
|
case INTERNAL_ERROR:
|
|
|
|
return "INTERNAL_ERROR";
|
2014-04-07 19:40:52 +00:00
|
|
|
case STOPPED:
|
|
|
|
return "STOPPED";
|
|
|
|
case TIME_OUT:
|
|
|
|
return "TIME_OUT";
|
Implement ChunkingHandler
This handler is a multi-in multi-out handler. If more than one input is
provided, there should be one and only one video stream; also, all inputs
should come from the same thread and are synchronized.
There can be multiple chunking handler running in different threads or even
different processes, we use the "consistent chunking algorithm" to make sure
the chunks in different streams are aligned without explicit communcating
with each other - which is not efficient and often difficult.
Consistent Chunking Algorithm:
1. Find the consistent chunkable boundary
Let the timestamps for video frames be (t1, t2, t3, ...). Then a
consistent chunkable boundary is simply the first chunkable boundary after
(tk / N) != (tk-1 / N), where '/' denotes integer division, and N is the
intended chunk duration.
2. Chunk only at the consistent chunkable boundary
This algorithm will make sure the chunks from different video streams are
aligned if they have aligned GoPs. However, this algorithm will only work
for video streams. To be able to chunk non video streams at similar
positions as video streams, ChunkingHandler is designed to accept one video
input and multiple non video inputs, the non video inputs are chunked when
the video input is chunked. If the inputs are synchronized - which is true
if the inputs come from the same demuxer, the video and non video chunks
are aligned.
Change-Id: Id3bad51ab14f311efdb8713b6cd36d36cf9e4639
2017-02-07 18:58:47 +00:00
|
|
|
case NOT_FOUND:
|
|
|
|
return "NOT_FOUND";
|
|
|
|
case ALREADY_EXISTS:
|
|
|
|
return "ALREADY_EXISTS";
|
2018-12-07 01:35:53 +00:00
|
|
|
case TRICK_PLAY_ERROR:
|
|
|
|
return "TRICK_PLAY_ERROR";
|
2014-03-05 23:15:22 +00:00
|
|
|
}
|
2018-12-07 01:35:53 +00:00
|
|
|
|
|
|
|
NOTIMPLEMENTED() << "Unknown Status Code: " << error_code;
|
|
|
|
return "UNKNOWN_STATUS";
|
2014-03-05 23:15:22 +00:00
|
|
|
}
|
|
|
|
} // namespace
|
|
|
|
} // namespace error
|
|
|
|
|
2015-12-22 19:19:22 +00:00
|
|
|
const Status Status::OK = Status(error::OK, "");
|
|
|
|
const Status Status::UNKNOWN = Status(error::UNKNOWN, "");
|
2013-10-11 21:44:55 +00:00
|
|
|
|
2018-01-23 00:09:14 +00:00
|
|
|
Status::Status(error::Code error_code, const std::string& error_message)
|
|
|
|
: error_code_(error_code) {
|
|
|
|
if (!ok()) {
|
|
|
|
error_message_ = error_message;
|
|
|
|
if (!error_message.empty())
|
|
|
|
VLOG(1) << ToString();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Status::Update(Status new_status) {
|
|
|
|
if (ok())
|
|
|
|
*this = std::move(new_status);
|
|
|
|
}
|
|
|
|
|
2013-10-11 21:44:55 +00:00
|
|
|
std::string Status::ToString() const {
|
|
|
|
if (error_code_ == error::OK)
|
|
|
|
return "OK";
|
|
|
|
|
feat: First phase of CMake build system implementation (#1072)
There are a lot of changes in this first phase, because there was a
lot of infrastructure required to get some meaningful amount of
porting done. Future PRs should be simpler.
<b>Summary of changes:</b><details>
- Remove old deps:
- boringssl (replaced with mbedtls, lighter, easier to build)
- gflags (replaced with absl::flags)
- Chromium build tools
- New deps to replace parts of Chromium base:
- abseil-cpp
- glog
- nlohmann::json (for tests only)
- Submodules, updates, and CMake build rules for third-party
libraries:
- curl
- gmock/gtest
- Ported internal libraries and their tests by removing Chromium deps
and adding CMake build rules:
- file (now using C++17 filesystem APIs)
- license_notice
- status
- version
- Test improvements
- Removed file tests that can never be re-enabled
- Re-enabled all other disabled file tests
- Debug JSON values when HTTP tests fail
- Fixed chunked-encoding issues in HTTP tests
- Updated and refactored Dockerfiles testing
- All docker files working, with OS versions updated to meet the
new tool requirements
- Local docker builds no longer write files to your working
directory as root
- Local docker builds can now be run in parallel without clobbering
each others' build outputs
- DEBUG=1 can drop you into an interactive shell when a docker
build fails
- Updated and heavily refactored workflows and Dockerfiles
- All docker files now tested in parallel on GitHub, speeding up CI
- All common workflow components broken out and using workflow_call
instead of custom actions
- Self-hosted runners now optional, to make testing easier on forks
- CMake porting works-in-process can now be fully tested on GitHub
- Building ported libraries and passing ported tests on all three
platforms!
- CI hacks for macOS removed, now testing on macos-latest!
- Python2 no longer required! (Only Python3)
- Using strict build flags, treating all warnings as errors.
</details>
<b>Required to build:</b>
- CMake >= 3.16
- Python 3
- A compiler supporting C++ >= 17
- g++ >= 9 if using GCC (Clang also fine)
- MSVC for Windows
<b>Still needs work:</b><details>
- Moving other dependencies into submodules (if we keep them):
- apple_apsl
- icu
- libevent
- libpng
- libwebm
- libxml
- modp_b64
- protobuf
- zlib
- Port remaining internal libraries:
- app
- hls
- media/base
- media/chunking
- media/codecs
- media/crypto
- media/demuxer
- media/event
- media/formats/dvb
- media/formats/mp2t
- media/formats/mp4
- media/formats/packed_audio
- media/formats/ttml
- media/formats/webm
- media/formats/webvtt
- media/formats/wvm
- media/origin
- media/public
- media/replicator
- media/trick_play
- mpd
- Port main application
- Add logging flags in absl and connect them to glog (which expects
gflags)
- Port pssh-box.py
- Port main test targets (packager_test.py and packager_app.py)
- Updating all requirement and build documentation
- Remove any remaining refs to gclient, depot_tools, ninja
- Update and complete release workflows using release-please
</details>
Issue #346 (Switch to abseil)
Issue #1047 (New build system)
2022-08-16 18:34:51 +00:00
|
|
|
return absl::StrFormat("%d (%s): %s", error_code_,
|
|
|
|
error::ErrorCodeToString(error_code_),
|
|
|
|
error_message_.c_str());
|
2013-10-11 21:44:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
std::ostream& operator<<(std::ostream& os, const Status& x) {
|
|
|
|
os << x.ToString();
|
|
|
|
return os;
|
|
|
|
}
|
|
|
|
|
2016-05-20 21:19:33 +00:00
|
|
|
} // namespace shaka
|