| @@ -89,14 +89,42 @@ static int select_channel_layout(const AVCodec *codec) | |||
| return best_ch_layout; | |||
| } | |||
| static void encode(AVCodecContext *ctx, AVFrame *frame, AVPacket *pkt, | |||
| FILE *output) | |||
| { | |||
| int ret; | |||
| /* send the frame for encoding */ | |||
| ret = avcodec_send_frame(ctx, frame); | |||
| if (ret < 0) { | |||
| fprintf(stderr, "error sending the frame to the encoder\n"); | |||
| exit(1); | |||
| } | |||
| /* read all the available output packets (in general there may be any | |||
| * number of them */ | |||
| while (ret >= 0) { | |||
| ret = avcodec_receive_packet(ctx, pkt); | |||
| if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) | |||
| return; | |||
| else if (ret < 0) { | |||
| fprintf(stderr, "error encoding audio frame\n"); | |||
| exit(1); | |||
| } | |||
| fwrite(pkt->data, 1, pkt->size, output); | |||
| av_packet_unref(pkt); | |||
| } | |||
| } | |||
| int main(int argc, char **argv) | |||
| { | |||
| const char *filename; | |||
| const AVCodec *codec; | |||
| AVCodecContext *c= NULL; | |||
| AVFrame *frame; | |||
| AVPacket pkt; | |||
| int i, j, k, ret, got_output; | |||
| AVPacket *pkt; | |||
| int i, j, k, ret; | |||
| FILE *f; | |||
| uint16_t *samples; | |||
| float t, tincr; | |||
| @@ -147,6 +175,13 @@ int main(int argc, char **argv) | |||
| exit(1); | |||
| } | |||
| /* packet for holding encoded output */ | |||
| pkt = av_packet_alloc(); | |||
| if (!pkt) { | |||
| fprintf(stderr, "could not allocate the packet\n"); | |||
| exit(1); | |||
| } | |||
| /* frame containing input raw audio */ | |||
| frame = av_frame_alloc(); | |||
| if (!frame) { | |||
| @@ -169,10 +204,6 @@ int main(int argc, char **argv) | |||
| t = 0; | |||
| tincr = 2 * M_PI * 440.0 / c->sample_rate; | |||
| for(i=0;i<200;i++) { | |||
| av_init_packet(&pkt); | |||
| pkt.data = NULL; // packet data will be allocated by the encoder | |||
| pkt.size = 0; | |||
| /* make sure the frame is writable -- makes a copy if the encoder | |||
| * kept a reference internally */ | |||
| ret = av_frame_make_writable(frame); | |||
| @@ -187,19 +218,15 @@ int main(int argc, char **argv) | |||
| samples[2*j + k] = samples[2*j]; | |||
| t += tincr; | |||
| } | |||
| /* encode the samples */ | |||
| ret = avcodec_encode_audio2(c, &pkt, frame, &got_output); | |||
| if (ret < 0) { | |||
| fprintf(stderr, "error encoding audio frame\n"); | |||
| exit(1); | |||
| } | |||
| if (got_output) { | |||
| fwrite(pkt.data, 1, pkt.size, f); | |||
| av_packet_unref(&pkt); | |||
| } | |||
| encode(c, frame, pkt, f); | |||
| } | |||
| /* flush the encoder */ | |||
| encode(c, NULL, pkt, f); | |||
| fclose(f); | |||
| av_frame_free(&frame); | |||
| av_packet_free(&pkt); | |||
| avcodec_free_context(&c); | |||
| } | |||