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