MCPcopy Create free account
hub / github.com/FFmpeg/FFmpeg / libshine_encode_frame

Function libshine_encode_frame

libavcodec/libshine.c:65–114  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

63}
64
65static 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
116static av_cold int libshine_encode_close(AVCodecContext *avctx)
117{

Callers

nothing calls this directly

Calls 5

av_logFunction · 0.85
ff_af_queue_addFunction · 0.85
ff_get_encode_bufferFunction · 0.85
ff_af_queue_removeFunction · 0.85

Tested by

no test coverage detected