AVCodecContext **input_codec_context)
{
AVCodecContext *avctx;
- AVCodec *input_codec;
+ const AVCodec *input_codec;
int error;
/* Open the input file to read from it. */
AVCodecContext *avctx = NULL;
AVIOContext *output_io_context = NULL;
AVStream *stream = NULL;
- AVCodec *output_codec = NULL;
+ const AVCodec *output_codec = NULL;
int error;
/* Open the output file to write to it. */
/**
* Initialize one data packet for reading or writing.
- * @param packet Packet to be initialized
+ * @param[out] packet Packet to be initialized
+ * @return Error code (0 if successful)
*/
-static void init_packet(AVPacket *packet)
+static int init_packet(AVPacket **packet)
{
- av_init_packet(packet);
- /* Set the packet data and size so that it is recognized as being empty. */
- packet->data = NULL;
- packet->size = 0;
+ if (!(*packet = av_packet_alloc())) {
+ fprintf(stderr, "Could not allocate packet\n");
+ return AVERROR(ENOMEM);
+ }
+ return 0;
}
/**
int *data_present, int *finished)
{
/* Packet used for temporary storage. */
- AVPacket input_packet;
+ AVPacket *input_packet;
int error;
- init_packet(&input_packet);
+
+ error = init_packet(&input_packet);
+ if (error < 0)
+ return error;
/* Read one audio frame from the input file into a temporary packet. */
- if ((error = av_read_frame(input_format_context, &input_packet)) < 0) {
+ if ((error = av_read_frame(input_format_context, input_packet)) < 0) {
/* If we are at the end of the file, flush the decoder below. */
if (error == AVERROR_EOF)
*finished = 1;
else {
fprintf(stderr, "Could not read frame (error '%s')\n",
av_err2str(error));
- return error;
+ goto cleanup;
}
}
/* Send the audio frame stored in the temporary packet to the decoder.
* The input audio stream decoder is used to do this. */
- if ((error = avcodec_send_packet(input_codec_context, &input_packet)) < 0) {
+ if ((error = avcodec_send_packet(input_codec_context, input_packet)) < 0) {
fprintf(stderr, "Could not send packet for decoding (error '%s')\n",
av_err2str(error));
- return error;
+ goto cleanup;
}
/* Receive one frame from the decoder. */
}
cleanup:
- av_packet_unref(&input_packet);
+ av_packet_free(&input_packet);
return error;
}
int *data_present)
{
/* Packet used for temporary storage. */
- AVPacket output_packet;
+ AVPacket *output_packet;
int error;
- init_packet(&output_packet);
+
+ error = init_packet(&output_packet);
+ if (error < 0)
+ return error;
/* Set a timestamp based on the sample rate for the container. */
if (frame) {
} else if (error < 0) {
fprintf(stderr, "Could not send packet for encoding (error '%s')\n",
av_err2str(error));
- return error;
+ goto cleanup;
}
/* Receive one encoded frame from the encoder. */
- error = avcodec_receive_packet(output_codec_context, &output_packet);
+ error = avcodec_receive_packet(output_codec_context, output_packet);
/* If the encoder asks for more data to be able to provide an
* encoded frame, return indicating that no data is present. */
if (error == AVERROR(EAGAIN)) {
/* Write one audio frame from the temporary packet to the output file. */
if (*data_present &&
- (error = av_write_frame(output_format_context, &output_packet)) < 0) {
+ (error = av_write_frame(output_format_context, output_packet)) < 0) {
fprintf(stderr, "Could not write frame (error '%s')\n",
av_err2str(error));
goto cleanup;
}
cleanup:
- av_packet_unref(&output_packet);
+ av_packet_free(&output_packet);
return error;
}