summaryrefslogtreecommitdiff
path: root/libavcodec/mjpega_dump_header_bsf.c
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2013-11-23 11:43:13 +0100
committerAnton Khirnov <anton@khirnov.net>2016-03-20 08:15:01 +0100
commit33d18982fa03feb061c8f744a4f0a9175c1f63ab (patch)
tree194f6383561b7acf3315eb7982c13aa95ff5ef67 /libavcodec/mjpega_dump_header_bsf.c
parenta2d1922bde8db2cdac95051918fe81ae18c0376b (diff)
lavc: add a new bitstream filtering API
Deprecate the current bitstream filtering API.
Diffstat (limited to 'libavcodec/mjpega_dump_header_bsf.c')
-rw-r--r--libavcodec/mjpega_dump_header_bsf.c106
1 files changed, 59 insertions, 47 deletions
diff --git a/libavcodec/mjpega_dump_header_bsf.c b/libavcodec/mjpega_dump_header_bsf.c
index dfb8916dd9..b3ce26a664 100644
--- a/libavcodec/mjpega_dump_header_bsf.c
+++ b/libavcodec/mjpega_dump_header_bsf.c
@@ -26,71 +26,83 @@
*/
#include "avcodec.h"
+#include "bsf.h"
#include "bytestream.h"
#include "mjpeg.h"
-static int mjpega_dump_header(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args,
- uint8_t **poutbuf, int *poutbuf_size,
- const uint8_t *buf, int buf_size, int keyframe)
+static int mjpega_dump_header(AVBSFContext *ctx, AVPacket *out)
{
- uint8_t *poutbufp;
+ AVPacket *in;
+ uint8_t *out_buf;
unsigned dqt = 0, dht = 0, sof0 = 0;
- int i;
+ int ret = 0, i;
- if (avctx->codec_id != AV_CODEC_ID_MJPEG) {
- av_log(avctx, AV_LOG_ERROR, "mjpega bitstream filter only applies to mjpeg codec\n");
- return 0;
- }
+ ret = ff_bsf_get_packet(ctx, &in);
+ if (ret < 0)
+ return ret;
+
+ ret = av_new_packet(out, in->size + 44);
+ if (ret < 0)
+ goto fail;
+
+ ret = av_packet_copy_props(out, in);
+ if (ret < 0)
+ goto fail;
- *poutbuf_size = 0;
- *poutbuf = av_malloc(buf_size + 44 + AV_INPUT_BUFFER_PADDING_SIZE);
- if (!*poutbuf)
- return AVERROR(ENOMEM);
- poutbufp = *poutbuf;
- bytestream_put_byte(&poutbufp, 0xff);
- bytestream_put_byte(&poutbufp, SOI);
- bytestream_put_byte(&poutbufp, 0xff);
- bytestream_put_byte(&poutbufp, APP1);
- bytestream_put_be16(&poutbufp, 42); /* size */
- bytestream_put_be32(&poutbufp, 0);
- bytestream_put_buffer(&poutbufp, "mjpg", 4);
- bytestream_put_be32(&poutbufp, buf_size + 44); /* field size */
- bytestream_put_be32(&poutbufp, buf_size + 44); /* pad field size */
- bytestream_put_be32(&poutbufp, 0); /* next ptr */
+ out_buf = out->data;
+ bytestream_put_byte(&out_buf, 0xff);
+ bytestream_put_byte(&out_buf, SOI);
+ bytestream_put_byte(&out_buf, 0xff);
+ bytestream_put_byte(&out_buf, APP1);
+ bytestream_put_be16(&out_buf, 42); /* size */
+ bytestream_put_be32(&out_buf, 0);
+ bytestream_put_buffer(&out_buf, "mjpg", 4);
+ bytestream_put_be32(&out_buf, in->size + 44); /* field size */
+ bytestream_put_be32(&out_buf, in->size + 44); /* pad field size */
+ bytestream_put_be32(&out_buf, 0); /* next ptr */
- for (i = 0; i < buf_size - 1; i++) {
- if (buf[i] == 0xff) {
- switch (buf[i + 1]) {
+ for (i = 0; i < in->size - 1; i++) {
+ if (in->data[i] == 0xff) {
+ switch (in->data[i + 1]) {
case DQT: dqt = i + 46; break;
case DHT: dht = i + 46; break;
case SOF0: sof0 = i + 46; break;
case SOS:
- bytestream_put_be32(&poutbufp, dqt); /* quant off */
- bytestream_put_be32(&poutbufp, dht); /* huff off */
- bytestream_put_be32(&poutbufp, sof0); /* image off */
- bytestream_put_be32(&poutbufp, i + 46); /* scan off */
- bytestream_put_be32(&poutbufp, i + 46 + AV_RB16(buf + i + 2)); /* data off */
- bytestream_put_buffer(&poutbufp, buf + 2, buf_size - 2); /* skip already written SOI */
- *poutbuf_size = poutbufp - *poutbuf;
- return 1;
+ bytestream_put_be32(&out_buf, dqt); /* quant off */
+ bytestream_put_be32(&out_buf, dht); /* huff off */
+ bytestream_put_be32(&out_buf, sof0); /* image off */
+ bytestream_put_be32(&out_buf, i + 46); /* scan off */
+ bytestream_put_be32(&out_buf, i + 46 + AV_RB16(in->data + i + 2)); /* data off */
+ bytestream_put_buffer(&out_buf, in->data + 2, in->size - 2); /* skip already written SOI */
+
+ out->size = out_buf - out->data;
+ av_packet_free(&in);
+ return 0;
case APP1:
- if (i + 8 < buf_size && AV_RL32(buf + i + 8) == AV_RL32("mjpg")) {
- av_log(avctx, AV_LOG_ERROR, "bitstream already formatted\n");
- memcpy(*poutbuf, buf, buf_size);
- *poutbuf_size = buf_size;
- return 1;
+ if (i + 8 < in->size && AV_RL32(in->data + i + 8) == AV_RL32("mjpg")) {
+ av_log(ctx, AV_LOG_ERROR, "bitstream already formatted\n");
+ av_packet_unref(out);
+ av_packet_move_ref(out, in);
+ av_packet_free(&in);
+ return 0;
}
}
}
}
- av_freep(poutbuf);
- av_log(avctx, AV_LOG_ERROR, "could not find SOS marker in bitstream\n");
- return 0;
+ av_log(ctx, AV_LOG_ERROR, "could not find SOS marker in bitstream\n");
+fail:
+ av_packet_unref(out);
+ av_packet_free(&in);
+ return AVERROR_INVALIDDATA;
}
-AVBitStreamFilter ff_mjpega_dump_header_bsf = {
- "mjpegadump",
- 0,
- mjpega_dump_header,
+static const enum AVCodecID codec_ids[] = {
+ AV_CODEC_ID_MJPEG, AV_CODEC_ID_NONE,
+};
+
+const AVBitStreamFilter ff_mjpega_dump_header_bsf = {
+ .name = "mjpegadump",
+ .filter = mjpega_dump_header,
+ .codec_ids = codec_ids,
};