+ if (size > 0) {
+ /* size has been provided to us in MIME header */
+ ret = av_get_packet(s->pb, pkt, size);
+ } else {
+ /* no size was given -- we read until the next boundary or end-of-file */
+ int remaining = 0, len;
+
+ const int read_chunk = 2048;
+ av_init_packet(pkt);
+ pkt->data = NULL;
+ pkt->size = 0;
+ pkt->pos = avio_tell(s->pb);
+
+ /* we may need to return as much as all we've read back to the buffer */
+ ffio_ensure_seekback(s->pb, read_chunk);
+
+ while ((ret = av_append_packet(s->pb, pkt, read_chunk - remaining)) >= 0) {
+ /* scan the new data */
+ char *start;
+
+ len = ret + remaining;
+ start = pkt->data + pkt->size - len;
+ do {
+ if (!memcmp(start, mpjpeg->searchstr, mpjpeg->searchstr_len)) {
+ // got the boundary! rewind the stream
+ avio_seek(s->pb, -(len-2), SEEK_CUR);
+ pkt->size -= (len-2);
+ return pkt->size;
+ }
+ len--;
+ start++;
+ } while (len >= mpjpeg->searchstr_len);
+ remaining = len;
+ }
+
+ /* error or EOF occurred */
+ if (ret == AVERROR_EOF) {
+ ret = pkt->size > 0 ? pkt->size : AVERROR_EOF;
+ } else {
+ av_packet_unref(pkt);
+ }
+ }
+
+ return ret;