9 #include <OMX_Broadcom.h> 12 #include <QMutexLocker> 15 #include "libavutil/pixdesc.h" 16 #include "libavcodec/avcodec.h" 17 #include "libavutil/imgutils.h" 29 #define LOC QString("DOMX:%1 ").arg(m_videc.Id()) 33 #define STR(s) _STR(s) 36 #define FRAMESETHDR(f,h) ((f)->priv[2] = reinterpret_cast<unsigned char* >(h)) 37 #define FRAMESETHDRNONE(f) ((f)->priv[2] = nullptr) 38 #define FRAME2HDR(f) ((OMX_BUFFERHEADERTYPE*)((f)->priv[2])) 39 #define FRAMESETREF(f,r) ((f)->priv[1] = reinterpret_cast<unsigned char* >(r)) 40 #define FRAMESETREFNONE(f) ((f)->priv[1] = nullptr) 41 #define FRAME2REF(f) ((AVBufferRef*)((f)->priv[1])) 42 #define HDR2FRAME(h) ((VideoFrame*)((h)->pAppPrivate)) 46 # define VIDEO_DECODE "" // Not implemented 48 # define VIDEO_DECODE "video_decode" 73 static inline OMX_TICKS
Pts2Ticks(AVStream *stream, int64_t pts)
75 if (pts == AV_NOPTS_VALUE)
79 (av_q2d(stream->time_base) * pts)* OMX_TICKS_PER_SECOND) );
82 static inline int64_t
Ticks2Pts(AVStream *stream, OMX_TICKS ticks)
85 av_q2d(stream->time_base)) / OMX_TICKS_PER_SECOND );
91 opts.decoders->append(s_name);
92 (*
opts.equiv_decoders)[s_name].append(
"nuppel");
93 (*
opts.equiv_decoders)[s_name].append(
"ffmpeg");
94 (*
opts.equiv_decoders)[s_name].append(
"dummy");
99 m_filter(nullptr), m_bStartTime(
false),
101 m_lock(QMutex::Recursive), m_bSettingsChanged(
false),
102 m_bSettingsHaveChanged(
false)
104 if (OMX_ErrorNone !=
m_videc.
Init(OMX_IndexParamVideoInit))
126 av_bitstream_filter_close(
m_filter);
137 AVCodecContext *avctx)
142 LOG(VB_PLAYBACK, LOG_DEBUG,
LOC + __func__ + QString(
143 "(decoder=%1 flags=%2) - begin").arg(decoder).arg(flags));
145 if (getenv(
"NO_OPENMAX"))
147 LOG(VB_PLAYBACK, LOG_NOTICE,
LOC +
"OpenMAX decoder disabled");
153 LOG(VB_GENERAL, LOG_ERR,
LOC +
"No video decoder");
159 LOG(VB_GENERAL, LOG_ERR,
LOC +
"No video decoder ports");
163 OMX_VIDEO_CODINGTYPE
type = OMX_VIDEO_CodingUnused;
164 switch (avctx->codec_id)
166 case AV_CODEC_ID_MPEG1VIDEO:
167 case AV_CODEC_ID_MPEG2VIDEO:
168 type = OMX_VIDEO_CodingMPEG2;
170 case AV_CODEC_ID_H263:
171 case AV_CODEC_ID_H263P:
172 case AV_CODEC_ID_H263I:
173 type = OMX_VIDEO_CodingH263;
175 case AV_CODEC_ID_RV10:
176 case AV_CODEC_ID_RV20:
177 case AV_CODEC_ID_RV30:
178 case AV_CODEC_ID_RV40:
179 type = OMX_VIDEO_CodingRV;
181 case AV_CODEC_ID_MJPEG:
182 case AV_CODEC_ID_MJPEGB:
183 type = OMX_VIDEO_CodingMJPEG;
185 case AV_CODEC_ID_MPEG4:
186 type = OMX_VIDEO_CodingMPEG4;
188 case AV_CODEC_ID_WMV1:
189 case AV_CODEC_ID_WMV2:
190 case AV_CODEC_ID_WMV3:
191 type = OMX_VIDEO_CodingWMV;
193 case AV_CODEC_ID_H264:
194 LOG(VB_PLAYBACK, LOG_DEBUG,
LOC + QString(
"Codec H264 %1")
196 type = OMX_VIDEO_CodingAVC;
198 #ifdef OMX_AUDIO_CodingTheora_Supported 199 case AV_CODEC_ID_THEORA:
200 type = OMX_VIDEO_CodingTheora;
203 #ifdef OMX_AUDIO_CodingVP6_Supported 204 case AV_CODEC_ID_VP3:
205 case AV_CODEC_ID_VP5:
206 case AV_CODEC_ID_VP6:
207 case AV_CODEC_ID_VP6F:
208 case AV_CODEC_ID_VP6A:
209 type = OMX_VIDEO_CodingVP6;
212 #ifdef OMX_AUDIO_CodingVP8_Supported 213 case AV_CODEC_ID_VP8:
214 type = OMX_VIDEO_CodingVP8;
217 #ifdef OMX_AUDIO_CodingVP9_Supported 218 case AV_CODEC_ID_VP9:
219 type = OMX_VIDEO_CodingVP9;
222 #ifdef OMX_AUDIO_CodingMVC_Supported 223 case AV_CODEC_ID_MVC1:
224 case AV_CODEC_ID_MVC2:
225 type = OMX_VIDEO_CodingMVC;
229 LOG(VB_PLAYBACK, LOG_ERR,
LOC + QString(
"Codec %1 not supported")
230 .arg(ff_codec_id_string(avctx->codec_id)));
235 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"Codec %1 => %2")
238 OMX_VIDEO_PARAM_PORTFORMATTYPE fmt;
241 fmt.eCompressionFormat =
type;
242 fmt.eColorFormat = OMX_COLOR_FormatUnused;
244 if (e != OMX_ErrorNone)
246 LOG(VB_PLAYBACK, LOG_ERR,
LOC + QString(
247 "Set input IndexParamVideoPortFormat error %1")
252 if (
type == OMX_VIDEO_CodingAVC)
256 if (avctx->extradata_size > 0 && avctx->extradata[0] == 1)
268 case OMX_COLOR_FormatYUV420Planar:
269 case OMX_COLOR_FormatYUV420PackedPlanar:
275 fmt.eCompressionFormat = OMX_VIDEO_CodingUnused;
276 fmt.eColorFormat = OMX_COLOR_FormatYUV420PackedPlanar;
278 if (e != OMX_ErrorNone)
280 LOG(VB_PLAYBACK, LOG_ERR,
LOC + QString(
281 "Set output IndexParamVideoPortFormat error %1")
287 avctx->pix_fmt = AV_PIX_FMT_YUV420P;
294 if (inputBuffers > 0U
295 && inputBuffers != indef.nBufferCountActual
296 && inputBuffers > indef.nBufferCountMin)
298 indef.nBufferCountActual = inputBuffers;
300 if (e != OMX_ErrorNone)
302 LOG(VB_PLAYBACK, LOG_ERR,
LOC + QString(
303 "Set input IndexParamPortDefinition error %1")
313 if (def.nBufferCountActual < 2U ||
314 def.nBufferCountActual < def.nBufferCountMin)
316 def.nBufferCountActual = std::max(OMX_U32(2), def.nBufferCountMin);
318 if (e != OMX_ErrorNone)
320 LOG(VB_PLAYBACK, LOG_ERR,
LOC + QString(
321 "Set output IndexParamPortDefinition error %1")
333 if (e != OMX_ErrorNone)
336 if (
type == OMX_VIDEO_CodingMPEG2)
337 LOG(VB_GENERAL, LOG_WARNING,
LOC +
338 "NB MPEG2 decoding requires a license file");
346 if (e != OMX_ErrorNone)
350 if (e != OMX_ErrorNone)
354 LOG(VB_PLAYBACK, LOG_DEBUG,
LOC + __func__ +
" - end");
361 #ifdef USING_BROADCOM 362 OMX_NALSTREAMFORMATTYPE fmt;
367 OMX_INDEXTYPE(OMX_IndexParamNalStreamFormatSupported), &fmt);
368 if (e != OMX_ErrorNone)
370 LOG(VB_PLAYBACK, LOG_ERR,
LOC + QString(
371 "Get ParamNalStreamFormatSupported error %1")
373 if (avctx->extradata_size == 0 || avctx->extradata[0] != 1)
374 return OMX_ErrorNone;
378 static bool s_bReported;
383 if (fmt.eNaluFormat & OMX_NaluFormatStartCodes)
384 list <<
"StartCodes (Annex B)";
385 if (fmt.eNaluFormat & OMX_NaluFormatOneNaluPerBuffer)
386 list <<
"OneNaluPerBuffer";
387 if (fmt.eNaluFormat & OMX_NaluFormatOneByteInterleaveLength)
388 list <<
"OneByteInterleaveLength";
389 if (fmt.eNaluFormat & OMX_NaluFormatTwoByteInterleaveLength)
390 list <<
"TwoByteInterleaveLength";
391 if (fmt.eNaluFormat & OMX_NaluFormatFourByteInterleaveLength)
392 list <<
"FourByteInterleaveLength";
393 LOG(VB_PLAYBACK, LOG_INFO,
LOC +
"NalStreamFormatSupported: " +
397 OMX_NALUFORMATSTYPE
type;
399 if (avctx->extradata_size >= 5 && avctx->extradata[0] == 1)
402 int n = 1 + (avctx->extradata[4] & 0x3);
406 type = OMX_NaluFormatOneByteInterleaveLength;
407 naluFormat =
"OneByteInterleaveLength";
410 type = OMX_NaluFormatTwoByteInterleaveLength;
411 naluFormat =
"TwoByteInterleaveLength";
414 type = OMX_NaluFormatFourByteInterleaveLength;
415 naluFormat =
"FourByteInterleaveLength";
418 return OMX_ErrorUnsupportedSetting;
423 type = OMX_NaluFormatStartCodes;
424 naluFormat =
"StartCodes";
427 fmt.eNaluFormat = OMX_NALUFORMATSTYPE(fmt.eNaluFormat &
type);
428 if (!fmt.eNaluFormat)
430 LOG(VB_PLAYBACK, LOG_INFO,
LOC +
"Unsupported NAL stream format " +
432 return OMX_ErrorUnsupportedSetting;
435 LOG(VB_PLAYBACK, LOG_DEBUG,
LOC +
"NAL stream format: " + naluFormat);
438 if (e != OMX_ErrorNone)
439 LOG(VB_PLAYBACK, LOG_ERR,
LOC + QString(
440 "Set ParamNalStreamFormatSelect(%1) error %2")
444 if (avctx->extradata_size == 0 || avctx->extradata[0] != 1)
445 return OMX_ErrorNone;
447 return OMX_ErrorUnsupportedSetting;
448 #endif //USING_BROADCOM 456 if (avctx->extradata_size < 5)
458 LOG(VB_PLAYBACK, LOG_ERR,
LOC +
"AVCC extradata_size too small");
462 int n = 1 + (avctx->extradata[4] & 0x3);
470 LOG(VB_PLAYBACK, LOG_ERR,
LOC + QString(
"Invalid NAL size (%1)")
478 m_filter = av_bitstream_filter_init(
"h264_mp4toannexb");
481 LOG(VB_PLAYBACK, LOG_ERR,
LOC +
482 "Failed to create h264_mp4toannexb filter");
486 LOG(VB_GENERAL, LOG_INFO,
LOC +
"Installed h264_mp4toannexb filter");
501 OMX_U32 uBufs = def.nBufferCountActual;
502 LOG(VB_PLAYBACK, LOG_DEBUG,
LOC + QString(
503 "Allocate %1 of %2 byte input buffer(s)")
504 .arg(uBufs).arg(def.nBufferSize));
507 OMX_BUFFERHEADERTYPE *hdr;
510 if (e != OMX_ErrorNone)
512 LOG(VB_PLAYBACK, LOG_ERR,
LOC + QString(
516 if (hdr->nSize !=
sizeof(OMX_BUFFERHEADERTYPE))
518 LOG(VB_PLAYBACK, LOG_ERR,
LOC +
"OMX_AllocateBuffer header mismatch");
520 return OMX_ErrorVersionMismatch;
524 LOG(VB_PLAYBACK, LOG_ERR,
LOC +
"OMX_AllocateBuffer version mismatch");
526 return OMX_ErrorVersionMismatch;
547 OMX_BUFFERHEADERTYPE *hdr =
m_obufs.takeFirst();
553 if (e != OMX_ErrorNone)
555 LOG(VB_PLAYBACK, LOG_ERR,
LOC + QString(
565 return OMX_ErrorNone;
577 OMX_BUFFERHEADERTYPE *hdr =
m_obufs.takeFirst();
589 av_buffer_unref(&ref);
594 if (e != OMX_ErrorNone)
595 LOG(VB_PLAYBACK, LOG_ERR,
LOC + QString(
596 "OMX_FreeBuffer 0x%1 error %2")
601 return OMX_ErrorNone;
612 const OMX_PARAM_PORTDEFINITIONTYPE *pdef = &
m_videc.
PortDef(index);
613 OMX_U32 uBufs = pdef->nBufferCountActual;
614 LOG(VB_PLAYBACK, LOG_DEBUG,
LOC + QString(
615 "Allocate %1 of %2 byte output buffer(s)")
616 .arg(uBufs).arg(pdef->nBufferSize));
619 OMX_BUFFERHEADERTYPE *hdr;
621 m_videc.
Base() + index,
nullptr, pdef->nBufferSize);
622 if (e != OMX_ErrorNone)
624 LOG(VB_PLAYBACK, LOG_ERR,
LOC + QString(
628 if (hdr->nSize !=
sizeof(OMX_BUFFERHEADERTYPE))
630 LOG(VB_PLAYBACK, LOG_ERR,
LOC +
"OMX_AllocateBuffer header mismatch");
632 return OMX_ErrorVersionMismatch;
636 LOG(VB_PLAYBACK, LOG_ERR,
LOC +
"OMX_AllocateBuffer version mismatch");
638 return OMX_ErrorVersionMismatch;
646 return OMX_ErrorNone;
659 OMX_U32 uBufs = def.nBufferCountActual;
661 LOG(VB_PLAYBACK, LOG_DEBUG,
LOC + QString(
662 "Use %1 of %2 byte output buffer(s)")
663 .arg(uBufs).arg(def.nBufferSize));
665 OMX_ERRORTYPE e = OMX_ErrorNone;
672 LOG(VB_PLAYBACK, LOG_ERR,
LOC + __func__ +
" no video frames");
673 return OMX_ErrorOverflow;
679 OMX_BUFFERHEADERTYPE *hdr;
681 def.nBufferSize, frame->
buf);
682 if (e != OMX_ErrorNone)
684 LOG(VB_PLAYBACK, LOG_ERR,
LOC + QString(
688 if (hdr->nSize !=
sizeof(OMX_BUFFERHEADERTYPE))
690 LOG(VB_PLAYBACK, LOG_ERR,
LOC +
"OMX_UseBuffer header mismatch");
692 return OMX_ErrorVersionMismatch;
696 LOG(VB_PLAYBACK, LOG_ERR,
LOC +
"OMX_UseBuffer version mismatch");
698 return OMX_ErrorVersionMismatch;
704 picture->buf[0] =
nullptr;
722 LOG(VB_PLAYBACK, LOG_DEBUG,
LOC + __func__ +
" - begin");
729 if (e != OMX_ErrorNone)
734 if (e != OMX_ErrorNone)
740 QMutexLocker lock(&
m_lock);
749 LOG(VB_PLAYBACK, LOG_DEBUG,
LOC + __func__ +
" - end");
757 int *got_picture_ptr,
771 *got_picture_ptr = 1;
778 *got_picture_ptr = 0;
783 QMutexLocker lock(&
m_lock);
787 *got_picture_ptr = 0;
801 uint8_t *buf = pkt->data, *free_buf =
nullptr;
802 int size = pkt->size;
810 uint8_t *outbuf =
nullptr;
811 int res = av_bitstream_filter_filter(
m_filter, avctx,
nullptr, &outbuf,
812 &outbuf_size, buf, size, 0);
817 LOG(VB_GENERAL, LOG_ERR,
LOC +
818 QString(
"Failed to convert packet (%1)").arg(res));
823 if (outbuf && outbuf_size > 0)
826 buf = free_buf = outbuf;
836 LOG(VB_GENERAL, LOG_ERR,
LOC + __func__ +
837 " Ran out of OMX input buffers, see OmxInputBuffers setting.");
843 LOG(VB_PLAYBACK, LOG_WARNING,
LOC + __func__ +
844 QString(
" Free OMX input buffers = %1, see OmxInputBuffers setting.")
848 OMX_BUFFERHEADERTYPE *hdr =
m_ibufs.takeFirst();
851 int free = int(hdr->nAllocLen) - int(hdr->nFilledLen + hdr->nOffset);
852 int cnt = (free > size) ? size : free;
853 memcpy(&hdr->pBuffer[hdr->nOffset + hdr->nFilledLen], buf, cnt);
854 hdr->nFilledLen += cnt;
859 hdr->nTimeStamp =
Pts2Ticks(stream, pkt->pts);
863 hdr->nFlags = OMX_BUFFERFLAG_STARTTIME;
868 LOG(VB_PLAYBACK | VB_TIMESTAMP, LOG_INFO,
LOC + QString(
869 "EmptyThisBuffer len=%1 tc=%2uS (pts %3)")
870 .arg(hdr->nFilledLen).arg(
TICKS_TO_S64(hdr->nTimeStamp))
873 OMX_ERRORTYPE e = OMX_EmptyThisBuffer(
m_videc.
Handle(), hdr);
874 if (e != OMX_ErrorNone)
876 LOG(VB_PLAYBACK, LOG_ERR,
LOC + QString(
908 OMX_BUFFERHEADERTYPE *hdr =
m_obufs.takeFirst();
911 OMX_U32 nFlags = hdr->nFlags;
912 if (nFlags & ~OMX_BUFFERFLAG_ENDOFFRAME)
913 LOG(VB_PLAYBACK, LOG_DEBUG,
LOC +
914 QString(
"Decoded frame flags=%1").arg(
HeaderFlags(nFlags)) );
916 if (avctx->pix_fmt < 0)
917 avctx->pix_fmt = AV_PIX_FMT_YUV420P;
920 if (hdr->nFilledLen == 0)
925 else if (avctx->get_buffer2(avctx, picture, 0) < 0)
927 LOG(VB_GENERAL, LOG_ERR,
LOC +
928 "Decoded frame available but no video buffers");
935 AVPixelFormat out_fmt = AV_PIX_FMT_YUV420P;
936 AVPixelFormat in_fmt = AV_PIX_FMT_NONE;
939 unsigned char *buf =
nullptr;
941 const OMX_VIDEO_PORTDEFINITIONTYPE &vdef =
m_videc.
PortDef(1).format.video;
942 switch (vdef.eColorFormat)
944 case OMX_COLOR_FormatYUV420Planar:
945 case OMX_COLOR_FormatYUV420PackedPlanar:
946 pitches[0] = vdef.nStride;
947 pitches[1] = pitches[2] = vdef.nStride >> 1;
949 offsets[1] = vdef.nStride * vdef.nSliceHeight;
950 offsets[2] = offsets[1] + (offsets[1] >> 2);
951 in_fmt = AV_PIX_FMT_YUV420P;
954 case OMX_COLOR_Format16bitRGB565:
955 LOG(VB_GENERAL, LOG_WARNING,
LOC + QString(
"Format %1 broken")
957 in_fmt = AV_PIX_FMT_RGB565LE;
958 out_fmt = AV_PIX_FMT_RGBA;
963 LOG(VB_GENERAL, LOG_ERR,
LOC + QString(
964 "Unsupported frame type: %1")
969 picture->reordered_opaque =
Ticks2Pts(stream, hdr->nTimeStamp);
976 frame->
codec = frametype;
977 frame->
width = vdef.nFrameWidth;
978 frame->
height = vdef.nFrameHeight;
983 OMX_BUFFERHEADERTYPE *hdr2 =
FRAME2HDR(frame2);
992 assert(
unsigned(frame2->
size) >= hdr->nAllocLen);
993 hdr->pBuffer = frame2->
buf;
994 hdr->pAppPrivate = frame2;
1004 picture->opaque = frame;
1006 else if (in_fmt == avctx->pix_fmt)
1009 init(&vf, frametype, &hdr->pBuffer[hdr->nOffset],
1010 vdef.nFrameWidth, vdef.nFrameHeight, hdr->nFilledLen,
1013 else if (in_fmt != AV_PIX_FMT_NONE)
1015 int in_width = vdef.nStride;
1016 int in_height = vdef.nSliceHeight;
1017 int out_width = (vdef.nFrameWidth + 15) & (~0xf);
1018 int out_height = vdef.nFrameHeight;
1019 int size = ((
bitsperpixel(frametype) * out_width) / 8) * out_height;
1020 uint8_t* src = &hdr->pBuffer[hdr->nOffset];
1023 init(&vf, frametype, buf, out_width, out_height, size);
1026 av_image_fill_arrays(img_out.data, img_out.linesize,
1027 vf.
buf, out_fmt, out_width,
1029 av_image_fill_arrays(img_in.data, img_in.linesize,
1032 LOG(VB_PLAYBACK, LOG_DEBUG,
LOC + QString(
"Converting %1 to %2")
1033 .arg(av_pix_fmt_desc_get(in_fmt)->
name)
1034 .arg(av_pix_fmt_desc_get(out_fmt)->
name) );
1035 m_copyCtx.
Copy(&img_out, out_fmt, &img_in, in_fmt, in_width, in_height);
1044 #ifdef OMX_BUFFERFLAG_INTERLACED 1045 if (nFlags & OMX_BUFFERFLAG_INTERLACED)
1046 picture->interlaced_frame = 1;
1049 picture->interlaced_frame = 0;
1050 #ifdef OMX_BUFFERFLAG_TOP_FIELD_FIRST 1051 if (nFlags & OMX_BUFFERFLAG_TOP_FIELD_FIRST)
1052 picture->top_field_first = 1;
1055 picture->top_field_first = 0;
1056 picture->repeat_pict = 0;
1068 hdr->nFilledLen = 0;
1069 OMX_ERRORTYPE e = OMX_FillThisBuffer(
m_videc.
Handle(), hdr);
1070 if (e != OMX_ErrorNone)
1071 LOG(VB_PLAYBACK, LOG_ERR,
LOC + QString(
1072 "OMX_FillThisBuffer reQ error %1").arg(
Error2String(e)) );
1080 QMutexLocker lock(&
m_lock);
1084 if (e != OMX_ErrorNone)
1086 LOG(VB_PLAYBACK, LOG_ERR,
LOC + QString(
"SettingsChanged error %1")
1092 return OMX_ErrorNone;
1096 LOG(VB_PLAYBACK, LOG_INFO,
LOC + __func__ +
" - begin");
1098 const int index = 1;
1103 if (e != OMX_ErrorNone)
1111 if (e != OMX_ErrorNone)
1119 OMX_VIDEO_PARAM_PORTFORMATTYPE fmt;
1122 fmt.eCompressionFormat = OMX_VIDEO_CodingUnused;
1123 fmt.eColorFormat = OMX_COLOR_FormatYUV420PackedPlanar;
1125 if (e != OMX_ErrorNone)
1126 LOG(VB_PLAYBACK, LOG_ERR,
LOC + QString(
1127 "SetParameter IndexParamVideoPortFormat error %1")
1130 #ifdef USING_BROADCOM 1133 OMX_CONFIG_POINTTYPE aspect;
1135 if (e == OMX_ErrorNone)
1136 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"Pixel aspect x/y = %1/%2")
1137 .arg(aspect.nX).arg(aspect.nY) );
1143 if ((
m_avctx = avctx) && avctx->get_buffer2)
1152 if (e != OMX_ErrorNone)
1157 if (e != OMX_ErrorNone)
1165 LOG(VB_PLAYBACK, LOG_INFO,
LOC + __func__ +
" - end");
1166 return OMX_ErrorNone;
1172 QMutexLocker lock(&
m_lock);
1176 #ifdef USING_BROADCOM 1178 OMX_CONFIG_POINTTYPE &point,
int index)
const 1184 if (e != OMX_ErrorNone)
1185 LOG(VB_PLAYBACK, LOG_ERR,
LOC + QString(
1186 "IndexParamBrcmPixelAspectRatio error %1").arg(
Error2String(e)));
1191 #ifdef USING_BROADCOM 1192 OMX_ERRORTYPE PrivateDecoderOMX::GetInterlace(
1193 OMX_CONFIG_INTERLACETYPE &interlace,
int index)
const 1197 OMX_ERRORTYPE e =
m_videc.
GetConfig(OMX_IndexConfigCommonInterlace, &interlace);
1198 if (e != OMX_ErrorNone)
1199 LOG(VB_PLAYBACK, LOG_ERR,
LOC + QString(
1200 "IndexConfigCommonInterlace error %1").arg(
Error2String(e)));
1203 #endif // USING_BROADCOM 1207 OMX_U32 nData1, OMX_U32 nData2, OMX_PTR pEventData)
1211 case OMX_EventPortSettingsChanged:
1222 LOG(VB_GENERAL, LOG_CRIT,
LOC +
1223 "EventPortSettingsChanged deadlock");
1225 return OMX_ErrorNone;
1238 assert(hdr->nSize ==
sizeof(OMX_BUFFERHEADERTYPE));
1240 hdr->nFilledLen = 0;
1241 if (
m_lock.tryLock(1000))
1248 LOG(VB_GENERAL, LOG_CRIT,
LOC +
"EmptyBufferDone deadlock");
1249 return OMX_ErrorNone;
1256 assert(hdr->nSize ==
sizeof(OMX_BUFFERHEADERTYPE));
1258 if (
m_lock.tryLock(1000))
1265 LOG(VB_GENERAL, LOG_CRIT,
LOC +
"FillBufferDone deadlock");
1266 return OMX_ErrorNone;
1280 OMX_BUFFERHEADERTYPE *hdr =
m_ibufs.takeFirst();
1284 if (e != OMX_ErrorNone)
1285 LOG(VB_PLAYBACK, LOG_ERR,
LOC + QString(
1286 "OMX_FreeBuffer 0x%1 error %2")
1291 #define CASE2STR(f) case f: return STR(f) 1292 #define CASE2STR_(f) case f: return #f 1303 CASE2STR_(FF_PROFILE_H264_HIGH_10_INTRA);
1305 CASE2STR_(FF_PROFILE_H264_HIGH_422_INTRA);
1306 CASE2STR_(FF_PROFILE_H264_HIGH_444_PREDICTIVE);
1307 CASE2STR_(FF_PROFILE_H264_HIGH_444_INTRA);
1310 static char buf[32];
1311 return strcpy(buf, qPrintable(QString(
"Profile 0x%1").arg(
profile)));
OMX_ERRORTYPE GetConfig(OMX_INDEXTYPE type, OMX_PTR p) const
int pitches[3]
Y, U, & V pitches.
int ProcessPacket(AVStream *, AVPacket *)
int Copy(VideoFrame *dst, const VideoFrame *src)
QList< OMX_BUFFERHEADERTYPE * > m_ibufs
bool Reset(void) override
bool CreateFilter(AVCodecContext *)
const OMX_PARAM_PORTDEFINITIONTYPE & PortDef(unsigned index=0) const
bool m_bSettingsHaveChanged
static int64_t Ticks2Pts(AVStream *stream, OMX_TICKS ticks)
static int bitsperpixel(VideoFrameType type)
OMX_ERRORTYPE Event(OMXComponent &, OMX_EVENTTYPE, OMX_U32, OMX_U32, OMX_PTR) override
OMXComponentCtx.
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
int GetFrame(AVStream *stream, AVFrame *picture, int *got_picture_ptr, AVPacket *pkt) override
OMX_ERRORTYPE EmptyBufferDone(OMXComponent &, OMX_BUFFERHEADERTYPE *) override
ComponentCB AllocBuffersCB
enum FrameType_ VideoFrameType
OMX_ERRORTYPE LastError()
long long copy(QFile &dst, QFile &src, uint block_size)
Copies src file to dst file.
OMX_ERRORTYPE SetNalType(AVCodecContext *)
void ShowPortDef(unsigned index=0, LogLevel_t=LOG_INFO, uint64_t=VB_PLAYBACK) const
bool Init(const QString &decoder, PlayerFlags flags, AVCodecContext *avctx) override
static void GetDecoders(render_opts &opts)
static void init(VideoFrame *vf, VideoFrameType _codec, unsigned char *_buf, int _width, int _height, int _size, const int *p=nullptr, const int *o=nullptr, float _aspect=-1.0f, double _rate=-1.0f, int _aligned=64)
int offsets[3]
Y, U, & V offsets.
OMX_ERRORTYPE PortEnable(unsigned index=0, int ms=-1, OMXComponentAbstractCB *cb=nullptr)
ComponentCB FreeOutputBuffersCB
MythCodecMap * gCodecMap
This global variable contains the MythCodecMap instance for the app.
OMX_ERRORTYPE Init(OMX_INDEXTYPE)
OMX_ERRORTYPE SetState(OMX_STATETYPE state, int ms=-1, OMXComponentAbstractCB *cb=nullptr)
static QString const s_name
#define VERBOSE_LEVEL_CHECK(_MASK_, _LEVEL_)
const char * Coding2String(OMX_VIDEO_CODINGTYPE eCompressionFormat)
ComponentCB AllocOutputBuffersCB
void ReleaseBuffers(OMXComponent &) override
OMX_ERRORTYPE GetParameter(OMX_INDEXTYPE type, OMX_PTR p) const
QString GetName(void) override
#define FRAMESETREF(f, r)
QList< OMX_BUFFERHEADERTYPE * > m_obufs
AVCodecContext * getCodecContext(const AVStream *, const AVCodec *pCodec=nullptr, bool nullCodec=false)
void * av_malloc(unsigned int size)
OMX_ERRORTYPE PortDisable(unsigned index=0, int ms=-1, OMXComponentAbstractCB *cb=nullptr)
#define FRAMESETHDRNONE(f)
static OMX_TICKS Pts2Ticks(AVStream *stream, int64_t pts)
virtual OMX_ERRORTYPE Event(OMXComponent &, OMX_EVENTTYPE, OMX_U32, OMX_U32, OMX_PTR)
OMXComponentCtx.
OMX_ERRORTYPE FillOutputBuffers()
int GetNumSetting(const QString &key, int defaultval=0)
#define LOG(_MASK_, _LEVEL_, _STRING_)
OMX_ERRORTYPE SetParameter(OMX_INDEXTYPE type, OMX_PTR p)
QString HeaderFlags(OMX_U32 nFlags)
virtual ~PrivateDecoderOMX()
OMX_ERRORTYPE FillBufferDone(OMXComponent &, OMX_BUFFERHEADERTYPE *) override
const char * Error2String(OMX_ERRORTYPE eError)
OMX_ERRORTYPE ComponentCB()
static const char * H264Profile2String(int profile)
#define FRAMESETREFNONE(f)
bool IsCommandComplete() const
bool HasBufferedFrames(void) override
MythAVFrame little utility class that act as a safe way to allocate an AVFrame which can then be allo...
OMX_ERRORTYPE SettingsChanged(AVCodecContext *)
AVBitStreamFilterContext * m_filter
OMX_ERRORTYPE GetAspect(OMX_CONFIG_POINTTYPE &, int index) const
OMX_ERRORTYPE GetPortDef(unsigned index=0)
OMX_ERRORTYPE SendCommand(OMX_COMMANDTYPE cmd, OMX_U32 nParam=0, void *pCmdData=nullptr, int ms=-1, OMXComponentAbstractCB *cb=nullptr)
int GetBufferedFrame(AVStream *, AVFrame *)
void ShowFormats(unsigned index=0, LogLevel_t=LOG_INFO, uint64_t=VB_PLAYBACK) const
#define FRAMESETHDR(f, h)
const char * Format2String(OMX_COLOR_FORMATTYPE eColorFormat)
OMX_HANDLETYPE Handle() const