| 63 | } |
| 64 | |
| 65 | static int libshine_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, |
| 66 | const AVFrame *frame, int *got_packet_ptr) |
| 67 | { |
| 68 | SHINEContext *s = avctx->priv_data; |
| 69 | MPADecodeHeader hdr; |
| 70 | unsigned char *data; |
| 71 | int written; |
| 72 | int ret, len; |
| 73 | |
| 74 | if (frame) |
| 75 | data = shine_encode_buffer(s->shine, (int16_t **)frame->data, &written); |
| 76 | else |
| 77 | data = shine_flush(s->shine, &written); |
| 78 | if (written < 0) |
| 79 | return -1; |
| 80 | if (written > 0) { |
| 81 | if (s->buffer_index + written > BUFFER_SIZE) { |
| 82 | av_log(avctx, AV_LOG_ERROR, "internal buffer too small\n"); |
| 83 | return AVERROR_BUG; |
| 84 | } |
| 85 | memcpy(s->buffer + s->buffer_index, data, written); |
| 86 | s->buffer_index += written; |
| 87 | } |
| 88 | if (frame) { |
| 89 | if ((ret = ff_af_queue_add(&s->afq, frame)) < 0) |
| 90 | return ret; |
| 91 | } |
| 92 | |
| 93 | if (s->buffer_index < 4 || !s->afq.frame_count) |
| 94 | return 0; |
| 95 | if (avpriv_mpegaudio_decode_header(&hdr, AV_RB32(s->buffer))) { |
| 96 | av_log(avctx, AV_LOG_ERROR, "free format output not supported\n"); |
| 97 | return -1; |
| 98 | } |
| 99 | |
| 100 | len = hdr.frame_size; |
| 101 | if (len <= s->buffer_index) { |
| 102 | if ((ret = ff_get_encode_buffer(avctx, avpkt, len, 0))) |
| 103 | return ret; |
| 104 | memcpy(avpkt->data, s->buffer, len); |
| 105 | s->buffer_index -= len; |
| 106 | memmove(s->buffer, s->buffer + len, s->buffer_index); |
| 107 | |
| 108 | ff_af_queue_remove(&s->afq, avctx->frame_size, &avpkt->pts, |
| 109 | &avpkt->duration); |
| 110 | |
| 111 | *got_packet_ptr = 1; |
| 112 | } |
| 113 | return 0; |
| 114 | } |
| 115 | |
| 116 | static av_cold int libshine_encode_close(AVCodecContext *avctx) |
| 117 | { |
nothing calls this directly
no test coverage detected