1 /* 2 * Copyright (C) 2001 Carlos Hasan 3 * Copyright (C) 2001 François Revol 4 * Copyright (C) 2001 Axel Dörfler 5 * Copyright (C) 2004 Marcus Overhagen 6 * Copyright (C) 2009 Stephan Aßmus <superstippi@gmx.de> 7 * 8 * All rights reserved. Distributed under the terms of the MIT License. 9 */ 10 11 //! libavcodec/libavformat based Decoder and Reader plugin for Haiku 12 13 #include "FFmpegPlugin.h" 14 15 #include <stdio.h> 16 17 #include <new> 18 19 extern "C" { 20 #include "avcodec.h" 21 #include "avformat.h" 22 } 23 24 #include "AVCodecDecoder.h" 25 #include "AVCodecEncoder.h" 26 #include "AVFormatReader.h" 27 #include "AVFormatWriter.h" 28 #include "CodecTable.h" 29 #include "EncoderTable.h" 30 #include "MuxerTable.h" 31 32 33 //#define TRACE_FFMPEG_PLUGIN 34 #ifdef TRACE_FFMPEG_PLUGIN 35 # define TRACE printf 36 #else 37 # define TRACE(a...) 38 #endif 39 40 #define ERROR(a...) fprintf(stderr, a) 41 42 43 // #pragma mark - 44 45 46 Decoder* 47 FFmpegPlugin::NewDecoder(uint index) 48 { 49 // TODO: Confirm we can check index here. 50 // if (index == 0) 51 return new(std::nothrow) AVCodecDecoder(); 52 // return NULL; 53 } 54 55 56 Reader* 57 FFmpegPlugin::NewReader() 58 { 59 return new(std::nothrow) AVFormatReader(); 60 } 61 62 63 status_t 64 FFmpegPlugin::GetSupportedFormats(media_format** _formats, size_t* _count) 65 { 66 return build_decoder_formats(_formats, _count); 67 } 68 69 70 Writer* 71 FFmpegPlugin::NewWriter() 72 { 73 return new(std::nothrow) AVFormatWriter(); 74 } 75 76 77 status_t 78 FFmpegPlugin::GetSupportedFileFormats(const media_file_format** _fileFormats, 79 size_t* _count) 80 { 81 *_fileFormats = gMuxerTable; 82 *_count = gMuxerCount; 83 return B_OK; 84 } 85 86 87 Encoder* 88 FFmpegPlugin::NewEncoder(const media_codec_info& codecInfo) 89 { 90 for (size_t i = 0; i < gEncoderCount; i++) { 91 if (codecInfo.sub_id == gEncoderTable[i].codec_info.sub_id) { 92 return new(std::nothrow)AVCodecEncoder(codecInfo.sub_id, 93 gEncoderTable[i].bit_rate_scale); 94 } 95 } 96 return NULL; 97 } 98 99 100 Encoder* 101 FFmpegPlugin::NewEncoder(const media_format& format) 102 { 103 for (size_t i = 0; i < gEncoderCount; i++) { 104 if (format.type == gEncoderTable[i].output_type) { 105 return new(std::nothrow)AVCodecEncoder( 106 gEncoderTable[i].codec_info.sub_id, 107 gEncoderTable[i].bit_rate_scale); 108 } 109 } 110 return NULL; 111 } 112 113 114 status_t 115 FFmpegPlugin::RegisterNextEncoder(int32* cookie, media_codec_info* _codecInfo, 116 media_format_family* _formatFamily, media_format* _inputFormat, 117 media_format* _outputFormat) 118 { 119 if (*cookie < 0 || *cookie >= (int32)gEncoderCount) 120 return B_BAD_INDEX; 121 122 *_codecInfo = gEncoderTable[*cookie].codec_info; 123 *_formatFamily = gEncoderTable[*cookie].format_family; 124 _inputFormat->type = gEncoderTable[*cookie].input_type; 125 _outputFormat->type = gEncoderTable[*cookie].output_type;; 126 127 *cookie = *cookie + 1; 128 129 return B_OK; 130 } 131 132 133 // #pragma mark - 134 135 136 MediaPlugin* 137 instantiate_plugin() 138 { 139 return new(std::nothrow) FFmpegPlugin; 140 } 141 142