<div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div>   Dear FFMEG:       </div><div>    I use ffmpeg in android JNI, I need use mediacodec to decode some H264 stream, first (the DecodeMp4TestV2 function)I do a test to decode some video files like mkv. It works fine and I decode it successfully.</div><div> But  I need to decode some raw H264  stream rather then a video file or RTSP stream. It is a raw H264 stream with private header. So I can not use the avformat_open_input and  avformat_find_stream_info to get the AVCodecContext  parameters. So when I call avcodec_open2, I get error -1 . I know it is because I don't set the AVCodecContext  parameters. But on win32, when I use dxva2, I don't need to set the AVCodecContext  parameters, it just work fine.</div><div>But on android I need to set the AVCodecContext  parameters, So which AVCodecContext  parameters do I need to fill? It has so many parameters . So if you have an answer ,please let me know. Looking forward to your repliesŁĄ</div><div><br></div><div>   </div><div>Successful Demo of decoding video files:                                                                                                                                                                                                                                                                                              Best wishes!</div><div>int DecodeMp4TestV2()</div><div>{</div><div><div>                 AVCodec *m_lpCodec  = NULL;</div><div>                AVCodecContext *m_lpCodecCtx = NULL;</div><div>                AVFrame *m_lpFrame = NULL;</div><div>                AVFrame *m_lpSwFrame = NULL;</div><div>                AVBufferRef *m_lpHWDeviceCtx = NULL;</div><div>                AVPixelFormat m_nPixFormat = AV_PIX_FMT_NONE;</div><div>                AVFormatContext * pFormatCtx = NULL ;</div><div>                int videoStream = -1;</div><div>                int audioStream = -1;</div></div><div><span style="white-space:pre">                </span>int nRet = 0 ;</div><div><span style="white-space:pre">                </span>int  i = 0;</div><div><span style="white-space:pre">              </span>int nType = eHWDeviceTypeMediaCodec;</div><div><span style="white-space:pre">          </span>int nStreamType = eStreamH264 ;</div><div><span style="white-space:pre">               </span>//char c_filename[256] = {0};</div><div><span style="white-space:pre">         </span>AVPacket struAvpkt;</div><div><span style="white-space:pre">           </span></div><div><span style="white-space:pre">              </span>//sprintf(c_filename, "%s", "/sdcard/1111.mp4");</div><div><span style="white-space:pre">          </span></div><div><span style="white-space:pre">              </span>const char *c_filename = "/sdcard/test1080.mkv" ;</div><div><span style="white-space:pre">           </span></div><div><span style="white-space:pre">              </span>av_register_all( ) ;</div><div><span style="white-space:pre">                  </span></div><div><span style="white-space:pre">              </span>avcodec_register_all( ) ;</div><div><span style="white-space:pre">                     </span></div><div><span style="white-space:pre">              </span>pFormatCtx = avformat_alloc_context();</div><div><span style="white-space:pre">                </span></div><div><span style="white-space:pre">              </span>if(pFormatCtx == NULL)</div><div><span style="white-space:pre">                </span>{</div><div><span style="white-space:pre">                     </span>LOGI("avformat_alloc_context error");</div><div><span style="white-space:pre">                       </span>return 1 ;</div><div><span style="white-space:pre">            </span>}</div><div><span style="white-space:pre">             </span></div><div><span style="white-space:pre">              </span>if((nRet = avformat_open_input(&pFormatCtx, c_filename, NULL, NULL)) < 0)</div><div><span style="white-space:pre">              </span>{</div><div><span style="white-space:pre">                     </span>LOGI("Cannot open the file %s, err: %d",c_filename,  nRet);</div><div><span style="white-space:pre">                    </span>return -1;</div><div><span style="white-space:pre">            </span>}</div><div><span style="white-space:pre">             </span></div><div><span style="white-space:pre">              </span>if((nRet = avformat_find_stream_info(pFormatCtx, NULL))<0)</div><div><span style="white-space:pre">         </span>{</div><div><span style="white-space:pre">             </span>    LOGI("Couldn't find stream information. err:%d", nRet);</div><div><span style="white-space:pre">               </span>    return -1;</div><div><span style="white-space:pre">              </span>}<span style="white-space:pre">    </span></div><div><span style="white-space:pre">              </span></div><div><span style="white-space:pre">              </span>av_dump_format(pFormatCtx, 0, c_filename, 0) ;</div><div><span style="white-space:pre">                </span></div><div><span style="white-space:pre">              </span>for (i = 0; i < pFormatCtx->nb_streams; i++) </div><div><span style="white-space:pre">              </span>{</div><div><span style="white-space:pre">                     </span>if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO && videoStream < 0)</div><div><span style="white-space:pre">                   </span>{</div><div><span style="white-space:pre">                             </span>videoStream = i;</div><div><span style="white-space:pre">                      </span>}</div><div><span style="white-space:pre">                     </span>else if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO)</div><div><span style="white-space:pre">                    </span>{</div><div><span style="white-space:pre">                             </span>audioStream = i;</div><div><span style="white-space:pre">                      </span>}</div><div><span style="white-space:pre">             </span>}</div><div><span style="white-space:pre">             </span></div><div><span style="white-space:pre">              </span>if(videoStream == -1)</div><div><span style="white-space:pre">         </span>{</div><div><span style="white-space:pre">                     </span>LOGE("Didn't find a video stream.");</div><div><span style="white-space:pre">                        </span>return -1; // Didn't find a video stream</div><div><span style="white-space:pre">              </span>}</div><div><span style="white-space:pre">             </span></div><div><span style="white-space:pre">              </span>// Get a pointer to the codec context for the video stream</div><div><span style="white-space:pre">    </span>      m_lpCodecCtx = pFormatCtx->streams[videoStream]->codec;</div><div><span style="white-space:pre">            </span>  </div><div><span style="white-space:pre">          </span>LOGI("avcodec_register_all succ");</div><div><span style="white-space:pre">          </span></div><div><span style="white-space:pre">                      </span></div><div><span style="white-space:pre">              </span>if(nType == eHWDeviceTypeMediaCodec)</div><div><span style="white-space:pre">          </span>{</div><div><span style="white-space:pre">                     </span>LOGI("avcodec_find_decoder_by_name start");</div><div><span style="white-space:pre">                 </span>if (nStreamType == eStreamH264)</div><div><span style="white-space:pre">                       </span>{</div><div><span style="white-space:pre">                             </span>LOGI("avcodec_find_decoder_by_name h264_mediacodec");</div><div><span style="white-space:pre">                               </span>m_lpCodec = avcodec_find_decoder_by_name("h264_mediacodec"); //android h264 hw decode</div><div><span style="white-space:pre">                       </span>}</div><div><span style="white-space:pre">                     </span>else if (nStreamType == eStreamHEVC)</div><div><span style="white-space:pre">                  </span>{</div><div><span style="white-space:pre">                             </span>LOGI("avcodec_find_decoder_by_name hevc_mediacodec");</div><div><span style="white-space:pre">                               </span>m_lpCodec = avcodec_find_decoder_by_name("hevc_mediacodec"); //android h265 hw decode</div><div><span style="white-space:pre">                       </span>}</div><div><span style="white-space:pre">                     </span>else if (nStreamType == eStreamMP4)</div><div><span style="white-space:pre">                   </span>{</div><div><span style="white-space:pre">                             </span>LOGI("avcodec_find_decoder_by_name mpeg4_mediacodec");</div><div><span style="white-space:pre">                              </span>m_lpCodec = avcodec_find_decoder_by_name("mpeg4_mediacodec"); //android mp4 hw decode</div><div><span style="white-space:pre">                       </span>}</div><div><span style="white-space:pre">                     </span>else</div><div><span style="white-space:pre">                  </span>{</div><div><span style="white-space:pre">                             </span>return 1 ;</div><div><span style="white-space:pre">                    </span>}</div><div><span style="white-space:pre">                     </span></div><div><span style="white-space:pre">                      </span>LOGI("avcodec_find_decoder_by_name end");</div><div><span style="white-space:pre">           </span>}</div><div><span style="white-space:pre">             </span></div><div><span style="white-space:pre">              </span>if (m_lpCodec == NULL)</div><div><span style="white-space:pre">                </span>{</div><div><span style="white-space:pre">                     </span>LOGI("avcodec_find_decoder_by_name error");</div><div><span style="white-space:pre">                 </span>return 1;</div><div><span style="white-space:pre">             </span>}</div><div><span style="white-space:pre">             </span></div><div><span style="white-space:pre">              </span>nRet = avcodec_open2(m_lpCodecCtx, m_lpCodec, NULL) ;</div><div><span style="white-space:pre">         </span></div><div><span style="white-space:pre">              </span>if(nRet != 0)</div><div><span style="white-space:pre">         </span>{</div><div><span style="white-space:pre">                     </span>LOGI("avcodec_open2 hw decoder error nRet[%d] height[%d] width[%d] fmt[%d]", nRet, m_lpCodecCtx->height, m_lpCodecCtx->width, m_lpCodecCtx->pix_fmt);</div><div><span style="white-space:pre">                      </span></div><div><span style="white-space:pre">                      </span>return 1 ;</div><div><span style="white-space:pre">            </span>}</div><div><span style="white-space:pre">             </span></div><div><span style="white-space:pre">              </span>LOGI("avcodec_open2 hw succ nRet[%d]", nRet);</div><div><span style="white-space:pre">               </span></div><div><span style="white-space:pre">              </span>m_lpFrame = av_frame_alloc( ) ;</div><div><span style="white-space:pre">               </span></div><div><span style="white-space:pre">              </span>if (m_lpFrame == NULL)</div><div><span style="white-space:pre">                </span>{</div><div><span style="white-space:pre">                     </span>return 1;</div><div><span style="white-space:pre">             </span>}</div><div><span style="white-space:pre">             </span></div><div><span style="white-space:pre">              </span>LOGI("av_frame_alloc succ m_lpFrame[%x]", m_lpFrame);</div><div><br></div><div><span style="white-space:pre">              </span>while(av_read_frame(pFormatCtx, &struAvpkt)>=0)</div><div><span style="white-space:pre">                </span>{</div><div><span style="white-space:pre">                     </span>if(struAvpkt.stream_index==videoStream)</div><div><span style="white-space:pre">                       </span>{</div><div><span style="white-space:pre">                                     </span>nRet = avcodec_send_packet(m_lpCodecCtx, &struAvpkt) ;</div><div><span style="white-space:pre">                    </span><span style="white-space: pre;">                   </span></div><div><span style="white-space:pre">                                      </span>if(nRet != 0)</div><div><span style="white-space:pre">                                 </span>{</div><div><span style="white-space:pre">                                             </span>LOGI("avcodec_send_packet error") ;</div><div><span style="white-space:pre">                                         </span></div><div><span style="white-space:pre">                                              </span>return 1 ;</div><div><span style="white-space:pre">                                    </span>}</div><div><span style="white-space:pre">                             </span></div><div><span style="white-space:pre">                                      </span>nRet = avcodec_receive_frame(m_lpCodecCtx, m_lpFrame) ; //0: m_lpFrame is correct;  1: m_lpFrame is corrupted; 2:no frame could be decompressed;3:need more</div><div><span style="white-space:pre">                              </span></div><div><span style="white-space:pre">                                      </span>LOGI("avcodec_receive_frame  nRet[%d] height[%d] width[%d] fmt[%d]",  nRet, m_lpFrame->height, m_lpFrame->width, m_lpFrame->format) ;</div><div><span style="white-space:pre">                            </span></div><div><span style="white-space:pre">                                      </span>if (nRet == 0)</div><div><span style="white-space:pre">                                        </span>{</div><div><span style="white-space:pre">                                             </span>LOGI("avcodec_receive_frame succ") ;</div><div><span style="white-space:pre">                                        </span>}</div><div><span style="white-space:pre">                                     </span>else</div><div><span style="white-space:pre">                                  </span>{</div><div><span style="white-space:pre">                                             </span>LOGI("avcodec_receive_frame error") ;</div><div><span style="white-space:pre">                                       </span>}</div><div><span style="white-space:pre">                     </span>}</div><div><span style="white-space:pre">                     </span></div><div><span style="white-space:pre">                      </span>Sleep(10) ;</div><div><span style="white-space:pre">           </span></div><div><span style="white-space:pre">              </span>}</div><div><br></div><div><span style="white-space:pre">    </span>return 0;   </div><div>}</div><div><br></div><div><br></div><div><span style="color: rgb(255, 0, 0);">failed demo of decoding raw H264 streams:</span></div><div><div>int InitDecode(eStreamType nStreamType, eHWDeviceType nType, MP4_CODEC_INIT_PARAM *lpInitParam)</div><div>{</div><div><span style="white-space:pre">   </span>int nRet = 0 ;</div><div><span style="white-space:pre">        </span>AVCodecID eCodeId = AV_CODEC_ID_NONE ;</div><div><span style="white-space:pre">        </span>enum AVHWDeviceType eHWType =AV_HWDEVICE_TYPE_NONE ;</div></div>         AVCodec *m_lpCodec  = NULL;<br>        AVCodecContext *m_lpCodecCtx = NULL;<br>        AVFrame *m_lpFrame = NULL;<br>         AVFrame *m_lpSwFrame = NULL;<br>         AVBufferRef *m_lpHWDeviceCtx = NULL;<br><div><div><div>         AVPixelFormat m_nPixFormat = AV_PIX_FMT_NONE;</div></div></div><div><div><br></div><div><span style="white-space:pre">        </span>av_register_all( ) ;</div><div><span style="white-space:pre">  </span></div><div><span style="white-space:pre">      </span>avcodec_register_all( ) ;</div><div><span style="white-space:pre">     </span></div><div><span style="white-space:pre">      </span>LOGI("avcodec_register_all succ");</div><div><span style="white-space:pre">          </span></div><div><span style="white-space:pre">      </span>if(nType == eHWDeviceTypeMediaCodec)</div><div><span style="white-space:pre">  </span>{</div><div><span style="white-space:pre">             </span>LOGI("avcodec_find_decoder_by_name start");</div><div><span style="white-space:pre">         </span>if (nStreamType == eStreamH264)</div><div><span style="white-space:pre">               </span>{</div><div><span style="white-space:pre">                     </span>LOGI("avcodec_find_decoder_by_name h264_mediacodec");</div><div><span style="white-space:pre">                       </span>m_lpCodec = avcodec_find_decoder_by_name("h264_mediacodec"); //android h264 hw decode</div><div><span style="white-space:pre">               </span>}</div><div><span style="white-space:pre">             </span>else if (nStreamType == eStreamHEVC)</div><div><span style="white-space:pre">          </span>{</div><div><span style="white-space:pre">                     </span>LOGI("avcodec_find_decoder_by_name hevc_mediacodec");</div><div><span style="white-space:pre">                       </span>m_lpCodec = avcodec_find_decoder_by_name("hevc_mediacodec"); //android h265 hw decode</div><div><span style="white-space:pre">               </span>}</div><div><span style="white-space:pre">             </span>else if (nStreamType == eStreamMP4)</div><div><span style="white-space:pre">           </span>{</div><div><span style="white-space:pre">                     </span>LOGI("avcodec_find_decoder_by_name mpeg4_mediacodec");</div><div><span style="white-space:pre">                      </span>m_lpCodec = avcodec_find_decoder_by_name("mpeg4_mediacodec"); //android mp4 hw decode</div><div><span style="white-space:pre">               </span>}</div><div><span style="white-space:pre">             </span>else</div><div><span style="white-space:pre">          </span>{</div><div><span style="white-space:pre">                     </span>return 1 ;</div><div><span style="white-space:pre">            </span>}</div><div><span style="white-space:pre">             </span></div><div><span style="white-space:pre">              </span>LOGI("avcodec_find_decoder_by_name end");</div><div><span style="white-space:pre">   </span>}</div><div><span style="white-space:pre">     </span>else</div><div><span style="white-space:pre">  </span>{</div><div><span style="white-space:pre">             </span>return 1 ;</div><div><span style="white-space:pre">    </span>}</div><div><br></div><div><span style="white-space:pre">    </span>if (m_lpCodec == NULL)</div><div><span style="white-space:pre">        </span>{</div><div><span style="white-space:pre">             </span>LOGI("avcodec_find_decoder_by_name error");</div><div><span style="white-space:pre">         </span>return 1;</div><div><span style="white-space:pre">     </span>}</div><div><br></div><div><span style="white-space:pre">    </span>m_lpCodecCtx = avcodec_alloc_context3(NULL);</div><div><span style="white-space:pre">  </span>//m_lpCodecCtx = avcodec_alloc_context3(m_lpCodec);  //<span style="color: rgb(255, 0, 0); font-size: 24px;">both avcodec_alloc_context3 way  I tried, not work</span></div><div><span style="white-space:pre">        </span>if (m_lpCodecCtx == NULL)</div><div><span style="white-space:pre">     </span>{</div><div><span style="white-space:pre">             </span>LOGI("avcodec_alloc_context3 NULL error");</div><div><span style="white-space:pre">          </span></div><div><span style="white-space:pre">              </span>return 1;</div><div><span style="white-space:pre">     </span>}</div><div><br></div><div><span style="white-space:pre">    </span> //AVMediaCodecContext *mediacodec_ctx = NULL;</div><div><span style="white-space:pre">        </span> //mediacodec_ctx = av_mediacodec_alloc_context();</div><div><span style="white-space:pre">    </span> //av_mediacodec_default_init(m_lpCodecCtx, mediacodec_ctx, NULL) ;</div><div><span style="white-space:pre">   </span> //m_lpCodecCtx->thread_count = 1;</div><div><span style="white-space:pre"> </span>//m_lpCodecCtx->opaque = (void*)this ;</div><div><span style="white-space:pre">     </span>//m_lpCodecCtx->height= lpInitParam->uMediaInfo.struVideoInfo.dwHeight;</div><div><span style="white-space:pre"> </span>//m_lpCodecCtx->width= lpInitParam->uMediaInfo.struVideoInfo.dwWidth;</div><div><span style="white-space:pre">   </span> //m_lpCodecCtx->pix_fmt = AV_PIX_FMT_NV12;    // <span style="color: rgb(255, 0, 0); font-size: 24px;">So which parameters do I need to set to ensure I can call avcodec_open2 successfully?</span></div><div><span style="white-space:pre">  </span></div><div><span style="white-space:pre">      </span>m_lpCodecCtx->get_format = GetHWFormat ;</div><div><span style="white-space:pre">   </span><span style="white-space: pre;">           </span></div><div><span style="white-space:pre">      </span>LOGI("avcodec_alloc_context3 NULL succ and set para");</div><div><br></div><div><span style="white-space:pre">     </span>nRet = avcodec_open2(m_lpCodecCtx, m_lpCodec, NULL) ;</div><div><span style="white-space:pre"> </span></div><div><span style="white-space:pre">      </span>if(nRet != 0)</div><div><span style="white-space:pre"> </span>{</div><div><span style="white-space:pre">             </span>LOGI("avcodec_open2 hw decoder error nRet[%d] height[%d] width[%d] fmt[%d]", nRet, m_lpCodecCtx->height, m_lpCodecCtx->width, m_lpCodecCtx->pix_fmt);</div><div><span style="white-space:pre">              </span></div><div><span style="white-space:pre">              </span>return 1 ;</div><div><span style="white-space:pre">    </span>}</div><div><span style="white-space:pre">     </span></div><div><span style="white-space:pre">      </span>LOGI("avcodec_open2 hw succ nRet[%d]", nRet);</div><div><span style="white-space:pre">       </span></div><div><span style="white-space:pre">      </span>m_lpFrame = av_frame_alloc( ) ;</div><div><br></div><div><span style="white-space:pre">      </span>if (m_lpFrame == NULL)</div><div><span style="white-space:pre">        </span>{</div><div><span style="white-space:pre">             </span>return 1;</div><div><span style="white-space:pre">     </span>}</div><div><br></div><div><span style="white-space:pre">    </span>LOGI("av_frame_alloc succ m_lpFrame[%x]", m_lpFrame);</div><div><span style="white-space:pre">       </span>m_lpSwFrame = av_frame_alloc( ) ;</div><div><br></div><div><span style="white-space:pre">    </span>if (m_lpSwFrame == NULL)</div><div><span style="white-space:pre">      </span>{</div><div><span style="white-space:pre">             </span>return 1;</div><div><span style="white-space:pre">     </span>}</div><div><span style="white-space:pre">     </span>LOGI("av_frame_alloc succ m_lpSwFrame[%x]", m_lpSwFrame);</div><div><span style="white-space:pre">   </span>return 0;</div><div>}</div></div></div><br><br><span title="neteasefooter"><p> </p></span>