X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Flibtheoraenc.c;h=b329ed3b347ed72de6fc763be6665759dc2a2fab;hb=58d87e0f49bcbbc6f426328f53b657bae7430cd2;hp=957994a44fffe8a419cd0f078f2efa797d748854;hpb=f7fa73ac917534cc5f77469cac2b80462e475417;p=ffmpeg diff --git a/libavcodec/libtheoraenc.c b/libavcodec/libtheoraenc.c index 957994a44ff..b329ed3b347 100644 --- a/libavcodec/libtheoraenc.c +++ b/libavcodec/libtheoraenc.c @@ -31,7 +31,9 @@ */ /* Libav includes */ +#include "libavutil/common.h" #include "libavutil/intreadwrite.h" +#include "libavutil/pixdesc.h" #include "libavutil/log.h" #include "libavutil/base64.h" #include "avcodec.h" @@ -56,8 +58,8 @@ static int concatenate_packet(unsigned int* offset, const ogg_packet* packet) { const char* message = NULL; - uint8_t* newdata = NULL; int newsize = avc_context->extradata_size + 2 + packet->bytes; + int err = AVERROR_INVALIDDATA; if (packet->bytes < 0) { message = "ogg_packet has negative size"; @@ -66,16 +68,16 @@ static int concatenate_packet(unsigned int* offset, } else if (newsize < avc_context->extradata_size) { message = "extradata_size would overflow"; } else { - newdata = av_realloc(avc_context->extradata, newsize); - if (!newdata) + if ((err = av_reallocp(&avc_context->extradata, newsize)) < 0) { + avc_context->extradata_size = 0; message = "av_realloc failed"; + } } if (message) { av_log(avc_context, AV_LOG_ERROR, "concatenate_packet failed: %s\n", message); - return -1; + return err; } - avc_context->extradata = newdata; avc_context->extradata_size = newsize; AV_WB16(avc_context->extradata + (*offset), packet->bytes); *offset += 2; @@ -99,6 +101,8 @@ static int get_stats(AVCodecContext *avctx, int eos) if (!eos) { h->stats = av_fast_realloc(h->stats, &h->stats_size, h->stats_offset + bytes); + if (!h->stats) + return AVERROR(ENOMEM); memcpy(h->stats + h->stats_offset, buf, bytes); h->stats_offset += bytes; } else { @@ -106,6 +110,8 @@ static int get_stats(AVCodecContext *avctx, int eos) // libtheora generates a summary header at the end memcpy(h->stats, buf, bytes); avctx->stats_out = av_malloc(b64_size); + if (!avctx->stats_out) + return AVERROR(ENOMEM); av_base64_encode(avctx->stats_out, b64_size, h->stats, h->stats_offset); } return 0; @@ -129,6 +135,8 @@ static int submit_stats(AVCodecContext *avctx) } h->stats_size = strlen(avctx->stats_in) * 3/4; h->stats = av_malloc(h->stats_size); + if (!h->stats) + return AVERROR(ENOMEM); h->stats_size = av_base64_decode(h->stats, avctx->stats_in, h->stats_size); } while (h->stats_size - h->stats_offset > 0) { @@ -186,25 +194,26 @@ static av_cold int encode_init(AVCodecContext* avc_context) else t_info.colorspace = TH_CS_UNSPECIFIED; - if (avc_context->pix_fmt == PIX_FMT_YUV420P) + if (avc_context->pix_fmt == AV_PIX_FMT_YUV420P) t_info.pixel_fmt = TH_PF_420; - else if (avc_context->pix_fmt == PIX_FMT_YUV422P) + else if (avc_context->pix_fmt == AV_PIX_FMT_YUV422P) t_info.pixel_fmt = TH_PF_422; - else if (avc_context->pix_fmt == PIX_FMT_YUV444P) + else if (avc_context->pix_fmt == AV_PIX_FMT_YUV444P) t_info.pixel_fmt = TH_PF_444; else { av_log(avc_context, AV_LOG_ERROR, "Unsupported pix_fmt\n"); return -1; } - avcodec_get_chroma_sub_sample(avc_context->pix_fmt, &h->uv_hshift, &h->uv_vshift); + av_pix_fmt_get_chroma_sub_sample(avc_context->pix_fmt, + &h->uv_hshift, &h->uv_vshift); - if (avc_context->flags & CODEC_FLAG_QSCALE) { + if (avc_context->flags & AV_CODEC_FLAG_QSCALE) { /* to be constant with the libvorbis implementation, clip global_quality to 0 - 10 Theora accepts a quality parameter p, which is: * 0 <= p <=63 * an int value */ - t_info.quality = av_clip(avc_context->global_quality / (float)FF_QP2LAMBDA, 0, 10) * 6.3; + t_info.quality = av_clipf(avc_context->global_quality / (float)FF_QP2LAMBDA, 0, 10) * 6.3; t_info.target_bitrate = 0; } else { t_info.target_bitrate = avc_context->bit_rate; @@ -229,10 +238,10 @@ static av_cold int encode_init(AVCodecContext* avc_context) } // need to enable 2 pass (via TH_ENCCTL_2PASS_) before encoding headers - if (avc_context->flags & CODEC_FLAG_PASS1) { + if (avc_context->flags & AV_CODEC_FLAG_PASS1) { if (get_stats(avc_context, 0)) return -1; - } else if (avc_context->flags & CODEC_FLAG_PASS2) { + } else if (avc_context->flags & AV_CODEC_FLAG_PASS2) { if (submit_stats(avc_context)) return -1; } @@ -241,7 +250,7 @@ static av_cold int encode_init(AVCodecContext* avc_context) Output first header packet consisting of theora header, comment, and tables. - Each one is prefixed with a 16bit size, then they + Each one is prefixed with a 16-bit size, then they are concatenated together into libavcodec's extradata. */ offset = 0; @@ -255,9 +264,6 @@ static av_cold int encode_init(AVCodecContext* avc_context) th_comment_clear(&t_comment); - /* Set up the output AVFrame */ - avc_context->coded_frame= avcodec_alloc_frame(); - return 0; } @@ -272,7 +278,7 @@ static int encode_frame(AVCodecContext* avc_context, AVPacket *pkt, // EOS, finish and get 1st pass stats if applicable if (!frame) { th_encode_packetout(h->t_state, 1, &o_packet); - if (avc_context->flags & CODEC_FLAG_PASS1) + if (avc_context->flags & AV_CODEC_FLAG_PASS1) if (get_stats(avc_context, 1)) return -1; return 0; @@ -286,7 +292,7 @@ static int encode_frame(AVCodecContext* avc_context, AVPacket *pkt, t_yuv_buffer[i].data = frame->data[i]; } - if (avc_context->flags & CODEC_FLAG_PASS2) + if (avc_context->flags & AV_CODEC_FLAG_PASS2) if (submit_stats(avc_context)) return -1; @@ -309,7 +315,7 @@ static int encode_frame(AVCodecContext* avc_context, AVPacket *pkt, return -1; } - if (avc_context->flags & CODEC_FLAG_PASS1) + if (avc_context->flags & AV_CODEC_FLAG_PASS1) if (get_stats(avc_context, 0)) return -1; @@ -335,10 +341,14 @@ static int encode_frame(AVCodecContext* avc_context, AVPacket *pkt, memcpy(pkt->data, o_packet.packet, o_packet.bytes); // HACK: assumes no encoder delay, this is true until libtheora becomes - // multithreaded (which will be disabled unless explictly requested) + // multithreaded (which will be disabled unless explicitly requested) pkt->pts = pkt->dts = frame->pts; +#if FF_API_CODED_FRAME +FF_DISABLE_DEPRECATION_WARNINGS avc_context->coded_frame->key_frame = !(o_packet.granulepos & h->keyframe_mask); - if (avc_context->coded_frame->key_frame) +FF_ENABLE_DEPRECATION_WARNINGS +#endif + if (!(o_packet.granulepos & h->keyframe_mask)) pkt->flags |= AV_PKT_FLAG_KEY; *got_packet = 1; @@ -351,7 +361,6 @@ static av_cold int encode_close(AVCodecContext* avc_context) th_encode_free(h->t_state); av_freep(&h->stats); - av_freep(&avc_context->coded_frame); av_freep(&avc_context->stats_out); av_freep(&avc_context->extradata); avc_context->extradata_size = 0; @@ -361,14 +370,16 @@ static av_cold int encode_close(AVCodecContext* avc_context) /** AVCodec struct exposed to libavcodec */ AVCodec ff_libtheora_encoder = { - .name = "libtheora", - .type = AVMEDIA_TYPE_VIDEO, - .id = CODEC_ID_THEORA, + .name = "libtheora", + .long_name = NULL_IF_CONFIG_SMALL("libtheora Theora"), + .type = AVMEDIA_TYPE_VIDEO, + .id = AV_CODEC_ID_THEORA, .priv_data_size = sizeof(TheoraContext), - .init = encode_init, - .close = encode_close, - .encode2 = encode_frame, - .capabilities = CODEC_CAP_DELAY, // needed to get the statsfile summary - .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_NONE}, - .long_name = NULL_IF_CONFIG_SMALL("libtheora Theora"), + .init = encode_init, + .close = encode_close, + .encode2 = encode_frame, + .capabilities = AV_CODEC_CAP_DELAY, // needed to get the statsfile summary + .pix_fmts = (const enum AVPixelFormat[]){ + AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_NONE + }, };