Shaka Packager SDK
Loading...
Searching...
No Matches
media_sample.cc
1// Copyright 2014 Google LLC. All rights reserved.
2//
3// Use of this source code is governed by a BSD-style
4// license that can be found in the LICENSE file or at
5// https://developers.google.com/open-source/licenses/bsd
6
7#include <packager/media/base/media_sample.h>
8
9#include <cinttypes>
10#include <cstddef>
11#include <cstdint>
12#include <cstring>
13#include <memory>
14#include <string>
15#include <utility>
16
17#include <absl/log/check.h>
18#include <absl/strings/str_format.h>
19
20#include <packager/media/base/decrypt_config.h>
21
22namespace shaka {
23namespace media {
24
25MediaSample::MediaSample(const uint8_t* data,
26 size_t data_size,
27 const uint8_t* side_data,
28 size_t side_data_size,
29 bool is_key_frame)
30 : is_key_frame_(is_key_frame) {
31 if (!data) {
32 CHECK_EQ(data_size, 0u);
33 }
34
35 SetData(data, data_size);
36 if (side_data) {
37 std::shared_ptr<uint8_t> shared_side_data(new uint8_t[side_data_size],
38 std::default_delete<uint8_t[]>());
39 memcpy(shared_side_data.get(), side_data, side_data_size);
40 side_data_ = std::move(shared_side_data);
41 side_data_size_ = side_data_size;
42 }
43}
44
45MediaSample::MediaSample() {}
46
47MediaSample::~MediaSample() {}
48
49// static
50std::shared_ptr<MediaSample> MediaSample::CopyFrom(const uint8_t* data,
51 size_t data_size,
52 bool is_key_frame) {
53 // If you hit this CHECK you likely have a bug in a demuxer. Go fix it.
54 CHECK(data);
55 return std::shared_ptr<MediaSample>(
56 new MediaSample(data, data_size, nullptr, 0u, is_key_frame));
57}
58
59// static
60std::shared_ptr<MediaSample> MediaSample::CopyFrom(const uint8_t* data,
61 size_t data_size,
62 const uint8_t* side_data,
63 size_t side_data_size,
64 bool is_key_frame) {
65 // If you hit this CHECK you likely have a bug in a demuxer. Go fix it.
66 CHECK(data);
67 return std::shared_ptr<MediaSample>(new MediaSample(
68 data, data_size, side_data, side_data_size, is_key_frame));
69}
70
71// static
72std::shared_ptr<MediaSample> MediaSample::FromMetadata(const uint8_t* metadata,
73 size_t metadata_size) {
74 return std::shared_ptr<MediaSample>(
75 new MediaSample(nullptr, 0, metadata, metadata_size, false));
76}
77
78// static
79std::shared_ptr<MediaSample> MediaSample::CreateEmptyMediaSample() {
80 return std::shared_ptr<MediaSample>(new MediaSample);
81}
82
83// static
84std::shared_ptr<MediaSample> MediaSample::CreateEOSBuffer() {
85 return std::shared_ptr<MediaSample>(
86 new MediaSample(nullptr, 0, nullptr, 0, false));
87}
88
89std::shared_ptr<MediaSample> MediaSample::Clone() const {
90 std::shared_ptr<MediaSample> new_media_sample(new MediaSample);
91 new_media_sample->dts_ = dts_;
92 new_media_sample->pts_ = pts_;
93 new_media_sample->duration_ = duration_;
94 new_media_sample->is_key_frame_ = is_key_frame_;
95 new_media_sample->is_encrypted_ = is_encrypted_;
96 new_media_sample->data_ = data_;
97 new_media_sample->data_size_ = data_size_;
98 new_media_sample->side_data_ = side_data_;
99 new_media_sample->side_data_size_ = side_data_size_;
100 new_media_sample->config_id_ = config_id_;
101 if (decrypt_config_) {
102 new_media_sample->decrypt_config_.reset(new DecryptConfig(
103 decrypt_config_->key_id(), decrypt_config_->iv(),
104 decrypt_config_->subsamples(), decrypt_config_->protection_scheme(),
105 decrypt_config_->crypt_byte_block(),
106 decrypt_config_->skip_byte_block()));
107 }
108 return new_media_sample;
109}
110
111void MediaSample::TransferData(std::shared_ptr<uint8_t> data,
112 size_t data_size) {
113 data_ = std::move(data);
114 data_size_ = data_size;
115}
116
117void MediaSample::SetData(const uint8_t* data, size_t data_size) {
118 std::shared_ptr<uint8_t> shared_data(new uint8_t[data_size],
119 std::default_delete<uint8_t[]>());
120 memcpy(shared_data.get(), data, data_size);
121 TransferData(std::move(shared_data), data_size);
122}
123
124std::string MediaSample::ToString() const {
125 if (end_of_stream())
126 return "End of stream sample\n";
127 return absl::StrFormat(
128 "dts: %" PRId64 "\n pts: %" PRId64 "\n duration: %" PRId64
129 "\n "
130 "is_key_frame: %s\n size: %zu\n side_data_size: %zu\n",
131 dts_, pts_, duration_, is_key_frame_ ? "true" : "false", data_size_,
132 side_data_size_);
133}
134
135} // namespace media
136} // namespace shaka
Class to hold a media sample.
All the methods that are virtual are virtual for mocking.