static int audio_decode_frame(VideoState *is, uint8_t *audio_buf, double *pts_ptr)
{
AVPacket *pkt = &is->audio_pkt;
int n, len1, data_size;
double pts;
for(;;) {
/* NOTE: the audio packet can contain several frames */
while (is->audio_pkt_size > 0) {
len1 = avcodec_decode_audio(&is->audio_st->codec,
(int16_t *)audio_buf, &data_size,
is->audio_pkt_data, is->audio_pkt_size);
//is->audio_pkt_data는 오디오 데이터 포인터, is->audio_pkt_size는 데이터 사이즈
//417byte,
//... 이하생략//
}
--------------------------------------------------------------------
ffplay에서 디코드할 오디오 데이터를 libmad의 int mad_frame_decode(struct mad_frame *frame, struct mad_stream *stream)
로 보내는데 안되네요. 128kbs 일때 417byte씩 보내요.
그 전에 처리해야할 것은 다 했구요.[init()] 이래저래 하는데도 안되네요.(mplayer 에서 ad_libmad.c 에서 참고 해서 했어요.
이 방법이 아닌지...
어파치 한 프레임씩 decode 한다고는 하는데...
안되네요.
mad에서 어느 길이 이상이 필요 한지.
한 프레임씩 보내면 (417byte..)
int mad_header_decode(struct mad_header *header, struct mad_stream *stream){
//..생략..
//여기서 문제 생기네요. 삭제해도 문제 생기고요...
/* verify there is enough data left in buffer to decode this frame */
if (N + MAD_BUFFER_GUARD > end - stream->this_frame) {
stream->next_frame = stream->this_frame;
stream->error = MAD_ERROR_BUFLEN;
goto fail;
}
//..생략..
}
그리고 제가요... 군대에 있는데 안그래도 병이라서 한번 질문 하려면 한달 넘게 기다려야 하거든요.. ㅜㅜ 공부하기 힘드네요.
그리고 또 궁금한건데.. next frame 의미는 뭔가요?
다음 프레임이긴 한데.. 왜 next frame 필요한지...
mpeg에 대한 이해가 있어야 하는데 부족하니 잘 모르겠네요.
mplayer 같은경우는 4096씩 가지고 mad로 보내대요.
그리고 417byte가 decode 되면 4096 - 417 만큼 줄어들어서 다시
demux가 417만큼 채우고 이런 식이던데...
그리고 madplay는 0부터 끝까지 포인터를 보내서 순서대로 디코드 하던데...
생각같아서는 ffplay에서 나오는 audio data mad로 보내면 될 것 같은데.
안되네요.
제가 분석한게 맞나요?
ffplay,libmad분석하면서 공부는 많이 되네요.
지금 한달넘게 분석하고 계속 시도 했는데 안되네요. 안그래도 하루에 몇시간 컴터 못 하거든요...
그리고 지금 이걸 계속 해야하는지 말아야 하는지 고민이 들기 시작했어요.
차라리 mplayer를 사용해야 할지.
ffplay를 분석하기 시작하는 이유가 소스가 그나마 간단하긴 한데..
오디오에서 끈겨서 mad만 붙이면 괜찮겠다 생각했어요. 그리고 sdl 사용해서
계속 뭔가를 붙어봐야 겠다는 생각을 했는데....
이거 계속 해야 하나요?
mad 붙이려고 시작해서~ 공부는 많이 되었는데 붙이이도 못하고.....
뭔가 잘 못 된거 같긴 한데...
제가 작업하던거 가지고 와서 올리고 싶은데
군대 아시자나요?
갠히 걸리면 저 영창가서.... 이렇게라도 올려봅니다.
혹시 작업하시분 계시면 도움 바랍니다.
군대에서 공부하는데 쉬운게 아니네요.
인터넷 한번 하려면 한달기다려 외출나와야 하고... ㅜㅜ
pmp에서는 보통 mplayer 쓰나요?
암튼 외출나와서 글 한번 남겨 봅니다.
제가 알기론 중간에 버퍼를 하나 둬서, 그 부분에 demux쪽 데이터를
복사해서 건네주는 걸로 알고 있습니다.
ffplay는 원래 버퍼를 직접 건네주는 걸로 알고 있고요(ptr로)
물론, 자세하게 본 부분은 아니라...(넘 오래되서 기억도 가물...)
해서, 버퍼를 하나 만들고, ffplay의 pkt의 데이터 부분으로부터
libmad가 원하는 만큼 건네주면 될 듯....