<div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial">At 2017-01-05 18:02:58, "yoann" <yoann@woozoom.net> wrote:<br> <blockquote id="isReplyContent" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">Hi everyone,<br><br>I am trying to use FFmpeg's mediacodec wrappers on Android to speed up some h264 decoding.<br><br>First if someone has a good exemple of how to use ffmpeg + mediacodec natively I would be pleased to see it !<br><br>I have compiled ffmpeg using --enable-decoder=h264_mediacodec --enable-mediacodec --enable-hwaccel=h264_mediacodec and I have trouble using the mediacodec decoder. I detect the h264_mediacodec but cannot open it (return is -542398533, not very explicit). Do I have to set the codec context in some special manner to use HW acceleration ? Also h264 and h264_mediacodec seems to have the same id, how would the decoder know which one to use ? <br><br>Regards,<br>Yoann<br><span style="line-height: 1.7;"></span></blockquote><div><span style="line-height: 23.8px;"><br></span></div><div><span style="line-height: 23.8px;">I looked deeper into libavcodec/mediacodec.c public API and without using av_mediacodec_default_init(AVCodecContext *avctx, AVMediaCodecContext *ctx, void *surface) the field AVCodecContext->hwaccel_context is not set. Also this function makes mandatory to provide an android/view/Surface as surface that will be used as an output for the decoder. Then calling av_mediacodec_release_buffer() would bring the decoded data to the android/view/Surface.</span></div><br><span style="line-height: 23.8px;">But actually I use SDL to do all the screen rendering work (and I need to keep SDL for that), so I just want to get the decoded raw data as an AVFrame after the HW decoding, and have not interest for that android Surface.</span><br><br><span style="line-height: 23.8px;">Passing an allocated zeroed AVMediaCodecContext structure as hwaccel_context does not work, I still cannot open my h264_mediacodec decoder. If I provide an unused android/view/Surface to that function, will it be possible to later retrieve an AVFrame as an output of avcodec_receive_frame() using HW decoding ?</span><br><br><div><span style="line-height: 23.8px;">Also the documentation tells that the field AVCodecContext->hwaccel is set by libavcodec, but when ? Does it needs to be set before opening the codec ?</span></div><div><span style="line-height: 23.8px;"><br></span></div><div><span style="line-height: 23.8px;"><br></span></div><blockquote style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid"><div style="line-height: 23.8px;"><br></div>int open_stream_component(VideoState *vs, int stream_index){<br><br>    AVFormatContext *format_context = vs->format_context;<br>    AVCodecParameters *codec_parameters = NULL;<br>    AVCodecContext *codec_context = NULL;<br>    AVCodec *codec = NULL;<br>    AVDictionary *options_dict = NULL;<br>    SDL_AudioSpec wanted_spec, spec;<br><br>    codec_parameters = format_context->streams[stream_index]->codecpar;<br><br>    AVCodec * cdc = av_codec_next(NULL);<br>    while(cdc != NULL){<br>        SDL_Log("%s\n", cdc->long_name);<br>        cdc = av_codec_next(cdc);<br>    }<br><br>    if(codec_parameters->codec_type == AVMEDIA_TYPE_VIDEO){<br>      codec = avcodec_find_decoder_by_name("h264_mediacodec");<br>    } else if(codec_parameters->codec_type == AVMEDIA_TYPE_AUDIO){<br>      codec = avcodec_find_decoder_by_name("aac");<br>    }<br><br>     SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Codec is %s \n",codec->long_name);<br><br>    codec_context = avcodec_alloc_context3(codec);<br>    avcodec_parameters_to_context(codec_context, codec_parameters);<br>    codec_context->codec_id = codec->id;<br><br>    // Error here<br>    int ret = 0;<br>    if((ret = avcodec_open2(codec_context, codec, &options_dict)) < 0) {<br>        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Can't open codec, ret = %d", ret);<br>        return -1;<br>    }<br>    <br>    /* end of code */ <br>}<br>    <br>Corresponding Logcat  :<br>01-05 17:30:04.350: W/SDL/APP(12633): Main thread tid : 12659<br>01-05 17:30:04.470: V/SDL(12633): onWindowFocusChanged(): true<br>01-05 17:30:15.610: I/SDL/APP(12633):  ===== Setting input file ===== <br>01-05 17:30:15.610: I/SDL/APP(12633): In set_in_path : in_filepath = /storage/emulated/0/Movies/test.mp4<br>01-05 17:30:15.610: I/SDL/APP(12633):  ===== Start ===== <br>01-05 17:30:15.610: W/SDL/APP(12633): demux_thread tid : 13218<br>01-05 17:30:15.700: I/SDL/APP(12633): Network stream open and header read<br>01-05 17:30:15.800: I/SDL/APP(12633): H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10<br>01-05 17:30:15.800: I/SDL/APP(12633): H.264 Android MediaCodec decoder<br>01-05 17:30:15.800: I/SDL/APP(12633): MJPEG (Motion JPEG)<br>01-05 17:30:15.800: I/SDL/APP(12633): AAC (Advanced Audio Coding)<br>01-05 17:30:15.800: I/SDL/APP(12633): MP3 (MPEG audio layer 3)<br>01-05 17:30:15.800: I/SDL/APP(12633): Codec is H.264 Android MediaCodec decoder <br>01-05 17:30:15.800: E/SDL/APP(12633): Can't open codec, ret = -542398533<br>01-05 17:30:15.810: I/SDL/APP(12633):  ===== Stop ===== <br><div><br><br></div></blockquote></div>