For all I know calling avcodec_find_decoder with hardcoded codec id is not a good idea. What if particular stream contains data which was encoded with a different codec? av_open_input_file is the one I would expect to block under certain conditions (bad URLProtocol implementation, for example), not avcodec_open. Have you built FFmpeg yourself?
On 6 фев, 14:24, cervello <eceooz...@gmail.com> wrote: > thank you very much... > > I did it just like below and it works..but I can't tell that it's > completely true right now because I still continue to control my > code.. > but thanks again > > // Find the decoder for the video stream > pCodec=avcodec_find_decoder(CODEC_ID_H263); > > if(pCodec==NULL) { > fprintf(stderr, "Unsupported codec!\n"); > return -1; // Codec not found > } > pCodecCtx = avcodec_alloc_context(); > // Open codec > if(avcodec_open(pCodecCtx, pCodec)<0) > return -1; // Could not open codec > > On Feb 5, 9:15 pm, emymrin <emym...@gmail.com> wrote: > > > > > > > > > Try to instrument avcodec_open and anything that it calls with > > __android_log_print to get an idea about what is wrong. > > > On 5 фев, 19:03, cervello <eceooz...@gmail.com> wrote: > > > > I'm trying to decode a video but in my code I think there is a problem > > > about avcodec_find decoder().. I control it with log_message and on > > > logcat there is "here1" but there isn't "here2" .. So I think there is > > > a problem with avcodec_find_decoder... > > > Can anyone any idea?? Please help me, Thanks > > > > And how can I describe pCodecCtx->codec_id.. With %d and %s It didn't > > > work. > > > > char info[40]; > > > sprintf(info,"i degeri = %d",pCodecCtx->codec_id); > > > log_message(info); > > > > *****Here is my code****** > > > > jint Java_com_test_Test_takePics(JNIEnv* env, jobject javaThis) { > > > int framecount; > > > log_message("Fonka girdi"); > > > //OPENING FILE********************************************** **** > > > AVFormatContext *pFormatCtx; > > > unsigned char r, g, b; > > > int i,j; > > > > char* filename = "/sdcard/do-beer-not-drugs.3gp"; > > > av_register_all(); > > > > // Open video file > > > if(av_open_input_file(&pFormatCtx, filename, NULL, 0, NULL)!=0) > > > return -1; // Couldn't open file > > > > // Retrieve stream information > > > if(av_find_stream_info(pFormatCtx)<0) > > > return -1; // Couldn't find stream information > > > > // Dump information about file onto standard error > > > dump_format(pFormatCtx, 0, filename, 0); > > > framecount = pFormatCtx->streams[0]->nb_frames; > > > hist = malloc(framecount*sizeof(int*)); > > > > for (j = 0; j < framecount; ++j) { > > > hist[j] = malloc(sizeof(int)*64); // this is because we use 64-bin > > > histogram} > > > > for (i = 0; i < framecount; i++) { > > > for (j = 0; j < 64; j++) { > > > hist[i][j] = 0; > > > > } > > > } > > > > AVCodecContext *pCodecCtx; > > > > // Find the first video stream > > > int videoStream; > > > videoStream=-1; > > > /*char info[40]; > > > sprintf(info,"i degeri = %d",pFormatCtx->nb_streams); > > > log_message(info);*/ > > > for(i=0; i<pFormatCtx->nb_streams; i++){ > > > if(pFormatCtx->streams[i]->codec->codec_type==CODEC_TYPE_VIDEO) { > > > videoStream=i; > > > break; > > > > }} > > > > if(videoStream==-1) > > > return -1; // Didn't find a video stream > > > > AVCodec *pCodec; > > > char info[40]; > > > sprintf(info,"i degeri = %d",pCodecCtx->codec_id); > > > log_message(info); > > > > // Find the decoder for the video stream > > > pCodec=avcodec_find_decoder(pCodecCtx->codec_id); > > > > if(pCodec==NULL) { > > > fprintf(stderr, "Unsupported codec!\n"); > > > return -1; // Codec not found} > > > > log_message("here1"); > > > // Open codec > > > if(avcodec_open(pCodecCtx, pCodec)<0) > > > return -1; // Could not open codec > > > log_message("here2"); > > > // Get a pointer to the codec context for the video stream > > > pCodecCtx=pFormatCtx->streams[videoStream]->codec; > > > > //STORING THE DATA********************************************** ** > > > > AVFrame *pFrame; > > > > // Allocate video frame > > > pFrame=avcodec_alloc_frame(); > > > > // Allocate an AVFrame structure > > > AVFrame *pFrameRGB; > > > pFrameRGB=avcodec_alloc_frame(); > > > > if(pFrameRGB==NULL) > > > return -1; > > > > uint8_t *buffer; > > > int numBytes; > > > // Determine required buffer size and allocate buffer > > > numBytes=avpicture_get_size(PIX_FMT_RGB24, pCodecCtx->width, > > > pCodecCtx->height); > > > buffer=(uint8_t *)av_malloc(numBytes*sizeof(uint8_t)); > > > > // Assign appropriate parts of buffer to image planes in pFrameRGB > > > // Note that pFrameRGB is an AVFrame, but AVFrame is a superset > > > // of AVPicture > > > avpicture_fill((AVPicture *)pFrameRGB, buffer, PIX_FMT_RGB24, > > > pCodecCtx->width, pCodecCtx->height); > > > > //READING DATA********************************************** ***** > > > > int frameFinished; > > > AVPacket packet; > > > > i=0; > > > while(av_read_frame(pFormatCtx, &packet)>=0) { > > > // Is this a packet from the video stream? > > > if(packet.stream_index==videoStream) { > > > // Decode video frame > > > avcodec_decode_video(pCodecCtx, pFrame, &frameFinished, > > > packet.data, packet.size); > > > > // Did we get a video frame? > > > if(frameFinished) { > > > static struct SwsContext *img_convert_ctx; > > > > // Convert the image into RGB format > > > if(img_convert_ctx == NULL) { > > > int w = pCodecCtx->width; > > > int h = pCodecCtx->height; > > > > img_convert_ctx = sws_getContext(w, h, > > > pCodecCtx->pix_fmt, > > > w, h, PIX_FMT_RGB24, SWS_BICUBIC, > > > NULL, NULL, NULL); > > > if(img_convert_ctx == NULL) { > > > fprintf(stderr, "Cannot initialize the conversion context!\n"); > > > exit(1);} > > > } > > > > int ret = sws_scale(img_convert_ctx, pFrame->data, pFrame- >linesize, > > > 0, pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize); > > > > for (j = 0; j < 3*pCodecCtx->height*pCodecCtx->width -3; j++) { > > > r = (unsigned char) pFrameRGB->data[0][j]; > > > g = (unsigned char) pFrameRGB->data[0][j+1]; > > > b = (unsigned char) pFrameRGB->data[0][j+2]; > > > > r = (unsigned char) ((r >> 2) & 0x30); > > > g = (unsigned char) ((g >> 4) & 0x0C); > > > b = (unsigned char) ((b >> 6) & 0x03); > > > > unsigned char h = (unsigned char)(r|g|b); > > > hist[i][h]++; > > > > } > > > > // Save the frame to sdcard > > > SaveFrame(pFrameRGB, pCodecCtx->width, pCodecCtx->height, ++i); > > > > } > > > } > > > > // Free the packet that was allocated by av_read_frame > > > av_free_packet(&packet); > > > > } > > > > // Free the RGB image > > > av_free(buffer); > > > av_free(pFrameRGB); > > > > // Free the YUV frame > > > av_free(pFrame); > > > > // Close the codec > > > avcodec_close(pCodecCtx); > > > > // Close the video file > > > av_close_input_file(pFormatCtx); > > > > int keyframecount; > > > framecount=i; > > > keyframecount = select_keyFrames(framecount); > > > encodeVideo(env,keyframecount); > > > return 0; > > > > } -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en