* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
+
+#include "config_components.h"
+
#include <limits.h>
#include "libavutil/channel_layout.h"
#include "libavutil/opt.h"
#include "avcodec.h"
-#include "internal.h"
+#include "codec_internal.h"
+#include "decode.h"
+#include "encode.h"
#include "get_bits.h"
#include "put_bits.h"
return AVERROR(EINVAL);
}
- if(avctx->channels != 1){
+ if (avctx->ch_layout.nb_channels != 1) {
av_log(avctx, AV_LOG_ERROR, "Only mono is supported\n");
return AVERROR(EINVAL);
}
int i, ret, out_size;
out_size = (frame->nb_samples * c->code_size + 7) / 8;
- if ((ret = ff_alloc_packet2(avctx, avpkt, out_size, 0)) < 0)
+ if ((ret = ff_get_encode_buffer(avctx, avpkt, out_size, 0)) < 0)
return ret;
init_put_bits(&pb, avpkt->data, avpkt->size);
flush_put_bits(&pb);
}
- avpkt->size = out_size;
*got_packet_ptr = 1;
return 0;
}
{ NULL },
};
-static const AVCodecDefault defaults[] = {
- { "b", "0" },
- { NULL },
-};
-#endif
-
-#if CONFIG_ADPCM_G726_ENCODER
static const AVClass g726_class = {
.class_name = "g726",
.item_name = av_default_item_name,
.version = LIBAVUTIL_VERSION_INT,
};
-AVCodec ff_adpcm_g726_encoder = {
- .name = "g726",
- .long_name = NULL_IF_CONFIG_SMALL("G.726 ADPCM"),
- .type = AVMEDIA_TYPE_AUDIO,
- .id = AV_CODEC_ID_ADPCM_G726,
+static const FFCodecDefault defaults[] = {
+ { "b", "0" },
+ { NULL },
+};
+#endif
+
+#if CONFIG_ADPCM_G726_ENCODER
+const FFCodec ff_adpcm_g726_encoder = {
+ .p.name = "g726",
+ CODEC_LONG_NAME("G.726 ADPCM"),
+ .p.type = AVMEDIA_TYPE_AUDIO,
+ .p.id = AV_CODEC_ID_ADPCM_G726,
+ .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_SMALL_LAST_FRAME |
+ AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE,
.priv_data_size = sizeof(G726Context),
.init = g726_encode_init,
- .encode2 = g726_encode_frame,
- .capabilities = AV_CODEC_CAP_SMALL_LAST_FRAME,
- .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
+ FF_CODEC_ENCODE_CB(g726_encode_frame),
+ .p.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
AV_SAMPLE_FMT_NONE },
- .priv_class = &g726_class,
+ .p.priv_class = &g726_class,
.defaults = defaults,
};
#endif
#if CONFIG_ADPCM_G726LE_ENCODER
-static const AVClass g726le_class = {
- .class_name = "g726le",
- .item_name = av_default_item_name,
- .option = options,
- .version = LIBAVUTIL_VERSION_INT,
-};
-
-AVCodec ff_adpcm_g726le_encoder = {
- .name = "g726le",
- .long_name = NULL_IF_CONFIG_SMALL("G.726 little endian ADPCM (\"right-justified\")"),
- .type = AVMEDIA_TYPE_AUDIO,
- .id = AV_CODEC_ID_ADPCM_G726LE,
+const FFCodec ff_adpcm_g726le_encoder = {
+ .p.name = "g726le",
+ CODEC_LONG_NAME("G.726 little endian ADPCM (\"right-justified\")"),
+ .p.type = AVMEDIA_TYPE_AUDIO,
+ .p.id = AV_CODEC_ID_ADPCM_G726LE,
+ .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_SMALL_LAST_FRAME |
+ AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE,
.priv_data_size = sizeof(G726Context),
.init = g726_encode_init,
- .encode2 = g726_encode_frame,
- .capabilities = AV_CODEC_CAP_SMALL_LAST_FRAME,
- .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
+ FF_CODEC_ENCODE_CB(g726_encode_frame),
+ .p.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
AV_SAMPLE_FMT_NONE },
- .priv_class = &g726le_class,
+ .p.priv_class = &g726_class,
.defaults = defaults,
};
#endif
{
G726Context* c = avctx->priv_data;
- if(avctx->channels > 1){
+ if (avctx->ch_layout.nb_channels > 1){
avpriv_request_sample(avctx, "Decoding more than one channel");
return AVERROR_PATCHWELCOME;
}
- avctx->channels = 1;
- avctx->channel_layout = AV_CH_LAYOUT_MONO;
+ av_channel_layout_uninit(&avctx->ch_layout);
+ avctx->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO;
c->little_endian = !strcmp(avctx->codec->name, "g726le");
return 0;
}
-static int g726_decode_frame(AVCodecContext *avctx, void *data,
+static int g726_decode_frame(AVCodecContext *avctx, AVFrame *frame,
int *got_frame_ptr, AVPacket *avpkt)
{
- AVFrame *frame = data;
const uint8_t *buf = avpkt->data;
int buf_size = avpkt->size;
G726Context *c = avctx->priv_data;
#endif
#if CONFIG_ADPCM_G726_DECODER
-AVCodec ff_adpcm_g726_decoder = {
- .name = "g726",
- .long_name = NULL_IF_CONFIG_SMALL("G.726 ADPCM"),
- .type = AVMEDIA_TYPE_AUDIO,
- .id = AV_CODEC_ID_ADPCM_G726,
+const FFCodec ff_adpcm_g726_decoder = {
+ .p.name = "g726",
+ CODEC_LONG_NAME("G.726 ADPCM"),
+ .p.type = AVMEDIA_TYPE_AUDIO,
+ .p.id = AV_CODEC_ID_ADPCM_G726,
.priv_data_size = sizeof(G726Context),
.init = g726_decode_init,
- .decode = g726_decode_frame,
+ FF_CODEC_DECODE_CB(g726_decode_frame),
.flush = g726_decode_flush,
- .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF,
+ .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF,
};
#endif
#if CONFIG_ADPCM_G726LE_DECODER
-AVCodec ff_adpcm_g726le_decoder = {
- .name = "g726le",
- .type = AVMEDIA_TYPE_AUDIO,
- .id = AV_CODEC_ID_ADPCM_G726LE,
+const FFCodec ff_adpcm_g726le_decoder = {
+ .p.name = "g726le",
+ .p.type = AVMEDIA_TYPE_AUDIO,
+ .p.id = AV_CODEC_ID_ADPCM_G726LE,
.priv_data_size = sizeof(G726Context),
.init = g726_decode_init,
- .decode = g726_decode_frame,
+ FF_CODEC_DECODE_CB(g726_decode_frame),
.flush = g726_decode_flush,
- .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF,
- .long_name = NULL_IF_CONFIG_SMALL("G.726 ADPCM little-endian"),
+ .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF,
+ CODEC_LONG_NAME("G.726 ADPCM little-endian"),
};
#endif