mirror of
https://review.haiku-os.org/haiku
synced 2025-01-20 21:41:28 +01:00
fa770e4c84
* Improved Encoder API towards what we need for the get_next_encoder() variants and the BMediaTrack API. * Implemented the rest of MediaWriter. Still undecided what to make of AddTrackInfo(). BMediaEncoder has that as well, which hints that this is something the Encoder needs to support. But it could also be that this is only possible to support in Writer. * Wired a lot of previously unimplemented methods in BMediaFile and BMediaTrack needed for write support. If I have not overlooked anything, only the parameter stuff is still unimplemented now. This is all untested, since the FFMpeg Encoder and Writer are still only stubs. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@32013 a95241bf-73f2-0310-859d-f6bbb57e9c96
111 lines
3.2 KiB
C++
111 lines
3.2 KiB
C++
/*
|
|
* Copyright 2009, Haiku Inc. All rights reserved.
|
|
* Distributed under the terms of the MIT license.
|
|
*/
|
|
#ifndef _ENCODER_PLUGIN_H
|
|
#define _ENCODER_PLUGIN_H
|
|
|
|
|
|
#include <MediaTrack.h>
|
|
#include <MediaFormats.h>
|
|
#include "MediaPlugin.h"
|
|
|
|
|
|
class AddOnManager;
|
|
|
|
namespace BPrivate { namespace media {
|
|
|
|
class PluginManager;
|
|
|
|
class ChunkWriter {
|
|
public:
|
|
virtual ~ChunkWriter() {};
|
|
virtual status_t WriteChunk(const void* chunkBuffer,
|
|
size_t chunkSize,
|
|
media_encode_info* encodeInfo) = 0;
|
|
};
|
|
|
|
|
|
class Encoder {
|
|
public:
|
|
Encoder();
|
|
virtual ~Encoder();
|
|
|
|
// Some codecs may only support certain input color spaces, or output
|
|
// color spaces, or multiple of 16 width/height... This method is needed
|
|
// for get_next_encoder() functionality. If _acceptedInputFormat is NULL,
|
|
// you simply return a status indicating if proposed format is acceptable.
|
|
// If it contains wildcards for fields that you have restrictions on,
|
|
// return an error. In that case, the user should be using the form of
|
|
// get_next_encoder() that allows to specify the accepted format. If
|
|
// _acceptedInputFormat is not NULL, copy the proposedFormat into
|
|
// _acceptedInputFormat and specialize any wildcards. You must (!) also
|
|
// change non-wildcard fields, like the video width if you want to round to
|
|
// the nearest multiple of 16 for example. Only if the format is completely
|
|
// unacceptable, return an error.
|
|
virtual status_t AcceptedFormat(
|
|
const media_format* proposedInputFormat,
|
|
media_format* _acceptedInputFormat = NULL)
|
|
= 0;
|
|
|
|
// The passed media_format may not contain wildcards and must be the same
|
|
// format that was passed to get_next_encoder() (or it must be the format
|
|
// returned in _acceptedInputFormat).
|
|
virtual status_t SetUp(const media_format* inputFormat) = 0;
|
|
|
|
virtual status_t AddTrackInfo(uint32 code, const void* data,
|
|
size_t size, uint32 flags = 0);
|
|
|
|
virtual status_t GetEncodeParameters(
|
|
encode_parameters* parameters) const;
|
|
virtual status_t SetEncodeParameters(
|
|
encode_parameters* parameters) const;
|
|
|
|
virtual status_t Encode(const void* buffer, int64 frameCount,
|
|
media_encode_info* info) = 0;
|
|
|
|
status_t WriteChunk(const void* chunkBuffer,
|
|
size_t chunkSize,
|
|
media_encode_info* encodeInfo);
|
|
|
|
void SetChunkWriter(ChunkWriter* writer);
|
|
|
|
virtual status_t Perform(perform_code code, void* data);
|
|
|
|
private:
|
|
virtual void _ReservedEncoder1();
|
|
virtual void _ReservedEncoder2();
|
|
virtual void _ReservedEncoder3();
|
|
virtual void _ReservedEncoder4();
|
|
virtual void _ReservedEncoder5();
|
|
|
|
ChunkWriter* fChunkWriter;
|
|
|
|
// needed for plug-in reference count management
|
|
friend class PluginManager;
|
|
MediaPlugin* fMediaPlugin;
|
|
|
|
uint32 fReserved[5];
|
|
};
|
|
|
|
|
|
class EncoderPlugin : public virtual MediaPlugin {
|
|
public:
|
|
EncoderPlugin();
|
|
|
|
virtual Encoder* NewEncoder(
|
|
const media_codec_info& codecInfo) = 0;
|
|
|
|
virtual status_t RegisterNextEncoder(int32* cookie,
|
|
media_codec_info* codecInfo,
|
|
media_format_family* formatFamily,
|
|
media_format* inputFormat,
|
|
media_format* outputFormat) = 0;
|
|
};
|
|
|
|
} } // namespace BPrivate::media
|
|
|
|
using namespace BPrivate::media;
|
|
|
|
#endif // _ENCODER_PLUGIN_H
|