Commit 7d2714d1 authored by Philip Langdale's avatar Philip Langdale

CrystalHD: Keep mp4toannexb filter around for entire decoder lifetime.

In preparation for using the filter on the actual bitstream, we need
to extend it's lifetime to match that of the decoder.
Signed-off-by: 's avatarPhilip Langdale <philipl@overt.org>
parent 173cd695
...@@ -124,6 +124,7 @@ typedef struct { ...@@ -124,6 +124,7 @@ typedef struct {
AVFrame pic; AVFrame pic;
HANDLE dev; HANDLE dev;
AVBitStreamFilterContext *bsfc;
AVCodecParserContext *parser; AVCodecParserContext *parser;
uint8_t is_70012; uint8_t is_70012;
...@@ -338,6 +339,9 @@ static av_cold int uninit(AVCodecContext *avctx) ...@@ -338,6 +339,9 @@ static av_cold int uninit(AVCodecContext *avctx)
DtsDeviceClose(device); DtsDeviceClose(device);
av_parser_close(priv->parser); av_parser_close(priv->parser);
if (priv->bsfc) {
av_bitstream_filter_close(priv->bsfc);
}
av_free(priv->sps_pps_buf); av_free(priv->sps_pps_buf);
...@@ -397,7 +401,6 @@ static av_cold int init(AVCodecContext *avctx) ...@@ -397,7 +401,6 @@ static av_cold int init(AVCodecContext *avctx)
{ {
uint8_t *dummy_p; uint8_t *dummy_p;
int dummy_int; int dummy_int;
AVBitStreamFilterContext *bsfc;
uint32_t orig_data_size = avctx->extradata_size; uint32_t orig_data_size = avctx->extradata_size;
uint8_t *orig_data = av_malloc(orig_data_size); uint8_t *orig_data = av_malloc(orig_data_size);
...@@ -409,16 +412,15 @@ static av_cold int init(AVCodecContext *avctx) ...@@ -409,16 +412,15 @@ static av_cold int init(AVCodecContext *avctx)
memcpy(orig_data, avctx->extradata, orig_data_size); memcpy(orig_data, avctx->extradata, orig_data_size);
bsfc = av_bitstream_filter_init("h264_mp4toannexb"); priv->bsfc = av_bitstream_filter_init("h264_mp4toannexb");
if (!bsfc) { if (!priv->bsfc) {
av_log(avctx, AV_LOG_ERROR, av_log(avctx, AV_LOG_ERROR,
"Cannot open the h264_mp4toannexb BSF!\n"); "Cannot open the h264_mp4toannexb BSF!\n");
av_free(orig_data); av_free(orig_data);
return AVERROR_BSF_NOT_FOUND; return AVERROR_BSF_NOT_FOUND;
} }
av_bitstream_filter_filter(bsfc, avctx, NULL, &dummy_p, av_bitstream_filter_filter(priv->bsfc, avctx, NULL, &dummy_p,
&dummy_int, NULL, 0, 0); &dummy_int, NULL, 0, 0);
av_bitstream_filter_close(bsfc);
priv->sps_pps_buf = avctx->extradata; priv->sps_pps_buf = avctx->extradata;
priv->sps_pps_size = avctx->extradata_size; priv->sps_pps_size = avctx->extradata_size;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment