diff --git a/headers/os/media/MediaEncoder.h b/headers/os/media/MediaEncoder.h
index 834bc73..68f4681 100644
a
|
b
|
|
8 | 8 | |
9 | 9 | #include <MediaFormats.h> |
10 | 10 | |
| 11 | namespace BPrivate { |
| 12 | class Encoder; |
| 13 | } |
| 14 | |
| 15 | namespace BPrivate { |
| 16 | namespace media { |
| 17 | class Encoder; |
| 18 | class EncoderPlugin; |
| 19 | } |
| 20 | } |
11 | 21 | |
12 | 22 | class BMediaEncoder { |
13 | 23 | public: |
… |
… |
private:
|
65 | 75 | BMediaEncoder& operator=(const BMediaEncoder& other); |
66 | 76 | |
67 | 77 | private: |
| 78 | status_t _AttachToEncoder(); |
| 79 | |
68 | 80 | static status_t write_chunk(void* classPtr, |
69 | 81 | const void* buffer, size_t size, |
70 | 82 | media_encode_info* info); |
… |
… |
private:
|
73 | 85 | void ReleaseEncoder(); |
74 | 86 | |
75 | 87 | uint32 _reserved_was_fEncoderMgr; |
76 | | uint32 _reserved_was_fEncoder; |
77 | | |
| 88 | // uint32 _reserved_was_fEncoder; |
| 89 | BPrivate::media::Encoder *fEncoder; |
| 90 | |
78 | 91 | int32 fEncoderID; |
79 | 92 | bool fFormatValid; |
80 | 93 | bool fEncoderStarted; |
diff --git a/src/kits/media/MediaEncoder.cpp b/src/kits/media/MediaEncoder.cpp
index 6084920..64fcd04 100644
a
|
b
|
|
1 | | /*********************************************************************** |
2 | | * AUTHOR: Marcus Overhagen |
3 | | * FILE: MediaEncoder.cpp |
4 | | * DESCR: |
5 | | ***********************************************************************/ |
| 1 | /* |
| 2 | * Copyright 2004-2007, Marcus Overhagen. All rights reserved. |
| 3 | * Copyright 2010, Oleg Krysenkov, beos344@mail.ru. |
| 4 | * |
| 5 | * Distributed under the terms of the MIT License. |
| 6 | */ |
| 7 | |
| 8 | /*TO DO SetTo, SetFormat, Enode Class*/ |
6 | 9 | #include <MediaEncoder.h> |
| 10 | #include <EncoderPlugin.h> |
| 11 | #include <PluginManager.h> |
| 12 | #include <new> |
7 | 13 | #include "debug.h" |
8 | 14 | |
9 | | |
10 | 15 | /************************************************************* |
11 | 16 | * public BMediaEncoder |
12 | 17 | *************************************************************/ |
13 | 18 | |
14 | 19 | BMediaEncoder::BMediaEncoder() |
| 20 | : fEncoder(NULL), |
| 21 | fInitStatus(B_NO_INIT) |
15 | 22 | { |
16 | | UNIMPLEMENTED(); |
| 23 | TRACE("BMediaEncoder::BMediaEncoder 1 enter\n"); |
17 | 24 | } |
18 | 25 | |
19 | 26 | |
20 | 27 | BMediaEncoder::BMediaEncoder(const media_format *output_format) |
| 28 | : fEncoder(NULL), |
| 29 | fInitStatus(B_NO_INIT) |
21 | 30 | { |
22 | | UNIMPLEMENTED(); |
| 31 | TRACE("BMediaEncoder::BMediaEncoder 2 enter\n"); |
| 32 | SetTo(output_format); |
23 | 33 | } |
24 | 34 | |
25 | 35 | |
26 | 36 | BMediaEncoder::BMediaEncoder(const media_codec_info *mci) |
| 37 | : fEncoder(NULL), |
| 38 | fInitStatus(B_NO_INIT) |
27 | 39 | { |
28 | | UNIMPLEMENTED(); |
| 40 | TRACE("BMediaEncoder::BMediaEncoder 3 enter\n"); |
| 41 | SetTo(mci); |
29 | 42 | } |
30 | 43 | |
31 | 44 | |
32 | 45 | /* virtual */ |
33 | 46 | BMediaEncoder::~BMediaEncoder() |
34 | 47 | { |
35 | | UNIMPLEMENTED(); |
| 48 | TRACE("BMediaEncoder::~BMediaEncoder enter\n"); |
| 49 | gPluginManager.DestroyEncoder(fEncoder); |
| 50 | fEncoder = NULL; |
36 | 51 | } |
37 | 52 | |
38 | 53 | |
39 | 54 | status_t |
40 | 55 | BMediaEncoder::InitCheck() const |
41 | 56 | { |
42 | | UNIMPLEMENTED(); |
43 | | |
44 | | return B_OK; |
| 57 | TRACE("BMediaEncoder::InitCheck enter\n"); |
| 58 | return fInitStatus; |
45 | 59 | } |
46 | 60 | |
| 61 | |
47 | 62 | status_t |
48 | 63 | BMediaEncoder::SetTo(const media_format *output_format) |
49 | 64 | { |
50 | | UNIMPLEMENTED(); |
| 65 | TRACE("BMediaEncoder::SetTo 1 enter\n"); |
| 66 | status_t err; |
| 67 | media_codec_info codec_info; |
| 68 | int32 cookie = 0; |
| 69 | |
| 70 | while ((err = get_next_encoder(&cookie, NULL, NULL, output_format, |
| 71 | &codec_info, NULL, NULL)) == B_OK) { |
| 72 | /* printf(" %s / %s (%d)\n", mci.pretty_name, mci.short_name, |
| 73 | mci.id);*/ |
| 74 | } |
| 75 | if (err != B_OK) |
| 76 | return err; |
| 77 | |
| 78 | return SetTo(&codec_info); |
| 79 | |
| 80 | /* My code to test. |
| 81 | gPluginManager.DestroyEncoder(fEncoder); |
| 82 | fEncoder = NULL; |
| 83 | |
| 84 | status_t err = gPluginManager.CreateEncoder(&fEncoder, *output_format); |
| 85 | if (err < B_OK) |
| 86 | goto fail; |
| 87 | |
| 88 | err = _AttachToEncoder(); |
| 89 | if (err < B_OK) |
| 90 | goto fail; |
| 91 | |
| 92 | // err = SetFormat(NULL, output_format); //Look at MediaDecoder |
| 93 | // if (err < B_OK) |
| 94 | // goto fail; |
| 95 | |
| 96 | fInitStatus = B_OK; |
51 | 97 | return B_OK; |
| 98 | |
| 99 | fail: |
| 100 | gPluginManager.DestroyEncoder(fEncoder); |
| 101 | fEncoder = NULL; |
| 102 | fInitStatus = B_NO_INIT; |
| 103 | return err;*/ |
52 | 104 | } |
53 | 105 | |
| 106 | |
54 | 107 | status_t |
55 | 108 | BMediaEncoder::SetTo(const media_codec_info *mci) |
56 | 109 | { |
57 | | UNIMPLEMENTED(); |
| 110 | TRACE("BMediaEncoder::SetTo 2 enter\n"); |
| 111 | gPluginManager.DestroyEncoder(fEncoder); |
| 112 | fEncoder = NULL; |
| 113 | |
| 114 | //flags are not used but needed some how. |
| 115 | status_t err = gPluginManager.CreateEncoder(&fEncoder, mci, 0); |
| 116 | if (err < B_OK) |
| 117 | goto fail; |
| 118 | |
| 119 | err = _AttachToEncoder(); |
| 120 | if (err < B_OK) |
| 121 | goto fail; |
| 122 | |
| 123 | fInitStatus = B_OK; |
58 | 124 | return B_OK; |
| 125 | |
| 126 | fail: |
| 127 | gPluginManager.DestroyEncoder(fEncoder); |
| 128 | fEncoder = NULL; |
| 129 | fInitStatus = B_NO_INIT; |
| 130 | return err; |
59 | 131 | } |
60 | 132 | |
61 | 133 | |
… |
… |
BMediaEncoder::SetFormat(media_format *input_format,
|
64 | 136 | media_format *output_format, |
65 | 137 | media_file_format *mfi) |
66 | 138 | { |
| 139 | TRACE("BMediaEncoder::SetFormat enter\n"); |
| 140 | // SetTo(output_format); |
67 | 141 | UNIMPLEMENTED(); |
68 | 142 | return B_OK; |
| 143 | /* if (!fEncoder) |
| 144 | return B_NO_INIT; |
| 145 | |
| 146 | media_format format = *in_format; |
| 147 | return fEncoder->Setup(&format, in_info, in_size);*/ |
69 | 148 | } |
70 | 149 | |
| 150 | |
71 | 151 | status_t |
72 | 152 | BMediaEncoder::Encode(const void *buffer, |
73 | 153 | int64 frame_count, |
74 | 154 | media_encode_info *info) |
75 | 155 | { |
76 | | UNIMPLEMENTED(); |
77 | | return B_OK; |
| 156 | TRACE("BMediaEncoder::Encode enter\n"); |
| 157 | if (!fEncoder) |
| 158 | return B_NO_INIT; |
| 159 | |
| 160 | return fEncoder->Encode(buffer, frame_count, info); |
78 | 161 | } |
79 | 162 | |
80 | 163 | |
81 | 164 | status_t |
82 | 165 | BMediaEncoder::GetEncodeParameters(encode_parameters *parameters) const |
83 | 166 | { |
84 | | UNIMPLEMENTED(); |
85 | | return B_OK; |
| 167 | TRACE("BMediaEncoder::GetEncodeParameters enter\n"); |
| 168 | if (fEncoder == NULL) |
| 169 | return B_NO_INIT; |
| 170 | else |
| 171 | return fEncoder->GetEncodeParameters(parameters); |
86 | 172 | } |
87 | 173 | |
88 | 174 | |
89 | 175 | status_t |
90 | 176 | BMediaEncoder::SetEncodeParameters(encode_parameters *parameters) |
91 | 177 | { |
92 | | UNIMPLEMENTED(); |
93 | | return B_OK; |
| 178 | TRACE("BMediaEncoder::SetEncodeParameters enter\n"); |
| 179 | if (fEncoder == NULL) |
| 180 | return B_NO_INIT; |
| 181 | else |
| 182 | return fEncoder->SetEncodeParameters(parameters); |
94 | 183 | } |
95 | 184 | |
96 | 185 | |
… |
… |
BMediaEncoder::SetEncodeParameters(encode_parameters *parameters)
|
101 | 190 | /* virtual */ status_t |
102 | 191 | BMediaEncoder::AddTrackInfo(uint32 code, const char *data, size_t size) |
103 | 192 | { |
104 | | UNIMPLEMENTED(); |
105 | | return B_OK; |
| 193 | TRACE("BMediaEncoder::AddTrackInfo enter\n"); |
| 194 | if (fEncoder == NULL) |
| 195 | return B_NO_INIT; |
| 196 | else |
| 197 | return fEncoder->AddTrackInfo(code, data, size); |
106 | 198 | } |
107 | 199 | |
108 | 200 | |
… |
… |
BMediaEncoder::write_chunk(void *classptr,
|
122 | 214 | size_t chunk_len, |
123 | 215 | media_encode_info *info) |
124 | 216 | { |
125 | | UNIMPLEMENTED(); |
126 | | return B_OK; |
| 217 | TRACE("BMediaEncoder::write_chunk enter\n"); |
| 218 | if (fEncoder == NULL) |
| 219 | return B_NO_INIT; |
| 220 | |
| 221 | return fEncoder->WriteChunk(chunk_data, chunk_len, info); |
127 | 222 | } |
128 | 223 | |
129 | 224 | |
130 | 225 | void |
131 | 226 | BMediaEncoder::Init() |
132 | 227 | { |
| 228 | TRACE("BMediaEncoder::Init enter\n"); |
133 | 229 | UNIMPLEMENTED(); |
134 | 230 | } |
135 | 231 | |
… |
… |
BMediaEncoder::Init()
|
137 | 233 | void |
138 | 234 | BMediaEncoder::ReleaseEncoder() |
139 | 235 | { |
| 236 | TRACE("BMediaEncoder::ReleaseEncoder enter\n"); |
140 | 237 | UNIMPLEMENTED(); |
141 | 238 | } |
142 | 239 | |
| 240 | |
| 241 | status_t |
| 242 | BMediaEncoder::_AttachToEncoder() |
| 243 | { |
| 244 | class MediaEncoderChunkWriter : public ChunkWriter { |
| 245 | private: |
| 246 | BMediaEncoder* fEncoder; |
| 247 | public: |
| 248 | MediaEncoderChunkWriter(BMediaEncoder* encoder) |
| 249 | { |
| 250 | fEncoder = encoder; |
| 251 | } |
| 252 | virtual status_t WriteChunk(const void* chunkBuffer, size_t chunkSize, |
| 253 | media_encode_info* encodeInfo) |
| 254 | { |
| 255 | return fEncoder->WriteChunk(chunkBuffer, chunkSize, encodeInfo); |
| 256 | } |
| 257 | }* writer = new(std::nothrow) MediaEncoderChunkWriter(this); |
| 258 | |
| 259 | if (!writer) |
| 260 | return B_NO_MEMORY; |
| 261 | |
| 262 | fEncoder->SetChunkWriter(writer); |
| 263 | return B_OK; |
| 264 | } |
| 265 | |
| 266 | |
143 | 267 | status_t BMediaEncoder::_Reserved_BMediaEncoder_0(int32 arg, ...) { return B_ERROR; } |
144 | 268 | status_t BMediaEncoder::_Reserved_BMediaEncoder_1(int32 arg, ...) { return B_ERROR; } |
145 | 269 | status_t BMediaEncoder::_Reserved_BMediaEncoder_2(int32 arg, ...) { return B_ERROR; } |
… |
… |
status_t BMediaEncoder::_Reserved_BMediaEncoder_15(int32 arg, ...) { return B_ER
|
162 | 286 | *************************************************************/ |
163 | 287 | |
164 | 288 | BMediaBufferEncoder::BMediaBufferEncoder() |
| 289 | : BMediaEncoder(), |
| 290 | fBuffer(NULL) |
165 | 291 | { |
166 | | UNIMPLEMENTED(); |
| 292 | TRACE("BMediaBufferEncoder::BMediaBufferEncoder enter\n"); |
167 | 293 | } |
168 | 294 | |
169 | 295 | |
170 | 296 | BMediaBufferEncoder::BMediaBufferEncoder(const media_format *output_format) |
| 297 | : BMediaEncoder(output_format), |
| 298 | fBuffer(NULL) |
171 | 299 | { |
172 | | UNIMPLEMENTED(); |
| 300 | TRACE("BMediaBufferEncoder::BMediaBufferEncoder 1 enter\n"); |
173 | 301 | } |
174 | 302 | |
175 | 303 | |
176 | 304 | BMediaBufferEncoder::BMediaBufferEncoder(const media_codec_info *mci) |
| 305 | : BMediaEncoder(mci), |
| 306 | fBuffer(NULL) |
177 | 307 | { |
178 | | UNIMPLEMENTED(); |
| 308 | TRACE("BMediaBufferEncoder::BMediaBufferEncoder 2 enter\n"); |
179 | 309 | } |
180 | 310 | |
181 | 311 | |
… |
… |
BMediaBufferEncoder::EncodeToBuffer(void *output_buffer,
|
186 | 316 | int64 frame_count, |
187 | 317 | media_encode_info *info) |
188 | 318 | { |
189 | | UNIMPLEMENTED(); |
190 | | |
191 | | return B_ERROR; |
| 319 | TRACE("BMediaBufferEncoder::EncodeToBuffer enter\n"); |
| 320 | status_t error; |
| 321 | fBuffer = output_buffer; |
| 322 | fBufferSize = *output_size; |
| 323 | error = Encode(input_buffer, frame_count, info); |
| 324 | if (fBuffer) { |
| 325 | fBuffer = NULL; |
| 326 | *output_size = 0; |
| 327 | } else { |
| 328 | *output_size = fBufferSize; |
| 329 | } |
| 330 | return error; |
192 | 331 | } |
193 | 332 | |
194 | 333 | |
… |
… |
BMediaBufferEncoder::WriteChunk(const void *chunk_data,
|
201 | 340 | size_t chunk_len, |
202 | 341 | media_encode_info *info) |
203 | 342 | { |
204 | | UNIMPLEMENTED(); |
205 | | |
206 | | return B_ERROR; |
| 343 | TRACE("BMediaBufferEncoder::WriteChunk enter\n"); |
| 344 | if (fBuffer == NULL) |
| 345 | return B_ENTRY_NOT_FOUND; |
| 346 | |
| 347 | if ((ssize_t)chunk_len < 0) |
| 348 | return B_ERROR; |
| 349 | |
| 350 | if (chunk_len > (size_t)fBufferSize) { |
| 351 | memcpy(fBuffer, chunk_data, fBufferSize); |
| 352 | fBuffer = NULL; |
| 353 | return B_DEVICE_FULL; |
| 354 | } |
| 355 | |
| 356 | memcpy(fBuffer, chunk_data, chunk_len); |
| 357 | fBufferSize = chunk_len; |
| 358 | fBuffer = NULL; |
| 359 | return B_NO_ERROR; |
207 | 360 | } |