ff_dsputil_static_init();
}
-static av_always_inline int codec_is_encoder(AVCodec *codec)
+int av_codec_is_encoder(AVCodec *codec)
{
return codec && (codec->encode || codec->encode2);
}
-static av_always_inline int codec_is_decoder(AVCodec *codec)
+int av_codec_is_decoder(AVCodec *codec)
{
return codec && codec->decode;
}
return s->get_buffer(s, pic);
}
- assert(s->pix_fmt == pic->pix_fmt);
+ assert(s->pix_fmt == pic->format);
/* If internal buffer type return the same buffer */
if(pic->type == FF_BUFFER_TYPE_INTERNAL) {
/* if the decoder init function was already called previously,
free the already allocated subtitle_header before overwriting it */
- if (codec_is_decoder(codec))
+ if (av_codec_is_decoder(codec))
av_freep(&avctx->subtitle_header);
#define SANE_NB_CHANNELS 128U
ret = AVERROR(EINVAL);
goto free_and_end;
}
- if (codec_is_encoder(avctx->codec)) {
+ if (av_codec_is_encoder(avctx->codec)) {
int i;
if (avctx->codec->sample_fmts) {
for (i = 0; avctx->codec->sample_fmts[i] != AV_SAMPLE_FMT_NONE; i++)
return AVERROR(EINVAL);
if (avpkt->data) {
- uint8_t *pkt_data;
+ void *destruct = avpkt->destruct;
if (avpkt->size < size)
return AVERROR(EINVAL);
- pkt_data = avpkt->data;
av_init_packet(avpkt);
- avpkt->data = pkt_data;
+ avpkt->destruct = destruct;
avpkt->size = size;
return 0;
} else {
*got_packet_ptr = 0;
if (!(avctx->codec->capabilities & CODEC_CAP_DELAY) && !frame) {
+ av_free_packet(avpkt);
av_init_packet(avpkt);
avpkt->size = 0;
return 0;
if (!ret)
avctx->frame_number++;
+ if (ret < 0 || !*got_packet_ptr)
+ av_free_packet(avpkt);
+
/* NOTE: if we add any audio encoders which output non-keyframe packets,
this needs to be moved to the encoders, but for now we can do it
here to simplify things */
int ret;
int user_packet = !!avpkt->data;
+ *got_packet_ptr = 0;
+
if (!(avctx->codec->capabilities & CODEC_CAP_DELAY) && !frame) {
+ av_free_packet(avpkt);
av_init_packet(avpkt);
avpkt->size = 0;
- *got_packet_ptr = 0;
return 0;
}
av_assert0(avctx->codec->encode2);
- *got_packet_ptr = 0;
ret = avctx->codec->encode2(avctx, avpkt, frame, got_packet_ptr);
if (!ret) {
if (!*got_packet_ptr)
avpkt->size = 0;
else if (!(avctx->codec->capabilities & CODEC_CAP_DELAY))
avpkt->pts = avpkt->dts = frame->pts;
- }
- if (!ret)
+ if (!user_packet && avpkt->data) {
+ uint8_t *new_data = av_realloc(avpkt->data, avpkt->size);
+ if (new_data)
+ avpkt->data = new_data;
+ }
+
avctx->frame_number++;
+ }
+
+ if (ret < 0 || !*got_packet_ptr)
+ av_free_packet(avpkt);
emms_c();
return ret;
av_opt_free(avctx->priv_data);
av_opt_free(avctx);
av_freep(&avctx->priv_data);
- if (codec_is_encoder(avctx->codec))
+ if (av_codec_is_encoder(avctx->codec))
av_freep(&avctx->extradata);
avctx->codec = NULL;
avctx->active_thread_type = 0;
AVCodec *p, *experimental=NULL;
p = first_avcodec;
while (p) {
- if (codec_is_encoder(p) && p->id == id) {
+ if (av_codec_is_encoder(p) && p->id == id) {
if (p->capabilities & CODEC_CAP_EXPERIMENTAL && !experimental) {
experimental = p;
} else
return NULL;
p = first_avcodec;
while (p) {
- if (codec_is_encoder(p) && strcmp(name,p->name) == 0)
+ if (av_codec_is_encoder(p) && strcmp(name,p->name) == 0)
return p;
p = p->next;
}
AVCodec *p;
p = first_avcodec;
while (p) {
- if (codec_is_decoder(p) && p->id == id)
+ if (av_codec_is_decoder(p) && p->id == id)
return p;
p = p->next;
}
return NULL;
p = first_avcodec;
while (p) {
- if (codec_is_decoder(p) && strcmp(name,p->name) == 0)
+ if (av_codec_is_decoder(p) && strcmp(name,p->name) == 0)
return p;
p = p->next;
}
}
}
-int av_get_bits_per_sample(enum CodecID codec_id){
+int av_get_exact_bits_per_sample(enum CodecID codec_id)
+{
switch(codec_id){
- case CODEC_ID_ADPCM_SBPRO_2:
- return 2;
- case CODEC_ID_ADPCM_SBPRO_3:
- return 3;
- case CODEC_ID_ADPCM_SBPRO_4:
case CODEC_ID_ADPCM_CT:
case CODEC_ID_ADPCM_IMA_APC:
- case CODEC_ID_ADPCM_IMA_WAV:
- case CODEC_ID_ADPCM_IMA_QT:
- case CODEC_ID_ADPCM_SWF:
- case CODEC_ID_ADPCM_MS:
- case CODEC_ID_ADPCM_YAMAHA:
+ case CODEC_ID_ADPCM_IMA_EA_SEAD:
+ case CODEC_ID_ADPCM_IMA_WS:
case CODEC_ID_ADPCM_G722:
+ case CODEC_ID_ADPCM_YAMAHA:
return 4;
case CODEC_ID_PCM_ALAW:
case CODEC_ID_PCM_MULAW:
}
}
+int av_get_bits_per_sample(enum CodecID codec_id)
+{
+ switch (codec_id) {
+ case CODEC_ID_ADPCM_SBPRO_2:
+ return 2;
+ case CODEC_ID_ADPCM_SBPRO_3:
+ return 3;
+ case CODEC_ID_ADPCM_SBPRO_4:
+ case CODEC_ID_ADPCM_IMA_WAV:
+ case CODEC_ID_ADPCM_IMA_QT:
+ case CODEC_ID_ADPCM_SWF:
+ case CODEC_ID_ADPCM_MS:
+ return 4;
+ default:
+ return av_get_exact_bits_per_sample(codec_id);
+ }
+}
+
+int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes)
+{
+ int id, sr, ch, ba, tag, bps;
+
+ id = avctx->codec_id;
+ sr = avctx->sample_rate;
+ ch = avctx->channels;
+ ba = avctx->block_align;
+ tag = avctx->codec_tag;
+ bps = av_get_exact_bits_per_sample(avctx->codec_id);
+
+ /* codecs with an exact constant bits per sample */
+ if (bps > 0 && ch > 0 && frame_bytes > 0)
+ return (frame_bytes * 8) / (bps * ch);
+ bps = avctx->bits_per_coded_sample;
+
+ /* codecs with a fixed packet duration */
+ switch (id) {
+ case CODEC_ID_ADPCM_ADX: return 32;
+ case CODEC_ID_ADPCM_IMA_QT: return 64;
+ case CODEC_ID_ADPCM_EA_XAS: return 128;
+ case CODEC_ID_AMR_NB:
+ case CODEC_ID_GSM:
+ case CODEC_ID_QCELP:
+ case CODEC_ID_RA_144:
+ case CODEC_ID_RA_288: return 160;
+ case CODEC_ID_IMC: return 256;
+ case CODEC_ID_AMR_WB:
+ case CODEC_ID_GSM_MS: return 320;
+ case CODEC_ID_MP1: return 384;
+ case CODEC_ID_ATRAC1: return 512;
+ case CODEC_ID_ATRAC3: return 1024;
+ case CODEC_ID_MP2:
+ case CODEC_ID_MUSEPACK7: return 1152;
+ case CODEC_ID_AC3: return 1536;
+ }
+
+ if (sr > 0) {
+ /* calc from sample rate */
+ if (id == CODEC_ID_TTA)
+ return 256 * sr / 245;
+
+ if (ch > 0) {
+ /* calc from sample rate and channels */
+ if (id == CODEC_ID_BINKAUDIO_DCT)
+ return (480 << (sr / 22050)) / ch;
+ }
+ }
+
+ if (ba > 0) {
+ /* calc from block_align */
+ if (id == CODEC_ID_SIPR) {
+ switch (ba) {
+ case 20: return 160;
+ case 19: return 144;
+ case 29: return 288;
+ case 37: return 480;
+ }
+ }
+ }
+
+ if (frame_bytes > 0) {
+ /* calc from frame_bytes only */
+ if (id == CODEC_ID_TRUESPEECH)
+ return 240 * (frame_bytes / 32);
+ if (id == CODEC_ID_NELLYMOSER)
+ return 256 * (frame_bytes / 64);
+
+ if (bps > 0) {
+ /* calc from frame_bytes and bits_per_coded_sample */
+ if (id == CODEC_ID_ADPCM_G726)
+ return frame_bytes * 8 / bps;
+ }
+
+ if (ch > 0) {
+ /* calc from frame_bytes and channels */
+ switch (id) {
+ case CODEC_ID_ADPCM_4XM:
+ case CODEC_ID_ADPCM_IMA_ISS:
+ return (frame_bytes - 4 * ch) * 2 / ch;
+ case CODEC_ID_ADPCM_IMA_SMJPEG:
+ return (frame_bytes - 4) * 2 / ch;
+ case CODEC_ID_ADPCM_IMA_AMV:
+ return (frame_bytes - 8) * 2 / ch;
+ case CODEC_ID_ADPCM_XA:
+ return (frame_bytes / 128) * 224 / ch;
+ case CODEC_ID_INTERPLAY_DPCM:
+ return (frame_bytes - 6 - ch) / ch;
+ case CODEC_ID_ROQ_DPCM:
+ return (frame_bytes - 8) / ch;
+ case CODEC_ID_XAN_DPCM:
+ return (frame_bytes - 2 * ch) / ch;
+ case CODEC_ID_MACE3:
+ return 3 * frame_bytes / ch;
+ case CODEC_ID_MACE6:
+ return 6 * frame_bytes / ch;
+ case CODEC_ID_PCM_LXF:
+ return 2 * (frame_bytes / (5 * ch));
+ }
+
+ if (tag) {
+ /* calc from frame_bytes, channels, and codec_tag */
+ if (id == CODEC_ID_SOL_DPCM) {
+ if (tag == 3)
+ return frame_bytes / ch;
+ else
+ return frame_bytes * 2 / ch;
+ }
+ }
+
+ if (ba > 0) {
+ /* calc from frame_bytes, channels, and block_align */
+ int blocks = frame_bytes / ba;
+ switch (avctx->codec_id) {
+ case CODEC_ID_ADPCM_IMA_WAV:
+ return blocks * (1 + (ba - 4 * ch) / (4 * ch) * 8);
+ case CODEC_ID_ADPCM_IMA_DK3:
+ return blocks * (((ba - 16) * 8 / 3) / ch);
+ case CODEC_ID_ADPCM_IMA_DK4:
+ return blocks * (1 + (ba - 4 * ch) * 2 / ch);
+ case CODEC_ID_ADPCM_MS:
+ return blocks * (2 + (ba - 7 * ch) * 2 / ch);
+ }
+ }
+
+ if (bps > 0) {
+ /* calc from frame_bytes, channels, and bits_per_coded_sample */
+ switch (avctx->codec_id) {
+ case CODEC_ID_PCM_DVD:
+ return 2 * (frame_bytes / ((bps * 2 / 8) * ch));
+ case CODEC_ID_PCM_BLURAY:
+ return frame_bytes / ((FFALIGN(ch, 2) * bps) / 8);
+ case CODEC_ID_S302M:
+ return 2 * (frame_bytes / ((bps + 4) / 4)) / ch;
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
#if !HAVE_THREADS
int ff_thread_init(AVCodecContext *s){
return -1;