37
37
#include <libdirac_decoder/dirac_parser.h>
39
39
/** contains a single frame returned from Dirac */
40
typedef struct FfmpegDiracDecoderParams {
40
typedef struct DiracDecoderParams {
41
41
/** decoder handle */
42
42
dirac_decoder_t* p_decoder;
44
44
/** buffer to hold decoded frame */
45
45
unsigned char* p_out_frame_buf;
46
} FfmpegDiracDecoderParams;
50
50
* returns Libav chroma format
52
static enum PixelFormat GetFfmpegChromaFormat(dirac_chroma_t dirac_pix_fmt)
52
static enum PixelFormat get_chroma_format(dirac_chroma_t dirac_pix_fmt)
54
int num_formats = sizeof(ffmpeg_dirac_pixel_format_map) /
55
sizeof(ffmpeg_dirac_pixel_format_map[0]);
54
int num_formats = sizeof(dirac_pixel_format_map) /
55
sizeof(dirac_pixel_format_map[0]);
58
58
for (idx = 0; idx < num_formats; ++idx)
59
if (ffmpeg_dirac_pixel_format_map[idx].dirac_pix_fmt == dirac_pix_fmt)
60
return ffmpeg_dirac_pixel_format_map[idx].ff_pix_fmt;
59
if (dirac_pixel_format_map[idx].dirac_pix_fmt == dirac_pix_fmt)
60
return dirac_pixel_format_map[idx].ff_pix_fmt;
61
61
return PIX_FMT_NONE;
64
64
static av_cold int libdirac_decode_init(AVCodecContext *avccontext)
67
FfmpegDiracDecoderParams *p_dirac_params = avccontext->priv_data;
67
DiracDecoderParams *p_dirac_params = avccontext->priv_data;
68
68
p_dirac_params->p_decoder = dirac_decoder_init(avccontext->debug);
70
70
if (!p_dirac_params->p_decoder)
80
80
const uint8_t *buf = avpkt->data;
81
81
int buf_size = avpkt->size;
83
FfmpegDiracDecoderParams *p_dirac_params = avccontext->priv_data;
83
DiracDecoderParams *p_dirac_params = avccontext->priv_data;
84
84
AVPicture *picture = data;
117
117
avccontext->height = src_params->height;
118
118
avccontext->width = src_params->width;
120
avccontext->pix_fmt = GetFfmpegChromaFormat(src_params->chroma);
120
avccontext->pix_fmt = get_chroma_format(src_params->chroma);
121
121
if (avccontext->pix_fmt == PIX_FMT_NONE) {
122
122
av_log(avccontext, AV_LOG_ERROR,
123
123
"Dirac chroma format %d not supported currently\n",
175
175
static av_cold int libdirac_decode_close(AVCodecContext *avccontext)
177
FfmpegDiracDecoderParams *p_dirac_params = avccontext->priv_data;
177
DiracDecoderParams *p_dirac_params = avccontext->priv_data;
178
178
dirac_decoder_close(p_dirac_params->p_decoder);
180
180
av_freep(&p_dirac_params->p_out_frame_buf);
197
197
AVCodec ff_libdirac_decoder = {
201
sizeof(FfmpegDiracDecoderParams),
202
libdirac_decode_init,
204
libdirac_decode_close,
205
libdirac_decode_frame,
199
.type = AVMEDIA_TYPE_VIDEO,
200
.id = CODEC_ID_DIRAC,
201
.priv_data_size = sizeof(DiracDecoderParams),
202
.init = libdirac_decode_init,
203
.close = libdirac_decode_close,
204
.decode = libdirac_decode_frame,
205
.capabilities = CODEC_CAP_DELAY,
207
206
.flush = libdirac_flush,
208
207
.long_name = NULL_IF_CONFIG_SMALL("libdirac Dirac 2.2"),